Calculus плоскости FRUSTUM

Я пишу простым 3D-двигателем JavaScript с нуля с помощью холста и коробки, как примитивы (à la minecraft) для него. Я реализую как можно больше оптимизаций, так как я могу и до сих пор у меня вернулся лицом к дебранию и скрытой окклюзии лица, но я не могу понять, как сделать Frustum отбрасывает оптимальный путь.

Я пробовал 2D Canding, но у этого есть одна конкретная проблема, которую я не могу решить: если одна вершина плоскости 4 точек идет за камерой, она все еще нарисована, но полностью искажена (координаты x и y перевернуты Я думаю) - см. Изображение.

Я начинаю думать, что это не имеет реального решения, не используя гораздо более сложные математические и рендеринговые последовательности.

At first everything's ok

enter image description here

Я пытался ограничить координаты вершин X и Y внутри экрана 2D, если по меньшей мере, один из 4 вершин все еще находится внутри экрана (см. Ниже), но это полностью искажает квадратное лицо (хотя я думаю Я могу пойти с более причудливыми математическими и дополнительными треугольниками).

enter image description here

У меня есть какой-то опыт работы в OpenGL, и он оказывает совершенно по-разному, так что это даже не проблема.

У меня есть какие-либо шансы исправить его, не тянув мои волосы?


Решение

Конечное решение было тестировать каждый из 8 вершин против ближней плоскости от отсечения в 3D до Проекция, а затем обрезание экрана.

Это второй этап отсечения, первый - проверить, если коробка полностью за плоскостью отсечения с использованием ограничивающей сферы радиуса SQRT (3/2) * BOXSIDLENGLENGH .

Дополнительные треугольники (фактически точки в этом случае) было слишком сложным, а математика, это решение не идеально, но довольно красиво.

6
задан sam hocevar 6 December 2011 в 14:19
поделиться