我正在尝试在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'旋转。而且我不知道如何计算出我需要计算的角度,如何计算以及哪个角度属于旋转矩阵。
答案 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: