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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 08.01.2012, 16:27
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию Еще раз про z-сортировку

Здравствуйте, друзья
Поздравляю всех с Новым Годом и Рождеством, удачи и здоровья, успеха в проектах и всех начинаниях

Я хочу попросить взглянуть на мою проблему с z-сортировкой
http://divisionby0.org/web_Portfolio/3DSpace/Main.html
Для того чтобы посмотреть исходники нажмите правой кнопкой по флэшке и выберите View Source

Класс построения фигуры com.div0._3D.primitives.NAnglePrimitive.as

Фигура строится по точкам
Сначала добавляется спрайт НИЗ-а, на нем рисуется линия из точек
Затем добавляется спрайт ВЕРХ-а, на нем рисуется линия из точек
В цикле добавляются спрайты граней

Если покрутить по x или по y видно что неверно сортируются грани куба
Грани куба это класс Plane, наследник Sprite-а
Для сортировки я использую такой механизм:

Нахожу точку в 3д пространстве (Vector3D) позиции смотрящего
Код AS3:
observerPos.x=root.transform.perspectiveProjection.projectionCenter.x;
observerPos.y=root.transform.perspectiveProjection.projectionCenter.y;
observerPos.z=-root.transform.perspectiveProjection.focalLength;
На каждой грани рисую кружок середины грани
Расчитываю расстояние от точки обзора до середины каждой грани
Сортирую по этому расстоянию
Сортируется не всегда правильно
вот алгоритм сортировки

Код AS3:
private function sortFaces():void 
		{
			var i:int;
			var index:int = 0;
			var distArray:Array=[];
			var curMid:Vector3D;
			var curDist:Number;
			var vo : SortVO;
			var observerPos:Vector3D=new Vector3D();
 
			observerPos.x=root.transform.perspectiveProjection.projectionCenter.x;
			observerPos.y=root.transform.perspectiveProjection.projectionCenter.y;
			observerPos.z=-root.transform.perspectiveProjection.focalLength;
			trace("\nobserver pos "+observerPos);
 
			var totalFaces:int=_faces.length;
 
			for(i=0;i<totalFaces;i++)
			{
				var currFace:Plane=(_faces[i] as Plane);
				trace("centerSprite="+currFace.centerSprite.transform.getRelativeMatrix3D(root).position.clone());
				//curMid=currFace.transform.getRelativeMatrix3D(root).position.clone();
 
				curMid=currFace.centerSprite.transform.getRelativeMatrix3D(root).position.clone();
 
				curDist=Math.sqrt(Math.pow(curMid.x-observerPos.x,2)+Math.pow(curMid.y-observerPos.y,2)+Math.pow(curMid.z-observerPos.z,2));
 
				var sortVO:SortVO=new SortVO();
				sortVO.object=currFace;
				sortVO.observerPointDistance=curDist;
				trace("face "+currFace.id+" dist "+sortVO.observerPointDistance);
				distArray.push(sortVO);
			}
			distArray.sortOn("observerPointDistance", Array.NUMERIC | Array.DESCENDING);
 
			for each(vo in distArray)
			{
				setChildIndex(vo.object, index++);
			}
		}
Где я ошибся ?
Изображения
 

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

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

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


 


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


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