【问题标题】:Generating 3D Cylinder with Rotationmatrix使用 Rotationmatrix 生成 3D 圆柱体
【发布时间】:2021-08-02 16:16:13
【问题描述】:

我正在尝试在 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' 旋转。而且我不知道如何弄清楚我需要计算什么角度,如何计算以及哪个角度属于女巫旋转矩阵。

【问题讨论】:

    标签: c++ 3d


    【解决方案1】:

    为此,您需要基向量(可以编码成变换矩阵)。

    假设你得到了:


    p0[3],p1[3] - 3D 中心点 (x,y,z) 您的气缸底座
    r - 半径

    要构造变换矩阵你需要


    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];
    

    查看相关的 QA:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2019-09-22
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多