在3D-OpenGL/C++中找到X、Y和Z轴的角度

6

我目前正在尝试使用OpenGL(带有SDL)在屏幕上绘制一个立方体,并使其指向右键单击的位置。

使用gluUnproject,我可以成功地在所需位置绘制一个立方体 - 这意味着我已经知道我的立方体所处的坐标。

然而,我不知道如何计算所有必要的角度,以使我的立方体指向新位置。

当然,我仍然使用gluUnproject来查找我的右键单击的坐标,但我只知道如何在2D图形中绕Z轴旋转。

例如,在此之前,如果我想要在2D中沿Z轴旋转四边形(当然,这将是俯视图,其中Z轴仍然“穿过”屏幕),我会做类似于以下操作:

angle = atan2(mouseCoordsY - quadPosY, mouseCoordsX - quadPosX);
glRotatef(angle*180/PI, 0, 0, 1);

我的问题是,我该如何在三维空间中实现这个效果?

  • 我是否需要像上面那样计算每个轴的角度?
  • 如果需要,如何计算绕X和Y轴旋转的角度?
  • 如果不需要,我应该使用什么方法来达到我想要的结果?

非常感谢您的帮助。


你如何指定每个鼠标点击所代表的z坐标?如果你只将两者都设置为0,那么2D几何就足够了,我猜这不是你的意图。 - Marcelo Cantos
在3D空间中点击应该定义一条射线,而不是一个点。我很好奇您是如何首先定位立方体的。 - tafa
@Marcelo Cantos:如果我误解了你的问题,请原谅,因为我是新手,虽然我认为我知道你在问什么,但我可能仍然有错误的想法。基本上,如果我的立方体在(100,200,300)处,我点击(400,500,600),我需要找到旋转立方体所需的角度,以使其看向第二组坐标。 - Lucas
@tafa:我使用gluUnProject获取坐标以在glTranslatef()中使用。为了获取Z值,我使用了以下代码的glReadPixels(): glReadPixels(mouseX, realY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, depth); 其中depth是一个GLfloat depth[2];然后我使用:gluUnProject((GLdouble) mouseX, (GLdouble) realY, depth[0], mvmatrix, projmatrix, viewport, &wx, &wy, &wz)。将wx、wy和wz作为我的坐标。但正如我在之前的评论中所说,我是新手,所以我知道我可能做错了很多事情。 - Lucas
1个回答

10

如果你的立方体在A点=(x0,y0,z0)

如果你的立方体当前朝向B点=(x1,y1,z1)

如果你想要它朝向C点=(x2,y2,z2),那么:

让v1成为从A到B的向量

v1 = B - A

让v2成为从A到C的向量

v2 = C - A

首先将它们归一化。

v1 = v1 / |v1|
v2 = v2 / |v2|

然后计算旋转角度和旋转轴,如下:

angle = acos(v1*v2) //dot product
axis = v1 X v2 //cross product

您可以使用glRotate函数:

glRotate(angle, axis[0], axis[1], axis[2])

非常感谢您的答案Tafa!我在过去几天里一直在寻找有关此问题的教程和其他资源,并尝试使用点积等方法进行测试,但由于我刚刚从2D开始,这些方法对我来说并不是很清晰。但是,您的答案以非常清晰的方式解释了我所需要知道的一切,这是我在谷歌上找到的所有资源都无法做到的。谢谢。 - Lucas
@酸柠檬,很高兴听到这个消息。 - tafa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接