【发布时间】:2017-03-29 18:42:58
【问题描述】:
使用 OpenGL 作为渲染引擎我正在尝试生成一个旋转矩阵,该矩阵将在给定位置的球体表面上放置一个网格。最初我试图通过计算给定位置的球体表面法线并将其用作我的网格up 向量来做到这一点。
这行得通,但事情变得复杂了,因为我还希望能够使用绝对 yaw、pitch 和 roll 值旋转网格 - 其中 yaw 总是为 0让网格朝北朝上 (0, 1, 0)。
我对如何实现这一点有一个心理障碍,如果有任何意见,我将不胜感激。
更新 Ripi2 提供的解决方案:
let earthAxisOfRotation = Vector3(0, 1, 0).normalized() // south -> north pole is `up` in world space
let surfaceNormal = position.normalized() // surface normal of the given position on sphere surface
let east = earthAxisOfRotation.cross(surfaceNormal).normalized()
let north = surfaceNormal.cross(east)
let rotationMatrix = Matrix4(
east.x, east.y, east.z, 0,
surfaceNormal.x, surfaceNormal.y, surfaceNormal.z, 0,
-north.x, -north.y, -north.z, 0,
0, 0, 0, 1
)
【问题讨论】:
-
你的想法在我看来是正确的。这与定义“lookAt”矩阵(没有平移部分)相同,球体的法线为“向上”,球体的旋转轴(对于地球)是“眼睛-目标”向量。你有什么问题?
-
我基本上没能实现向上定向的网格。它们的位置正确,但它们的“前向”矢量会根据它们在球体上的位置而有所不同。你的建议似乎有道理,但我相信这是我正在努力解决的眼睛目标向量的计算。你能澄清一下“球体的旋转轴”是什么意思吗?
标签: opengl vector geometry quaternions