Здравствуйте.
Сама сцена конфликтует правильно. А вот сам персонаж косячит как исправить?
Может быть с этими параметрами ConflictContainer, DistanceSortContainer, BSPContainer, KDContainer.
Код AS3:
package {
import alternativa.engine3d.animation.AnimationClip;
import alternativa.engine3d.animation.AnimationController;
import alternativa.engine3d.animation.AnimationSwitcher;
import alternativa.engine3d.containers.ConflictContainer;
import alternativa.engine3d.controllers.SimpleObjectController;
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.EllipsoidCollider;
import alternativa.engine3d.core.MouseEvent3D;
import alternativa.engine3d.core.Object3D;
import alternativa.engine3d.core.RayIntersectionData;
import alternativa.engine3d.core.View;
import alternativa.engine3d.loaders.ParserCollada;
import alternativa.engine3d.materials.FillMaterial;
import alternativa.engine3d.materials.TextureMaterial;
import alternativa.engine3d.objects.BSP;
import alternativa.engine3d.objects.Mesh;
import alternativa.engine3d.objects.Skin;
import alternativa.engine3d.resources.Geometry;
import alternativa.engine3d.primitives.GeoSphere;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.geom.Vector3D;
import flash.utils.getTimer;
import alternativa.engine3d.utils.Object3DUtils;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.containers.ConflictContainer;
import alternativa.engine3d.containers.DistanceSortContainer;
import alternativa.engine3d.containers.BSPContainer;
import alternativa.engine3d.containers.KDContainer;
import deng.fzip.FZip;
import deng.fzip.FZipFile;
/**
* Alternativa3D complete demo.
* Пример создания демо сцены.
*/
public class DemoExample2 extends Sprite {
[Embed("level.DAE", mimeType="application/octet-stream")] static private const LevelModel:Class;
[Embed(source="level.jpg")] static private const LevelTexture:Class;
[Embed("character.DAE", mimeType="application/octet-stream")] static private const CharacterModel:Class;
[Embed(source="wb_infernos-27.jpg")] static private const CharacterTexture:Class;
private var scene:KDContainer = new KDContainer();
private var camera:Camera3D;
private var controller:SimpleObjectController;
private var level:BSP;
private var character:Skin;
//private var Bip01:Skin;
private var bspContainer:ConflictContainer;
private var animationController:AnimationController = new AnimationController();
private var animationSwitcher:AnimationSwitcher = new AnimationSwitcher();
private var idle:AnimationClip;
private var run:AnimationClip;
private var target:Vector3D;
private var sphere:GeoSphere = new GeoSphere(10, 3, false, new FillMaterial(0xFFFF00, 0.85));
private var collider:EllipsoidCollider = new EllipsoidCollider(50, 50, 90);
private var gravity:Number = 9800;
private var fallSpeed:Number = 0;
private var lastTime:int;
private var timeScale:Number = 0.7;
//private var rootContainer:Object3DContainer = new KDContainer();
private var container:DistanceSortContainer;
public function DemoExample2() {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
// Camera and view
// Создание камеры и вьюпорта
camera = new Camera3D();
camera.view = new View(stage.stageWidth, stage.stageHeight);
camera.visible=true;
addChild(camera.view);
//addChild(camera.diagram);
//rootContainer.addChild(camera);
/* container = new DistanceSortContainer();
camera = new Camera3D();
container.addChild(camera);
view = new View(800, 600);
camera.view = view;
addChild(view);*/
camera.view.hideLogo();
// Initial position
// Установка начального положения камеры
camera.rotationX = -120*Math.PI/180;
camera.y = -500;
camera.z = 250;
controller = new SimpleObjectController(stage, camera, 500, 2);
scene.addChild(camera);
sphere.mouseEnabled = false;
scene.addChild(sphere);
// Parser of level
// Парсер уровня
var levelParser:ParserCollada = new ParserCollada();
levelParser.parse(XML(new LevelModel()));
var mesh:Mesh = levelParser.getObjectByName("level") as Mesh;
mesh.weldVertices(0.01, 0.001);
mesh.weldFaces(0.001, 0.001);
level = new BSP();
level.createTree(mesh, true);
var levelMaterial:TextureMaterial = new TextureMaterial(new LevelTexture().bitmapData);
level.setMaterialToAllFaces(levelMaterial);
scene.addChild(level);
// Adding double click listener
// Подписка уровня на двойной клик
level.useHandCursor = true;
level.doubleClickEnabled = true;
level.addEventListener(MouseEvent3D.DOUBLE_CLICK, onDoubleClick);
//level.addEventListener(MouseEvent3D.CLICK, onDoubleClick);
// Parser of character
//bspContainer = new ConflictContainer();
// Парсер персонажа
var characterParser:ParserCollada = new ParserCollada();
characterParser.parse(XML(new CharacterModel()));
character = characterParser.getObjectByName("character") as Skin;
var characterMaterial:TextureMaterial = new TextureMaterial(new CharacterTexture().bitmapData);
character.setMaterialToAllFaces(characterMaterial);
character.scaleX=40;
character.scaleY=40;
character.scaleZ=40;
character.rotationY=-90*Math.PI/180;
character.rotationX=+170*Math.PI/180;
character.rotationZ=+90*Math.PI/180;
character.y+=55;
//scene.addChild(Bip01);
//bspContainer.addChild(character);
// scene.addChild(bspContainer);
scene.addChild(character);
character.mouseEnabled = false;
// Character animation
// Анимация персонажа
var animation:AnimationClip = characterParser.getAnimationByObject(character);
// Slice of animation
// Разбиение анимации
idle = animation.slice(1025/30, 1222/30);//(0, 40/30)
run = animation.slice(61/30, 90/30);//(41/30, 61/30)//(61/30, 90/30)
//animation.
// Adding
// Добавление анимаций
animationSwitcher.addAnimation(idle);
animationSwitcher.addAnimation(run);
// Running
// Запуск анимации
animationSwitcher.activate(idle, 0.1);
animationSwitcher.speed = timeScale;
animationController.root = animationSwitcher;
// Listeners
// Подписка на события
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
stage.addEventListener(Event.RESIZE, onResize);
lastTime = getTimer();
}
private function onDoubleClick(e:MouseEvent3D):void {
var data:RayIntersectionData = (e.target as Object3D).intersectRay(e.localOrigin, e.localDirection);
if (data != null) {
target = data.point;
}
}
private function onEnterFrame(e:Event):void {
// Time of frame
// Время кадра
var time:int = getTimer();
var deltaTime:Number = timeScale*(time - lastTime)/1000;
lastTime = time;
var displacement:Vector3D = new Vector3D();
if (target != null) {
// Sphere moving
// Перемещение сферы
sphere.x += (target.x - sphere.x)*0.1;
sphere.y += (target.y - sphere.y)*0.1;
sphere.z += (target.z - sphere.z)*0.1;
// Direction of character
// Расчёт направления движения персонажа
displacement.x = target.x - character.x;
displacement.y = target.y - character.y;
if (displacement.length > 15) {
character.rotationZ = Math.atan2(displacement.x, -displacement.y);
displacement.scaleBy(deltaTime*600/displacement.length);
animationSwitcher.activate(run, 0.1);
} else {
target = null;
animationSwitcher.activate(idle, 0.1);
}
}
// Fall speed
// Скорость падения
fallSpeed -= 0.5*gravity*deltaTime*deltaTime;
var characterCoords:Vector3D = new Vector3D(character.x, character.y, character.z + 55);
// Checking of surface under character
// Проверка поверхности под персонажем
var collisionPoint:Vector3D = new Vector3D();
var collisionPlane:Vector3D = new Vector3D();
var onGround:Boolean = collider.getCollision(characterCoords, new Vector3D(0, 0, fallSpeed), collisionPoint, collisionPlane, level);
if (onGround && collisionPlane.z > 0.5) {
fallSpeed = 0;
} else {
displacement.z = fallSpeed;
}
// Collision detection
// Проверка препятствий
var destination:Vector3D = collider.calculateDestination(characterCoords, displacement, level);
character.x = destination.x;
character.y = destination.y;
character.z = destination.z - 55;
animationController.update();
controller.update();
camera.render()
}
private function onResize(e:Event = null):void {
// Width and height of view
// Установка ширины и высоты вьюпорта
camera.view.width = stage.stageWidth;
camera.view.height = stage.stageHeight;
}
}
}