Форум 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++);
			}
		}
Где я ошибся ?
Изображения
 

Старый 08.01.2012, 17:07
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Вообще простая сортировка по одной из выбранных точек грани _не_ должна работать в общем случае.
На счёт кубика не уверен.
Попробуйте поискать отличия вашего и этого творения:
http://www.silin.su/#AS3/zod/simple/bin

Старый 08.01.2012, 19:42
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 3  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не уверен, но возможно ошибка в определении координат центра грани в руте
Код AS3:
curMid = currFace.centerSprite.transform.getRelativeMatrix3D(root).position.clone();
попробуй вот так
Код AS3:
curMid = Utils3D.projectVector(currFace.centerSprite.transform.getRelativeMatrix3D(root), new Vector3D());

Старый 08.01.2012, 20:41
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 4  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Спасибо за ответы
К сожалению, Utils3D не меняет ничего, также ошибается алгоритм

Старый 08.01.2012, 21:02
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вот не могу ничего вменяемого сказать, не разобрался с этим до конца, сори
только transform.getRelativeMatrix3D(root).position это совсем не координаты в системе рута, которые здесь нужны (проверяется самыми простыми тестами)
вот такой еще вариант у меня еще 'правильно показывал', в моей схеме он так остался как последний
Код AS3:
var mtrx:Matrix3D = root.transform.getRelativeMatrix3D(obj);
mtrx.invert();
curMid = mtrx.position;
но почему неверно обратное (obj.transform.getRelativeMatrix3D(root) ) опять же не могу сказать..

PS. тема такого 3D и изначально не очень-то цвела, а теперь и совсем никчемушной выглядит, не ?

Старый 08.01.2012, 21:16
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 6  
Ответить с цитированием
djyamato
 
Аватар для djyamato

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

Цитата:
Сообщение от silin Посмотреть сообщение
PS. тема такого 3D и изначально не очень-то цвела, а теперь и совсем никчемушной выглядит, не ?
У меня нет выхода - данные приходят именно под такую отрисовку объектов в 3д мире

Старый 09.01.2012, 01:07
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
А вообще, куб - этож выпуклая фигура. Выставляем граням, у которых обход против часовой стрелки на экране получается visible=false и все. Правда для полупрозрачных граней работать не будет.

Старый 09.01.2012, 04:35
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 8  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Ну, это может быть и не куб вовсе, я могу передать хоть 10 точек
нижняя и верхняя грани отрисуются по этим точкам + в цикле добавятся "боковые" грани
+ мне обязательно нужн учесть полупрозрачность

Друзья, а кто-нибудь работал с BPS деревьями ?

Старый 09.01.2012, 05:22
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Цитата:
Сообщение от djyamato Посмотреть сообщение
Друзья, а кто-нибудь работал с BPS деревьями?
Только они BSP-деревья.
__________________
Поймай яблоко 2!

Старый 09.01.2012, 14:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Больше всех с ними, кажется, Alternativa работала
Я делал некоторые эксперименты с BSP, если потребуется, могу накидать сюда исходников (но это эксперименты, на практических применениях не реализованные)

Но если есть движущиеся части, то BSP не поможет (помешают низкая производительность и артефакты разрезки полигонов).

P.S. Скачал куб silin'a, пытался его растянуть, придать ориентацию как на вашем скриншоте - не похоже, чтобы лажало, если лаги и есть - то в 1,5 пикселя отсилы. Но Вы говорите, вам не только куб нужен.


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

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

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


 


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


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