这就是我的问题。我必须在双三次曲面上沿圆形轨迹移动一个圆环。
然而,环面的垂直轴必须与给定点处的曲面法线对齐,而且环面必须面对它的圆轨迹。
为了做到这一点,我取了法向量和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计算得到的向量。
发布于 2017-05-08 12:56:55
不要考虑旋转的问题。只要从轴的角度来考虑。
您希望将圆环的新Y轴转换为特定的新方向(法线向量),将其新的Z轴转换为特定的新方向(正向向量),并将其X轴转换为您不关心的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();https://stackoverflow.com/questions/43839114
复制相似问题