使用Rotationmatrix

时间:2017-01-05 20:42:21

标签: c++ 3d

我正在尝试在3D空间中创建一个圆柱体。 我在3D中得到一个起点和终点并放置顶点,我需要为圆柱的底部和顶部创建2个圆。 我考虑用坐标(1,0,0)制作一个矢量u并计算方向矢量dir = end - start。 现在我制作十字产品来得到一个向量w = u x dir: 这样我与w的dir矢量相差90度。问题是,如何用w和w'之间的任意角度计算下一个位置w'。 我阅读了很多关于旋转矩阵的内容,并且我可以围绕X轴旋转,例如:

Rx(angle) =   
(1   0          0          )  
(0   cos(angle) -sin(angle))  
(0   sin(angle) cos(angle) ) 

但方向可以是(1.442,-3.22,7.23)。所以它并不总是x轴,但我可能需要为每个轴上的每个新w'旋转。而且我不知道如何计算出我需要计算的角度,如何计算以及哪个角度属于旋转矩阵。

1 个答案:

答案 0 :(得分:1)

您需要基础向量(可以编码为转换矩阵)。

所以假设你得到了:


p0[3],p1[3] - 3D 圆柱基座的中心点(x,y,z)
r - radius

要构建转换矩阵,您需要


O[3] - 原籍立场
X[3],Y[3],Z[3] - 基础载体

因此,您可以利用交叉产品来获取并行向量:

O = p0;
Z = p1-p0;
Y = (1.0,0.0,0.0);
if (|dot(Y,Z)/|Z||>0.75) Y = (0.0,1.0,0.0); // this just make sure Z and Y are not parallel
X = cross(Y,Z);
Y = cross(Z,X);
X = r*X/|X|;
Y = r*Y/|Y|;  

现在构建 4x4变换矩阵 M或直接使用X,Y,Z,O来计算顶点:

BASE0:

x=cos(a);
y=sin(a);
z=0.0;

BASE1:

x=cos(a);
y=sin(a);
z=1.0;

a = <0.0,2.0*PI>是角度。 XY平面与基部平行,z是圆柱轴。要将这些(x,y,z)转换为世界坐标,请使用:

(x',y',z') = M * (x,y,z)

可以使用M作为GL_MODELVIEW的一部分,在 OpenGL 中本机完成,或者执行此操作:

x' = O[0] + x*X[0] + y*Y[0] + z*Z[0];
y' = O[1] + x*X[1] + y*Y[1] + z*Z[1];
z' = O[2] + x*X[2] + y*Y[2] + z*Z[2];

看看相关的QAs: