ширина усеченного конуса на заданном расстоянии от ближней плоскости

Я использую CML для управления трехмерной математикой в ​​проекте интерфейса на основе OpenGL, который я создаю для работы. Мне нужно знать ширину усеченной области обзора на заданном расстоянии от точки взгляда, которая сохраняется как часть матрицы 4x4, представляющей камеру. Моя цель - расположить объекты графического интерфейса вдоль видимого края области просмотра, но на некотором расстоянии от экрана от ближайшей плоскости отсечения.

CML имеет функцию извлечения плоскостей усеченной кости, возвращая их в форме Ax + By + Cz + D = 0. Эта усеченная пирамида перпендикулярна камере, которая не обязательно совпадает с осью z перспективной проекции.

Я хотел бы извлечь координаты x и z, чтобы прикрепить графические элементы к сторонам экрана на разном расстоянии от камеры. Как лучше всего это сделать?

Спасибо!


person joshfisher    schedule 10.04.2010    source источник


Ответы (1)


Кажется, это дубликат Определение длины стороны поперечного сечения усеченной пирамиды / усеченной пирамиды, если у вас уже есть поперечное сечение известной ширины на известном расстоянии от вершины. Если у вас его нет и вы хотите получить ответ самостоятельно, выполните следующие действия.

  1. Возьмите две соседние плоскости и найдите линию их пересечения L1. Вы можете выполнить шаги здесь. На самом деле вам нужен вектор направления линии.
  2. Возьмите еще две плоскости, такую ​​же, как на предыдущем шаге, и найдите их линию пересечения L2.
  3. Обратите внимание, что все плоскости вида Ax + By + Cz + D = 0 проходят через начало координат, поэтому вы знаете, что L1 и L2 пересекаются.
  4. Нарисуйте себе изображение векторов направления для L1 и L2, хвосты в начале координат. Они образуют угол; назовите это тета. Найдите тета, используя формулу для угла между двумя векторами, например здесь.
  5. Нарисуйте биссектрису этого угла. Нарисуйте перпендикуляр к биссектрисе на расстоянии d, которое вы хотите от начала координат (это создает равнобедренный треугольник, разделенный пополам на два равных прямоугольных треугольника). Длина перпендикуляра - это желаемая ширина усеченной вершины w. Обратите внимание, что w вдвое больше длины одного из оснований прямоугольных треугольников.
  6. Пусть r - длина гипотенуз прямоугольных треугольников. Тогда r cos (theta / 2) = d и r sin (theta / 2) = w / 2, поэтому tan (theta / 2) = (w / 2) / d, что означает w = 2d. * загар (тета / 2). Поскольку вы знаете d и theta, все готово.

Обратите внимание, что мы нашли длину одной стороны поперечного сечения усеченного конуса. Это будет работать с любым перпендикулярным поперечным сечением любого усеченного конуса. Его можно расширить для адаптации к неперпендикулярному поперечному сечению.

person Glenn    schedule 10.04.2010
comment
Я думаю, что этот пост был немного другим, поскольку он ввел все размеры усеченного конуса, в то время как у меня есть только параметрическая форма. Я могу получить размеры ближней плоскости, потому что значения D слева, справа, сверху и снизу указаны на ней, но я не знал, как получить другое поперечное сечение. Я думаю, что основная проблема в том, что я действительно не понимаю, что мне делать с этой параметрической формой. Но я точно знаю угол обзора и расстояние до камеры, так что все, что мне действительно нужно, было шесть. - person joshfisher; 10.04.2010