ширина усеченного конуса на заданном расстоянии от ближней плоскости - PullRequest
3 голосов
/ 10 апреля 2010

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

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

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

Спасибо!

1 Ответ

2 голосов
/ 10 апреля 2010

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

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

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

...