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

Posted

技术标签:

【中文标题】在 3D 中查找 X、Y 和 Z 轴的角度 - OpenGL/C++【英文标题】:Finding the angles for the X, Y and Z axis in 3D - OpenGL/C++ 【发布时间】:2010-11-10 10:04:27 【问题描述】:

我目前正在尝试使用 OpenGL(使用 SDL)将立方体绘制到我在屏幕中左键单击的位置,然后让它指向我在屏幕中右键单击的位置。

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

但是我不知道如何计算使我的立方体指向新位置所需的所有角度。

当然我现在还在用gluUnproject来找我的右键坐标,但是我只知道用2D图形怎么绕Z轴旋转。

例如之前,如果我想在 2D 中围绕 Z 轴旋转一个四边形(当然,这将是一个自上而下的视图,其中 Z 轴仍然“穿过”屏幕)我会做类似的事情:

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

我的问题是,我将如何在 3D 中进行此操作?

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

非常感谢任何帮助。

【问题讨论】:

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

如果你的立方体在 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 来的,所以对我来说没有多大意义。但是你的回答已经非常清楚地解释了我需要知道的一切,我在谷歌上找到的任何资源都不能。谢谢。 @Sour Lemon,很高兴听到这个消息。

以上是关于在 3D 中查找 X、Y 和 Z 轴的角度 - OpenGL/C++的主要内容,如果未能解决你的问题,请参考以下文章

将围绕任意轴的旋转解析为围绕 X、Y 和 Z 轴的旋转

在 3D 空间中沿 Y 轴的一个角度在随机点处旋转单位向量

R Shiny Plotly 3D:将x,y,z轴的标题更改为实际变量名称并添加图例标题

如何使用 Autodesk Forge 查看器在 3D 模型中查找位置(x、y、z 坐标)

3D 绘图刻度标签与轴值不匹配(R 格)

围绕 Y 轴的任意纹理位移