这是我的问题。我必须在双三次曲面上沿圆形轨迹移动圆环。
然而,环面的垂直轴必须与给定点处的曲面法线对齐。此外,环面必须面对它的圆形轨迹。
为了管理这个,我采用了法线向量和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计算的向量。
答案 0 :(得分:0)
不要考虑轮换。只需考虑轴。
你想要将环面的新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();