Форум 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)

MonkDead 08.06.2009 02:28

Цитата:

Чето-то ребятки вы перекручиваете... Проблема надуманная. Если полигон невидим, а вы подумайте как надо умудриться его поставить что-бы он стал невидим, и сразу станет ясно, что рассчет такой ситации - только лишняя нагрузка на медлительный flash процессор и быстрее будет визуализировать невидимы полигон, тем более что флеш тормозит в основном сильнее всего на отрисовке, а отрисовать невидимый полигон ему будет только в радость как быстро.
1) Alex Lexcuk Вы знаете что такое конвейерная обработка и зачем она нужна?
А нужна она для того что бы на каждом этапе избавляться от ненужной информации и данных. После проверки полигона на видимость могут быть еще куча алгоритмов (динамические деревья, обрезка полигонов, просчет света и теней и т.д.). И как вы понимаете все эти алгоритмы применять к полигону который не видим вот это трата ресурсов :)
2)
Цитата:

быстрее будет визуализировать невидимы полигон
Хех, а вы думаете flash сам по себе не будет рисовать полигон повернутый спиной к наблюдателю? Это не так он нарисует этот полигоны с инвертированной текстурой :)

Alex Lexcuk 08.06.2009 02:54

>>После проверки полигона на видимость могут быть еще куча алгоритмов (динамические деревья, обрезка полигонов, просчет света и теней и т.д.). И как вы понимаете все эти алгоритмы применять к полигону который не видим вот это трата ресурсов

Ох простите...простите я ж и забыл, что у всех теперь четырех ядерные процессоры и мы теперь любим все делать с тенями и структурами, у одного меня на компе тормозят все демыки альтернативы и загрузка проца 99% и невозможно работать. Проще надо быть и резче и нафик эти тени остановимся на видимости.
А свет невидимого полигона такой-же невидимый как и сам невидимый полигон и если тень от него будет невидимая пользователь не будет введен в заблуждение.

MonkDead 08.06.2009 03:28

Alex Lexcuk, я как пример привел тени никто не говорит что их делать надо. Я сказал алгоритмы и привел примеры. А если вы не варитесь в этой кухне не надо пытаться пять копеек вставить :)
У вас все так просто, что и делать ничего не надо все само правильно отрисуеться и проверится магическим образом.
Цитата:

А свет невидимого полигона такой-же невидимый как и сам невидимый полигон и если тень от него будет невидимая пользователь не будет введен в заблуждение.
А вы думаете проверить это не надо, рассчитать данные, что бы узнать что полигон не участвует в алгоритме. Вы читаете вообще что вы пишете? Вы пытаетесь донести, что если полигон не видим то и тень(свет) от него будет не видна. Мда, вы не живете в реальном мире или вы как маленькие дети, прикрыли руками глазки и думают что их не видно :)?

Вы ни в одном посте не дали алгоритм :), а лишь разглагольствовать на философские темы.

В общем вы меня извините, но когда вы будете понимать основные принципы даже не 3D, а хотя бы как устроен мир - продолжим дискуссию.

GentleFLASH 08.06.2009 05:24

Ребята, вы тут как то странно определяете виден полигон или нет, с незапамятных времен и даже на аппаратном уровне реализовано так: вначале растеризуются точки треугольника из 3Д в 2Д, затем обходим растеризованные точки по порядку: если получается обходить по часовой стрелке, то полигон виден, если нет, то соответственно не виден, ну или все наоборот, зависит от того в какую сторону нормали у объекта смотрят, смысл то такой. И там хоть какой FOV будет, хоть самый самый нестандартный - это всегда работало и работать будет.

Если надо то вот пример (выдернул из пары классов):

Код AS3:

