空间中人物的定位

时间:2012-12-23 13:26:44

标签: c++ algorithm opengl 3d openframeworks

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

enter image description here

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

目前,我做了类似以下的事情:

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

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

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

此外,未来的矩形可能会改变为其他形状,因此可以理解一种通用的解决方案。

2 个答案:

答案 0 :(得分: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(),或者以你自己的代码中适当的方式构建和使用上面的矩阵。

答案 1 :(得分:0)

我个人认为 JasonD 的答案就够了。但这里有一些涉及计算的信息。

从数学角度讲,这是一个相当简单的问题,你所拥有的是2个已知的向量。你知道位置向量和球体法向量。由于正方形可以在球体中心周围的矢量周围任意旋转,因此需要再定义一个矢量,向上矢量。没有定义向上,它就变成了一个不可能的解决方案。

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

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°点。产生同样的事物不同的方法没有奇点问题。