Opengl 将对象与球体表面对齐,同时保持前进方向

Opengl 将对象与球体表面对齐,同时保持前进方向,opengl,vector,geometry,quaternions,Opengl,Vector,Geometry,Quaternions,使用OpenGL作为渲染引擎,我试图生成一个旋转矩阵,该矩阵将网格放置在给定位置的球体表面上。最初,我试图通过计算给定位置的球体曲面法线并将其用作网格上方向向量来实现这一点 这是可行的,但由于我还希望能够使用绝对偏航、俯仰和滚动值旋转网格,情况变得复杂了,其中偏航为0时,网格将始终指向北方方向上的0、1、0 对于如何实现这一点,我有一个想法障碍,如果您能提供任何意见,我将不胜感激 使用Ripi2提供的解决方案进行更新: 让我们在地球上工作吧。它的旋转轴r从南极到北极。地表的法向n从地球上消失。

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

这是可行的,但由于我还希望能够使用绝对偏航、俯仰和滚动值旋转网格,情况变得复杂了,其中偏航为0时,网格将始终指向北方方向上的0、1、0

对于如何实现这一点,我有一个想法障碍,如果您能提供任何意见,我将不胜感激

使用Ripi2提供的解决方案进行更新:


让我们在地球上工作吧。它的旋转轴r从南极到北极。地表的法向n从地球上消失。 叉积e=r x n给出一个向东的矢量。 叉积d=nxe给出了一个向北的矢量

使用e、n、d的规范化版本并转换到曲面中的点,您可以构造一个注视矩阵,请参见。 向上=n,f=中心孔=d,s=e。请注意,您可能需要更改f符号,因为这不是真正的“注视”变换,它不注视,而只是定位


现在,如果可以将网格视为与第一个球体同心的另一个球体,则所有旋转必须位于两个球体的共享中心之上。旋转轴(始终保持航向北)可以是地球轴r和航向东e。当使用“e”时,你不知怎么失去了北方,向量进入球体内部。角度可以通过叉积计算,因为如果c=a x b,那么| c |=a |········································。这与定义没有平移部分的注视矩阵相同,球体的法线是向上的,球体的旋转轴是眼睛的目标向量。你的问题是什么?我基本上无法实现向上方向的网格。它们的位置正确,但它们的“前进”矢量将根据它们在球体上的位置而有所不同。你的建议似乎有道理,但我相信我正在努力解决的是眼睛目标向量的计算问题。你能解释一下你所说的球体旋转轴是什么意思吗?谢谢你的详细介绍,这看起来很有效!我在最初的问题中为有类似问题的人提供了一些伪代码。也许你回答的唯一方面我无法理解是关于你关于失去北方和让向量进入球体内部的评论。你们能澄清一下吗?若你们在位于表面的东矢量上旋转,那个么北矢量会朝着球体的中心旋转。法线也将失去其“垂直于曲面”特性。若要避免此问题,请在球体的中心向东旋转。
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
)