我正在尝试使用 OpenGL 对场景进行离轴投影,我阅读了Robert Kooima 的离轴投影的文档,现在对实际需要做的事情有了更好的了解,但仍有一些部分我在这里觉得很棘手。我知道OpenGL的离轴投影代码如下:
代码 1:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(fNear*(-fFov * ratio + headX),
fNear*(fFov * ratio + headX),
fNear*(-fFov + headY),
fNear*(fFov + headY),
fNear, fFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
glTranslatef(0.0,0.0,headZ);
如果这是用户在屏幕中心的正常透视投影,我理解它是相当容易理解的。
Screen
|
| h = H/2
|
x----- n -----------
|
| h = H/2
|
当用户在 x 处且与屏幕的距离为 n 时,glFrustum的顶部、底部坐标将计算为:(假设 theta 是我认为假设为30 度的视场(fov))
h = n * tan (theta/2);
tanValue = DEG_TO_RAD * theta/2;
[EDIT Line additon here>>]: fFov = tan(tanValue);
h = n * tan (tanValue);
因此,顶部和底部(否定顶部的值)都是为glFrustum参数获得的。左边的现在是左/右。
Now, Aspect Ratio, r = ofGetWidth()/ofGetHeight();
Right = n * (fFov * r); , where r is the aspect ratio [Edit1>> Was written tanValue*r earlier here]
问题1) 上面的 (tanValue*r) 是否获得水平 fov 角度,然后应用相同的角度获得左/右值?
双 msX = (double)ofGetMouseX();
双 msY = (double)ofGetMouseY();
双 scrWidth = (double)ofGetWidth();
双 scrHeight = (double)ofGetHeight();
headX = (msX / scrWidth) - 0.5;
headY = ((scrHeight - msY)/scrHeight) - 0.5;
头Z = -2.0;
现在,考虑离轴投影,我们计算了headX和headY位置(这里使用鼠标而不是实际用户的头部):
问题2) headX 和 y 是如何计算的,从上面减去 -0.5 有什么用?我观察到它使 x 值变为(-0.5 到 0.5),y 值变为(0.5 到 -0.5),msX 和 msY 变化。
问题3)在上面的代码(代码 1)中,headY 是如何添加到计算的 tan(fov/2) 值中的?
-fFov + headY
fFov + headY
这个价值为我们提供了什么?-fFov 是计算出的 theta/2 的棕褐色,但是如何直接将 headY 添加到?
-fFov * ratio + headX
-fFov * ratio + headX
abvoe 是如何给我们一个 vlaue 的,我们乘以 n (近值)给我们左右的不对称 glFrustum 调用离轴投影?
问题4)我知道必须为 View Point 执行 glLookAt 以将截锥体的顶点移动到用户眼睛所在的位置(在这种情况下是鼠标所在的位置)。注意上面代码中的行:
gluLookAt(headX*headZ, headY*headZ, 0, headX*headZ, headY*headZ, -1, 0, 1, 0);
如何headX*headZ
给我眼睛headY*headZ
的 xPosition,给我可以在gluLookAt()
这里使用的眼睛的 yPosition?
编辑:此处添加了完整的问题描述:pastebin.com/BiSHXspb