我想在OpenGL中创建一个倾斜(骑士)投影。我知道这个操作不是默认支持的,而是我需要剪切矩阵,然后进行正交投影。
你能告诉我我必须做的OpenGl步骤/功能是什么吗?
答案 0 :(得分:13)
我之前没有使用过倾斜/骑士投影,但以下内容可以让您了解如何继续:
创建一个4x4剪切矩阵,
H(θ, Φ) = | 1, 0, -cot(θ), 0 |
| 0, 1, -cot(Φ), 0 |
| 0, 0, 1, 0 |
| 0, 0, 0, 1 |
θ是X中的剪切,Φ是Y中的剪切,Z是单独的。
(ref: slide 11 of 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 |
(由左,右,底,顶,近,远描述)
(参考:http://en.wikipedia.org/wiki/Orthographic_projection_%28geometry%29)
OpenGL然后允许您通过函数glLoadMatrixf()直接上传此矩阵(作为16个浮点数的数组):
GLfloat proj[16] = { ... };
glMatrixMode(GL_PROJECTION); // Make sure we're modifying the *projection* matrix
glLoadMatrixf(proj); // Load the projection
为了更深入地了解查看和转换在OpenGL中的工作方式,我将向您推荐Chapter 3 of the OpenGL "Red Book"。在那里,他们使用glOrtho()来创建和应用正交投影。
编辑:
正如datenwolf指出的那样,请记住OpenGL中的矩阵元素是按列主要顺序指定的。
答案 1 :(得分:6)
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
答案 2 :(得分:0)
由于所谓的倾斜投影是通过将投影平面旋转一定角度远离右投影平面而获得的,这只能产生沿旋转轴延长的图像,我认为仅仅缩放正常的正交投影就足够了沿着该轴,系数为\csc\theta
。这种说法可以通过三角函数等式来证明,例如\sin\theta+\cos\theta \cot\theta=\csc\theta
。如果倾斜投影由\theta
和\phi
指定,就像在卢克的答案中那样,可以将轴角度计算为基于这两个角度的三角运动,例如\arctan(\tan\theta\sqrt(1+\cot^2\phi))
。