Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нормали, полигоны и FOV (http://www.flasher.ru/forum/showthread.php?t=126000)

gloomyBrain 07.06.2009 17:21

Нормали, полигоны и FOV
 
http://game4b.narod.ru/normals.JPG
Вот, собственно, и вопрос =)
Если считать, что полигон виден, если его нормаль направлена в сторону камеры - все вроде бы понятно... НО!
с учетом FOV получается, что полигон (3) должен быть виден и при определенной сонаправленности нормалей камеры и полигона
Вопрос: как задать условие отображения полигона???

ЗЫ
делал так - брал камеру, создавал ее матрицу, получал обратную и ее (обратную) применял ко всем точкам полигонов. После этого высчитывал нормали полигонов
Далее с помощью Matrix3D.deltaTransformVector() проецировал нормаль на плоскость экрана.
когда камера направлена точно на центр полигона - все как надо, но если полигон находится в крайней части экрана - ... незнаю что и делать
заранее спасибо

ЗЗЫ
это не про papervision3D, я свой движок пытаюсь писать =))

alekslitvinenk 07.06.2009 17:37

Полигон 3 у Вас не должен быть виден, его нормаль направлена в другое полупространство.

gloomyBrain 07.06.2009 18:27

ну ок, если бы он был повернут чуть меньше - факт в том, что его нормаль направлена В ОДНУ сторону с нормалью камеры, НО он должен быть виден по смыслу
http://game4b.narod.ru/normals2.JPG

alekslitvinenk 07.06.2009 19:15

зачем вам делать периферийное искажение ?
не усложняте так все себе...

gloomyBrain 07.06.2009 19:20

Я готов выслушать правильный способ =)
как сделать перспективное искажение, не сталкиваясь с подобной проблемой теста на отображение полигона???

alekslitvinenk 07.06.2009 19:52

Очень просто: если нормаль полигона направлена в то полупространство где находиться камера, то показываем полигон, если в проивоположную - не показываем.
Плоскость которя разделяет пространство на два полупространства для конкретного полигона проходит через его центр и расположена параллельно экрану.
Для оптических приборов(моделирование поведения камеры) FOV только ограничивает выводимую область сцены (чем дальше объект от камеры тем тем большая часть объекта будет видна).

Stargazer 07.06.2009 22:04

Мне тоже интересен этот вопрос, потому что благодаря нему я понял, почему у меня в самописном 3д иногда промелькивали ненужные плоскости.
Есть ли простой способ определить видимость? Или, действительно, нужно вычислять в 2 этапа?

silin 07.06.2009 22:18

а такой способ не проходит ?
я не совсем в теме, но если правильно понял там берeтся локальный треугольник и потому в какую сторону он 'закручен' в глобальных координатах делается вывод видна ли плоскость, выглядит просто и надежно
вот еще пост с комментами по нему

MonkDead 08.06.2009 01:45

Что надо сделать:
1) Рассчитать угол обзора по отношению к области вывода
Код AS3:

var halfWidth:Number = viewPort.width / 2;
var halfHeight:Number = viewPort.height / 2;
var focalLength:Number - фокальный радиус(расстояние);
var angle:Number = focalLength / Math.sqrt(halfWidth * halfWidth + halfHeight * halfHeight + focalLength * focalLength);

2) Сравнить нормаль камеры с нормалью полигона, скалярным произведением и сравнить с углом области вывода;
Код AS3:

if(dots(нормаль камеры и полигона) < angle)
{
    // Полигон виден.
}
else
{
    // Полигон не виден.
}

Вот и все, дальше оптимизируйте как вам надо и все будет нормально.

Цитата:

я не совсем в теме, но если правильно понял там берeтся локальный треугольник и потому в какую сторону он 'закручен' в глобальных координатах делается вывод видна ли плоскость, выглядит просто и надежно
Самый медленный метод, много расчетов и самое главное много доступов к данным.

Есть еще один способ, если у вас нет понятия viewPort(области вывода).
1) Повернуть нормаль полигона на FOV/2 к камере.
2) Сравнить нормали скалярным произведением, если больше 0 значит видим полигон.

Alex Lexcuk 08.06.2009 02:11

Чето-то ребятки вы перекручиваете... Проблема надуманная. Если полигон невидим, а вы подумайте как надо умудриться его поставить что-бы он стал невидим, и сразу станет ясно, что рассчет такой ситации - только лишняя нагрузка на медлительный flash процессор и быстрее будет визуализировать невидимы полигон, тем более что флеш тормозит в основном сильнее всего на отрисовке, а отрисовать невидимый полигон ему будет только в радость как быстро.


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

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