我正在尝试使用OpenGL进行场景的非轴投影,我阅读了Robert Kooima的非轴投影文档,并且现在对实际需要完成的工作有了更好的了解,但是这里仍然有一些我觉得棘手的部分。我知道OpenGL的非轴投影代码如下所示:
如果这是一个以用户为屏幕中心的普通透视投影方式,那么我可以理解。
当用户在x位置,距离屏幕为n时,glFrustum的顶部和底部坐标将被计算为:(假设theta是视场角(fov),我假设它被认为是30度)
因此,glFrustum参数中得到了顶部和底部(否定了顶部的值)。左侧目前是左/右。
问题1:以上的(tanValue*r)是获取水平视野角度,然后应用相同的角度来获取左/右数值吗?
问题2:计算headX和headY的方法是什么?为什么要从以上减去-0.5?我观察到它将x值带到(-0.5到0.5),将y值带到(0.5到-0.5),而msX和msY变化。
问题3:在上述代码(Code 1)中,如何将headY添加到计算出的tan(fov/2)值中?
这个值能为我们提供什么?-fFov是theta/2的计算tan值,但头部Y值该如何直接添加?
以上如何给我们提供一个价值,当乘以n(近值)时,为非对称glFrustum调用的左右投影提供值?
问题4)我理解glLookAt必须用于视点,将视锥的顶点移动到用户眼睛所在的位置(在这种情况下是鼠标所在的位置)。请注意上面代码中的行:
gluLookAt(headX * headZ,headY * headZ,0,headX * headZ,headY * headZ,-1,0,1,0);
编辑:完整的问题描述在此处添加:pastebin.com/BiSHXspb
代码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是视场角(fov),我假设它被认为是30度)
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)是获取水平视野角度,然后应用相同的角度来获取左/右数值吗?
问题2:计算headX和headY的方法是什么?为什么要从以上减去-0.5?我观察到它将x值带到(-0.5到0.5),将y值带到(0.5到-0.5),而msX和msY变化。
问题3:在上述代码(Code 1)中,如何将headY添加到计算出的tan(fov/2)值中?
-fFov + headY
fFov + headY
这个值能为我们提供什么?-fFov是theta/2的计算tan值,但头部Y值该如何直接添加?
-fFov * ratio + headX
-fFov * ratio + headX
以上如何给我们提供一个价值,当乘以n(近值)时,为非对称glFrustum调用的左右投影提供值?
问题4)我理解glLookAt必须用于视点,将视锥的顶点移动到用户眼睛所在的位置(在这种情况下是鼠标所在的位置)。请注意上面代码中的行:
gluLookAt(headX * headZ,headY * headZ,0,headX * headZ,headY * headZ,-1,0,1,0);
headX * headZ
如何给我眼睛的xPosition,headY * headZ
如何给我眼睛的yPosition,我可以在此处用于gluLookAt()
?编辑:完整的问题描述在此处添加:pastebin.com/BiSHXspb
(angle ((x,A),(x,B)))
在弧度中变为tanValue = DEG_TO_RAD * theta/2;
,随后fFov = tan(tanValue)
。因此,对于glFrustum
中的left/right
参数中的Question 1
,fFov * ratio
的含义是什么?由于我需要获取斜轴投影的左右范围,我不确定我们是否使用fFov * ratio
提取 x 位置。您能否再详细解释一下? - user1240679。因此,根据我上面的帖子中的逻辑
headY=(768-668)/768 - 0.5 = -0.36。这意味着当用户的头部位置(由于鼠标Y是
668)在第四象限中作为被移位的中心时,
headY偏移量变为
-0.36。随后,
glFrustum的
bottom值变为
(-fFov +headY)` ~= -0.5 - 0.36 = -0.86,顶部为0.5-0.36 = 0.14。(续) - user1240679top=0.14, bottom=-0.86
似乎在第一象限而不是第四象限形成。为什么呢?尽管 top 应该是0.5+
,bottom 应该是-0.5-
。这就是我问(问题3)我们如何直接将headY
添加到fFov
中,并且仍然希望能够更清楚一些,虽然我已经有了想法。 - user1240679