gpt4 book ai didi

c++ - 旋转物体

转载 作者:行者123 更新时间:2023-11-27 23:32:16 25 4
gpt4 key购买 nike

我有一个物体(圆锥体),其底面位于顶点 X1 上(圆锥体的圆底以 X1 为中心)并指向 Oz。我想旋转它,使其指向给定的顶点 X2。我尝试了很多组合,我做了很多计算仍然无法正常工作。如果您可以使用 C++ OpenGL 函数 glRotatef 给出答案,那就太好了,但也将不胜感激。我现在正在锥体上尝试这个,但它应该适用于任何网格。

到目前为止我有这个:

h1 = sqrt(pow(p2.y - p1.y, 2) + pow(p2.z - p1.z, 2));
h2 = sqrt(pow(p2.x - p1.x, 2) + pow(p2.z - p1.z, 2));
h3 = sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2) + pow(p2.z - p1.z, 2));

r.x = sign(p1.y-p2.y)*acos((p1.z-p2.z)/h1) * 180/M_PI;
r.y = sign(p1.x-p2.x)*acos((p1.z-p2.z)/h2) * 180/M_PI;
r.z = 0;

cone.SetPosition(p2);
cone.SetHeight(h3);
cone.SetRotation(r);

其中 sign() 是它的名称,负参数返回 -1,正参数返回 1。 Cone 对象的绘图函数如下所示:

void drawCone()
{
glPushMatrix();
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(rot.x, 1, 0, 0);
glRotatef(rot.y, 0, 1, 0);
glRotatef(rot.z, 0, 0, 1);
glColor3f(col.red, col.green, col.blue);
gluDisk(cone, 0, radius, 10, 10);
gluCylinder(cone, radius, 0, height, 10, 10);
glPopMatrix();
}

它不需要是一个高度优化的解决方案,只需一个有效的解决方案。

最佳答案

如果我对您的问题的理解正确,您基本上是想沿着最短的球形路径将一个 vector 旋转到另一个 vector 上 - 这就是通常瞄准的目的。在一般情况下,这对欧拉角来说有点痛苦。我在某处有一些代码完全针对欧拉角进行一般瞄准,但它过于复杂 - 如果出于某种原因您必须使用欧拉角来执行此操作,我可以将其挖掘出来。

但恕我直言,您在这里真正想做的是使用四元数表示。这让事情变得非常简单。您只需取要旋转的 vector 和要旋转的 vector ,然后找到它们的叉积。那就是你想要旋转的轴。然后找到两个 vector 之间的角度 - 即您想要旋转的量。围绕某个轴旋转一定量是四元数最擅长的——如果你想旋转到一个与你的初始 vector 完全相反的方向的轴上,就会有一个奇点——但这是不可避免的,而且对于你在做什么。

编辑:直接给定角度和轴计算旋转矩阵也不难。但在每种情况下,我都必须这样做,因为我必须能够在旋转帧之间进行插值。这就是为什么我建议使用四元数。如果您不必平滑地插值,则任何从轴和角度导出旋转的方法都可以。

关于c++ - 旋转物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4372550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com