c++ - 如何使用 gluLookAt 围绕 OpenGL 中的一个点旋转相机视图
问题描述
我正在尝试使用 gluLookAt 函数为相机的位置和方向设置正确的视图转换。在我的程序中有一个以原点为中心的球体,当按下箭头键时,相机会根据(左、右、上、下)球体移动。
我尝试使用这种转换: gluLookAt(xc, yc, zc, 0.0, 0.0, 0.0, 0.0, 1,0, 0,0);
为了验证它的正确性,我打印了三个轴。它似乎无法正常工作。当我上下移动时,y 轴似乎没有移动。
你能帮助理解这种转变有什么问题吗?
解决方案
常量up
向量是错误的!
当您xc=0,yc=?,zc=0
(即当您在 y 轴上向上/向下移动时)然后您的向上向量与您的视图方向(反)平行时,这意味着gluLookAt
不能使用构建变换矩阵所需的叉积创建 3 个垂直基向量。
在这种情况下,向上向量应该不同......我通常使用点积
if (dot(a,b)/(|a|.|b|)>0.9)
检测接近(反)平行向量并在您的情况下设置不同的向量,其简化如下:
if (fabs(yc*yc)/(xc*xc+yc*yc+zc*zc)>(0.9*0.9)) use different up vector
您可以使用(+/-1,0,0)
哪个(0,0,+/-1)
符号和哪个符号取决于您的坐标系约定(因此您的视图在通过这个奇点时不会扭曲/镜像/旋转)。
0.9
阈值意味着:
cos(da) = 0.9
da = acos(0.9)
da = 25.84 deg
这是两个向量之间允许的最大角度差...
推荐阅读
- vue.js - 如何在 Vue.js 的联合中使用片段?
- javascript - e.target.is("#elelemt - 或它的任何孩子")
- operating-system - 可扩展性与性能
- oracle - 将 htp.p 打印值插入表中
- c# - 如何在 Razor 页面中使用委托
- python - Python 线程参数传递
- python - 如何解析 XML 将特定标签或其内容保留为纯文本?
- c# - 如何解决“操作无法完成,因为 DbContext 已被释放。” 同时保存操作?
- ansible - 是否可以合并 anisible group_vars,如果可能的话,你能帮我解决一下吗
- c# - 如何比较和更新包含大量项目的 2 个列表?