【问题标题】:Multiple rotation problems多次旋转问题
【发布时间】:2017-10-05 22:51:29
【问题描述】:

这是我的问题。我必须在双三次曲面上沿圆形轨迹移动圆环。

然而,圆环的垂直轴必须与给定点的表面法线对齐,而且圆环必须面对它的圆形轨迹。

为了解决这个问题,我采用了法线向量和 Oy 向量,做了一个十字和一个点积来找到我需要的角度和旋转的轴,它可以工作。 为了管理第二部分,我获取了圆环的实际坐标,接下来是圆形轨迹上的坐标,制作了一个向量,并按照前面描述的方法找到了角度和轴,它起作用了。

我的问题是,我必须同时应用两个旋转,我找不到这样做的方法。我试图以各种可能的方式推送/弹出矩阵,但我找不到摆脱这种方式的方法。所以我回到这个......

    glPushMatrix();
    glTranslatef(pp -> x, pp ->y , pp ->z);

    glRotatef(*angledegree, vecortho -> x, vecortho -> y, vecortho -> z);
    glRotatef(*angledegreetang, tang -> x, tang -> y, tang -> z);

    tore(0.1, 0.3, 6, 4, 1);
    repere(0.6);
    glPopMatrix();

有什么想法吗?很抱歉打扰你,我想它一定很简单,但我没有看到。无论顺序如何,第一个轮换总是会干扰下一个轮换。 vecortho 是根据表面法线和 Oy 计算的轴矢量。 tang 是用我的轨迹向量和 Ox 计算的向量。

【问题讨论】:

  • 在圆环的坐标系中,哪个向量是“上”,哪个向量是“前”?

标签: c++ opengl rotation bicubic glrotate


【解决方案1】:

不要考虑轮换。只考虑轴。

您希望将环面的新 Y 轴平移到特定的新方向(法线向量),将其新的 Z 轴平移到特定的新方向(前向向量)以及您不关心的 X 轴关于。

因此构建执行此转换的矩阵并使用它。您的矢量类可能与此示例不同,并且我的矢量数学可能会生锈,因为我尚未测试此代码:

vector newY = normalVec;
vector newZ = forwardVec;
// We don't really care what X is, but it must be perpendicular to Y and Z. Swap Y and Z here if this ends up mirroring the object.
vector newX = normalize(cross(newY, newZ));

double matrix[16] = {
    newX.x,  newX.y,  newX.z,  0,
    newY.x,  newY.y,  newY.z,  0,
    newZ.x,  newZ.y,  newZ.z,  0,
    0,       0,       0,       1,
};
glPushMatrix();
glTranslatef(position of torus);
glMultMatrixd(matrix);
// draw torus
glPopMatrix();

【讨论】:

  • 另外,希望你能做到这一点的事实能让你对矩阵有一些直觉。
  • 我实施了您的解决方案。我不知道为什么或如何,但它像应用了一些 glScalef 一样缩小了我的圆环:o.
  • 没关系!我对 3 个向量进行了标准化,它似乎工作得很好!坦克你这么多你的洞察力。我想从现在开始我会自己操作矩阵!
  • @Jonathan 这个矩阵基本上告诉OpenGL,对于对象中的每个向量v,将其更改为newX*v.x + newY*v.y + newZ*v.z。因此对象中的点 (1,0,0) 变为 newX,点 (0,1,1) 变为 newY+newZ,以此类推。基本上,它可以让您更改每个对象的轴指向的方向。这就是您可以使用矩阵进行旋转的方式(它们也可以用于平移,但该部分在这个特定矩阵中为零)。您还可以更改 newX/newY/newZ 的长度以进行缩放 - 这里我们不希望缩放,因此它们都应该被标准化。
猜你喜欢
  • 2017-06-21
  • 2021-07-15
  • 1970-01-01
  • 2014-12-16
  • 2015-02-14
  • 2013-09-20
  • 2011-04-10
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多