围绕原点的三维旋转

7
我知道这里有很多关于3D旋转的问题都已经得到了解答,但是它们似乎都涉及OpenGL中的旋转矩阵和四元数(而我并不在意是否会出现万向节锁定)。我需要获取一个点的3D坐标(例如:x,y,z),该点始终与原点保持相同的距离(我现在称之为“d”)。我的输入信息仅为鼠标在屏幕上移动的deltax和deltay。到目前为止,以下是我尝试过的方法:
首先:
thetaxz+=(omousex-mouseX)/( width ); 
thetaxy+=(omousey-mouseY)/( height);
第二点:
pointX=cos(thetaxz)*d;
pointY=sin(thetaxy)*d;

(pointX是点的x坐标,pointY是y坐标)

第三步:

if(thetaxz)<PI){
 pointZ=sqrt(sq(d)-sq(eyeX/d)-sq(eyeY/d));
}else{
  pointZ=-sqrt(abs(sq(d)-sq(eyeX/d)-sq(eyeY/d)));
}

(sq()是平方函数,abs()是绝对值函数。 pointZ应该是点的z坐标,在正z半球和负z半球之间的交界处除外。当它靠近边缘时,点会被拉伸超过x、y轴上应该始终存在的距离,并且在thetaxz的0.1-0.2弧度左右看起来随机地成为NAN或未定义状态)
我思考了一段时间,坦率地说,我很难理解四元数和旋转矩阵的概念,但如果你能向我展示如何使用它们生成实际的坐标,我会很乐意学习。我仍然希望可以在几个轴上使用一些三角函数。非常感谢您提前的任何帮助,如果需要更多信息,请告诉我。
提示/最后一分钟的想法:我认为这可能与z位置影响x和y位置有关,但我不确定。
编辑:我画了一个图: enter image description here

我不确定这是否完全符合您的要求,但我认为您可能需要查看gluUnProject,根据相机矩阵将2D坐标转换为3D坐标。对于近平面和远平面上的点执行此操作,然后使用一些三角函数找到沿着您的结果线距离原点所需距离的点。请注意,这个问题有0、1或2个解,具体取决于该线。 - Hybrid
3
你能否用图片更清晰地表述原始问题? - Codie CodeMonkey
我添加了一张图片链接,因为我只有1个声望,因为我是这个网站的新手。 - Mac Goldwhite
1个回答

8

如果你真的想在这方面获得成功,你就需要咬紧牙关学习旋转矩阵和 / 或四元数旋转。可能有其他方法可以实现你想要的效果,但是旋转矩阵和四元数旋转之所以被广泛理解和应用,仅仅是因为它们是表达和应用向量旋转最简单的方式。任何其他人能想出来的表示方式,都可能是对这两种方式的更复杂的重新表述。事实上,旋转是一种线性变换,因此可以表示为矩阵。四元数旋转只是在3D空间中旋转向量的一种简化方式,因此具有等效的矩阵表示。

那么,看起来你对用鼠标点击场景中的对象并以一种自然的方式旋转感兴趣。如果是这样,你应该看看ArcBall方法(有众多示例可供参考)。这仍然需要你了解四元数的一些知识。你还会发现,至少基本的线性代数方面的理解将会很有帮助。 更新: 根据您的图表和评论,看起来您真正想做的只是将球坐标转换为直角坐标。 只要我们就符号约定达成一致,这很容易。 让θ是您称为XY的角度,即X轴绕Z轴旋转的角度; 这称为方位角,将在[0,2π)弧度或[0°,360°)范围内。 让Φ是一个角度,介于XY平面和您的向量之间; 这称为俯仰角,将在[-π/2,+π/2]或[-90°,+90°]范围内,并且对应于您称为XZ角度(绕Y轴在XZ平面上旋转)。 还有其他约定,请确保您保持一致。 无论如何,转换很简单:
x = d∙cos(Φ)∙cos(θ)
y = d∙cos(Φ)∙sin(θ)
z = d∙sin(Φ)

谢谢,但我没有使用OpenGL,而且我也不是在抓取对象,我是在旋转场景相机,而不是转换场景坐标系。有没有一种方法可以从旋转矩阵中获取坐标,因为那样我就可以使用它们了? - Mac Goldwhite
根据你的图表,我认为你只是想要将球面坐标转换为笛卡尔坐标。我已经修改了我的响应以向你展示如何做到这一点。如果你试图使用鼠标并围绕原点移动相机进行任何交互操作,我不认为你会得到完全符合你期望的结果。话虽如此,我真的认为你最好考虑一下ArcBall方法。 - andand
谢谢,我在你发帖之前就已经弄清楚了,但还是感谢你!非常有帮助,我想给你点赞,但我自己的声望还不够。我会尝试稍后回来,因为你非常有帮助和信息量。 - Mac Goldwhite
似乎指向 arcball 论文的链接已经变成了 404。 - Mike 'Pomax' Kamermans
1
@Mike'Pomax'Kamermans 谢谢你告诉我。我找到了另一个来源并更新了链接。祝使用愉快。 - andand

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