【问题标题】:Rotate flat 2d object around an arbitrary Axis围绕任意轴旋转平面二维对象
【发布时间】:2013-07-23 09:30:32
【问题描述】:

所以我有一个平面的二维多边形,我想围绕一个由两个二维点定义的轴旋转多边形的每个点。这些旋转点稍后用于从平面 2d 多边形生成 3d 旋转对象。 所以我现在得到了这个:

  1. 计算一个多边形点的轴法线位置。
  2. 从这一点开始,我使用 matrixLookAt(pointOnLine, polygonPoint, upVec) 函数计算矩阵
  3. 然后我将矩阵在 Z 轴上旋转 45°
  4. 最后,我将多边形点与计算出的矩阵相乘。

但是用这种方法我没有得到任何有用的结果。

为了更好地理解: P1 & P2 定义轴 Psrc 是多边形点 Pdest 是 3d 中的最后一个点

【问题讨论】:

    标签: c++ opengl vector matrix


    【解决方案1】:

    更容易完成。只需在使用glRotatef() 绘制之前修改您的模型矩阵:

    glRotatef(angle, vx, vy, vz);
    
    • angle 显然是角度。
    • vx、vy 和 vz 是定义旋转轴的向量。

    或者,在给出 2 分的情况下使用它:

    glRotatef(p1.x - p2.x, p1.y - p2.y, p1.z - p1.z);
    

    如果你的旋转轴不通过你的世界原点,你必须调整一切,让你的轴使用glTranslatef()通过原点:

    glTranslatef(-p1.x, -p1.y, -p1.z); // move one point on the vector into the origin
    glRotatef(p1.x - p2.x, p1.y - p2.y, p1.z - p1.z); // rotate everything
    glTranslatef(p1.x, p1.y, p1.z); // move everything back into position
    

    【讨论】:

    • 这将围绕中心而不是围绕轴旋转点
    • 嗯?你将如何围绕另一个点(中心?)旋转一个点?通过减去两点的坐标,您可以得到它们之间矢量的尺寸,而不是中心点。将在答案中链接文档。
    • 我通过创建一个矩阵来围绕轴旋转一个点,该矩阵在轴上的法线点移动,旋转这个矩阵并将多边形点乘以这个矩阵。像任何 cad 软件一样创建一个旋转体
    • 这正是glRotate() 将要做的——但在显卡上:它会围绕向量给出的轴旋转所有未来的点(直到你重置矩阵)。但现在我想起来了,我忘了提到平移,即当你的旋转轴不经过你的原点时。你猜这就是你的意思?已添加。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    相关资源
    最近更新 更多