Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.09.2014, 02:58
vector3d вне форума Посмотреть профиль Отправить личное сообщение для vector3d Найти все сообщения от vector3d
  № 1  
Ответить с цитированием
vector3d
[+1 02.03.11]

Регистрация: Nov 2005
Адрес: г.Воронеж
Сообщений: 139
Отправить сообщение для vector3d с помощью ICQ Отправить сообщение для vector3d с помощью Skype™
По умолчанию Сортировка персонажа

Здравствуйте.

Не могу разобраться, как сделать нормальную Z сортировку персонажа.

Сама сцена конфликтует правильно. А вот сам персонаж косячит как исправить?


Может быть с этими параметрами 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;
		}
 
	}
}


Последний раз редактировалось vector3d; 23.09.2014 в 18:23.
Старый 22.09.2014, 23:20
vector3d вне форума Посмотреть профиль Отправить личное сообщение для vector3d Найти все сообщения от vector3d
  № 2  
Ответить с цитированием
vector3d
[+1 02.03.11]

Регистрация: Nov 2005
Адрес: г.Воронеж
Сообщений: 139
Отправить сообщение для vector3d с помощью ICQ Отправить сообщение для vector3d с помощью Skype™
Проблему решил вот так:

Код AS1/AS2:
import alternativa.engine3d.core.Sorting;
 
.....
character.sorting = Sorting.DYNAMIC_BSP;
character.optimizeForDynamicBSP(10);
....

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:06.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.