3

我的程序中有一个球体,我打算在距离该球体中心 x 处绘制一些矩形。该图如下所示:

在此处输入图像描述

矩形绘制在我已经在 3d 点向量中的 (x,y,z) 点处。假设 x 到中心的距离为 10。注意这些矩形的方向,它们与半径为 10 的假想球体相切(垂直于从球心到矩形中心的假想线)

目前,我执行以下操作:

vector<vec3f> pointsInSpace对于必须绘制矩形的n 个点

for(int i=0;i<pointsInSpace.size();++i){
    //draw rectnagle at (x,y,z)
}

它没有我正在寻找的这种切线方向。在我看来,roll,pitch,yaw对每个矩形应用旋转并以某种方式使用四元数使它们与我正在寻找的东西相切。但是,对我来说它看起来有点复杂,我想问一些更好的方法来做到这一点。

此外,将来的矩形可能会更改为其他形状,因此将不胜感激一种通用的解决方案。

4

2 回答 2

1

我认为您基本上想要与使用 LookAt() 函数完成的相同转换(您希望矩形沿着从矩形中心到球体原点的向量“查看”球体)。

如果您的矩形由点组成:

(-1, -1, 0)
(-1,  1, 0)
( 1, -1, 0)
( 1,  1, 0)

然后矩形的法线将指向 Z。该轴需要朝向球体。

因此,从您的点到球体中心的归一化向量是 Z 轴。

然后您需要定义一个不同的“向上”向量 - (0,1,0) 是典型的,但在 Z 轴指向同一方向的情况下,您需要选择不同的向量。

'up' 和 'z' 轴的交叉给出了 x 轴,然后 'x' 和 'z' 轴的交叉给出了 'y' 轴。

这三个轴 (x,y,z) 直接形成一个旋转矩阵。

由此产生的变换矩阵将适当地定向矩形。要么使用 GL 的固定函数管道 (yuk),在这种情况下你可以只使用 gluLookAt(),或者在你自己的代码中以任何合适的方式构建和使用上面的矩阵。

于 2012-12-23T13:33:21.797 回答
0

个人觉得JasonD的回答就够了。但这里有一些有关计算的信息。

从数学上讲,这是一个相当简单的问题,您拥有的是 2 个已知向量。你知道位置向量和球体法线向量。由于正方形可以从球体中心沿矢量任意旋转,因此您需要再定义一个矢量,即向上矢量。如果不定义向上向量,它将成为一个不可能的解决方案。

一旦定义了向上向量向量,问题就变得简单了。假设您的正方形位于上面JasonD建议的 XY 平面上。然后你的矩阵变成:

up_dot_n_dot_n.X      up_dot_n_dot_n.Y       up_dot_n_dot_n.Z     0
n.X                   n.y                    n.z                  0
up_dot_n.x            up_dot_n.x             up_dot_n.z           0 
p.x                   p.y                    p.z                  1

其中 n 是 p - 球心的法线单位向量(如果球体位于坐标系的中心,这很简单),up 是任意单位向量向量。p 遵循形式定义并且是位置。

该解在球体的向上方向有一点奇点。另一种解决方案是先向上旋转 360 度,然后围绕旋转轴点向上旋转 180 度。产生相同的东西不同的方法没有奇点问题。

于 2012-12-23T22:46:38.983 回答