【问题标题】:Aligning an object to the surface of a sphere while maintaining forward direction在保持向前方向的同时将对象与球体表面对齐
【发布时间】:2017-03-29 18:42:58
【问题描述】:

使用 OpenGL 作为渲染引擎我正在尝试生成一个旋转矩阵,该矩阵将在给定位置的球体表面上放置一个网格。最初我试图通过计算给定位置的球体表面法线并将其用作我的网格up 向量来做到这一点。

这行得通,但事情变得复杂了,因为我还希望能够使用绝对 yawpitchroll 值旋转网格 - 其中 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


【解决方案1】:

让我们在“地球”上工作。它的旋转轴 (r) 从南极到北极。表面的法线(n)“离开”地球。

叉积e= r x n 给出了一个向东的向量。
叉积d= n x e 给出了一个向北的向量。

使用e, n, d 的标准化版本并平移到曲面中的点,您可以构造lookAt 矩阵(请参阅here)。
up = nf= center-eye = ds = e。请注意,您可能想要更改 f 符号,因为这不是真正的“lookAt”转换,它不查看,而只是定位。

现在,如果您的网格可以被视为与第一个球体同心的另一个球体,则所有旋转都必须在两个球体的共享中心上。始终保持“向北”的旋转轴可以是“地球轴”(r)和“向东”(e)。使用“e”时,您会以某种方式向北丢失,矢量进入球体“内部”。由于 if c= a x b then |c| = |a|·|b|·sin(beta),因此可以从叉积计算角度。

【讨论】:

  • 感谢您的详细撰写,这似乎有效!对于有类似问题的人,我在原始问题中包含了一些伪代码。也许您回答的唯一方面是关于您关于失去北方并使矢量进入球体“内部”的评论。你能澄清一下吗?
  • 如果您在位于表面的“东”矢量上旋转,则“北”矢量向球体中心旋转。 “法线”也将失去其垂直于表面的特性。为避免此问题,请在“东”上方旋转,但位于球体中心。
猜你喜欢
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 2015-10-08
相关资源
最近更新 更多