// в классе Vertex.as
// класс Vertex имеет 3Д точку World и преобразовывает ее в 2Д, т.е Raster
// WIDTH и HEIGHT размер проекции, RATIO это пропорция проецируемого
function Rasterize(FOV:Number, WIDTH:Number, HEIGHT:Number, RATIO:Number):void
{
        Raster.x =        WIDTH * (RATIO * 0.5 + FOV * World.x / World.z) / RATIO;
        Raster.y = HEIGHT * (                0.5 - FOV * World.y / World.z);
}
 
 
// а это отрисовка в классе Face.as
// V0 V1 V2 - вершины треугольника (полигона)
// CullModes.CW - по часовой
// CullModes.CCW - против часовой
// drawable - виден или невиден
 
cullMode = device.RenderState.CullMode;
drawable = false;
 
if(cullMode == device.RenderState.CullModes.NONE)
        drawable = true;
else if( cullMode == device.RenderState.CullModes.CW && ( (V2.Raster.x - V0.Raster.x) * (V0.Raster.y - V1.Raster.y) - (V0.Raster.x - V1.Raster.x) * (V2.Raster.y - V0.Raster.y) ) > 0 )
        drawable = true;
else if( cullMode == device.RenderState.CullModes.CCW && ( (V2.Raster.x - V0.Raster.x) * (V0.Raster.y - V1.Raster.y) - (V0.Raster.x - V1.Raster.x) * (V2.Raster.y - V0.Raster.y) ) <= 0 )
        drawable = true;

Думаю вопросов больше не будет.

Alex Lexcuk 08.06.2009 10:18

>>Вы ни в одном посте не дали алгоритм , а лишь разглагольствовать на философские темы.

Правильно не дал, потому как считаю что определять видимость полигона - только лишняя нагрузка на процессор.

Ежели хотите заценить мои алгоритмы трехмерного флеша
http://www.murmadillo.tut.su/
там же и исходники, пара классов и ничего более.

MonkDead 08.06.2009 11:59

GentleFLASH, да алгоритм существует с незапамятных времен и он работает.
Но посмотрите сколько в нем расчетов, а главное сколько доступов к данным и сколько проверок.

GentleFLASH 08.06.2009 16:20

MonkDead, ну если присмотреться, то не так уж и много - все равно же придется преобразовывать вершины из 3Д в 2Д - т.е. половина кода исчезает, а вторая часть про видимость / невидимось, можно вообще все условия убрать и принять заранее - либо по часовой, либо против и тогда останется всего на всего:

(x2 - x0) * (y0 - y1) - (x0 - x1) * (y2 - y0) ) > 0 (в 2д пространстве разумеется)

неужели это оч. много расчетов?
А чем собственно лучше вычислять нормали к полигону, потом строить dot и crossProduct? причем в результате появлятся баги, при которых полигон может стать невидим в то время как он на самом деле видим? чем это лучше?

Stargazer 08.06.2009 16:32

Цитата:

ну если присмотреться, то не так уж и много - все равно же придется преобразовывать вершины из 3Д в 2Д - т.е. половина кода исчезает
Зачем преобразовывать в 2д то, чего не будет видно? :)

GentleFLASH 08.06.2009 16:45

Цитата:

Зачем преобразовывать в 2д то, чего не будет видно?
Что интересно быстрее: преобразовать точки в 2д и проверить на видимость или супер-изощренными методами вычислять в 3Д "а стоит ли мне это преобразовывать в 2д?", где расчетов интересно меньше?
И потом одна вершина может принадлежать далеко не одному полигону (например в конусе макушка - сколько там треугольников в ней соединяется, растеризовали одну, а коснулось всех прилегающих треугольников), а вот нормаль можно построить только к одному единственному, вот и вывод, что целесообразнее вначале все вершины растеризовать, а уже потом обходить каждый треугольник по растеризованным вершинам и делать проверку его на видимость.

Stargazer 08.06.2009 17:00

Согласен (в целом).

И, всё-таки, утверждение
Цитата:

все равно же придется преобразовывать вершины из 3Д в 2Д - т.е. половина кода исчезает
некорректно.

С утверждением MonkDead о том, что слишком много элементов архитектуры задействовано одновременно - тоже согласен.


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

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