косая проекция opengl - PullRequest
6 голосов
/ 23 мая 2011

Я хочу создать наклонную (кавалерийскую) проекцию в OpenGL. Я знаю, что эта операция не поддерживается по умолчанию, и вместо этого мне нужна матрица сдвига, а затем сделать ортогональную проекцию.

Можете ли вы сказать мне, какие шаги / функции OpenGl мне нужно сделать?

Ответы [ 3 ]

13 голосов
/ 23 мая 2011

Я не использовал косую / кавалерную проекцию ранее, но следующее должно дать вам представление о том, как действовать:

Создание матрицы сдвига 4x4,

H(θ, Φ) = | 1, 0, -cot(θ), 0 |
          | 0, 1, -cot(Φ), 0 |
          | 0, 0,    1,    0 |
          | 0, 0,    0,    1 |

θ - сдвиг в X, Φ - сдвиг в Y, а Z - один.

( ссылка: слайд 11 из http://www.cs.unm.edu/~angel/CS433/LECTURES/CS433_17.pdf)

Умножьте это на вашу ортографическую проекцию,

| 2/(r-l),     0,       0,    -(r+l)/(r-l) |
|    0,    2/(t-b),     0,    -(t+b)/(t-b) |
|    0,        0,    2/(f-n), -(f+n)/(f-n) |
|    0,        0,       0,          1      |

(описывается слева, справа, снизу, сверху, близко и далеко)

(ref: http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29)

Затем OpenGL позволяет загружать эту матрицу напрямую (в виде массива из 16 чисел с плавающей запятой) с помощью функции glLoadMatrixf () :

GLfloat proj[16] = { ... };
glMatrixMode(GL_PROJECTION);  // Make sure we're modifying the *projection* matrix
glLoadMatrixf(proj);          // Load the projection

Для более глубокого изучения того, как в OpenGL работают просмотры и преобразования, я отсылаю вас к главе 3 «Красной книги» OpenGL . Там они используют glOrtho () , чтобы создать и применить ортографическую проекцию.

Edit:

Как указывает datenwolf, имейте в виду, что элементы матрицы в OpenGL указаны в главном порядке столбцов.

6 голосов
/ 23 мая 2011

OpenGL позволяет указывать произвольные матрицы проекций. Создайте нужную матрицу проекции самостоятельно, чтобы отобразить входящие вершины в диапазоне от -1 до 1 в каждом измерении, а затем загрузить ее, используя

GLfloat custrom_projection[16] = {
     ...
};
glMatrixMode(GL_PROJECTION);
glLoadMatrix(custom_projection);

OpenGL индексирует элементы матрицы в мажорном порядке, т. Е.

0   4   8   12
1   5   9   13
2   6  10   14
3   7  11   15
0 голосов
/ 03 июня 2015

Так как так называемая наклонная проекция получается поворотом проекционной плоскости на некоторый угол от правого, что дает только удлиненное изображение вдоль оси вращения, я думаю, что достаточно просто масштабировать нормальную ортогональную проекциювдоль этой оси в \csc\theta.Это утверждение может быть доказано с помощью тригонометрических равенств, например, \sin\theta+\cos\theta \cot\theta=\csc\theta.Если ваша наклонная проекция задается \theta и \phi, как в ответе Люка, угол оси можно рассчитать как упражнение по тригонометрии на основе этих двух углов, скажем, \arctan(\tan\theta\sqrt(1+\cot^2\phi)).

...