我的程序中有一个球体,我打算在距离球体中心x的距离处绘制一些矩形。该图如下所示:
矩形在(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
旋转,并使用四元数以某种方式使它们切向于我正在寻找的东西。
然而,它看起来有点复杂,我想问一些更好的方法来做到这一点。
此外,未来的矩形可能会改变为其他形状,因此可以理解一种通用的解决方案。
答案 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°点。产生同样的事物不同的方法没有奇点问题。