Math 围绕原点的三维旋转

Math 围绕原点的三维旋转,math,3d,rotation,trigonometry,Math,3d,Rotation,Trigonometry,我知道这里已经回答了很多关于3d旋转的问题,但所有这些问题似乎都涉及OpenGL中的旋转矩阵和四元数(我真的不在乎是否有万向节锁)。我需要得到一个点的三维坐标EX:(x,y,z),它必须始终保持相同的距离,我现在称它为“d”,从原点开始。我唯一的输入信息是鼠标在屏幕上的deltax和deltay。到目前为止,我已经尝试过: 第一: thetaxz+=(omousex-mouseX)/( width ); thetaxy+=(omousey-mouseY)/( height); (thetax

我知道这里已经回答了很多关于3d旋转的问题,但所有这些问题似乎都涉及OpenGL中的旋转矩阵和四元数(我真的不在乎是否有万向节锁)。我需要得到一个点的三维坐标EX:(x,y,z),它必须始终保持相同的距离,我现在称它为“d”,从原点开始。我唯一的输入信息是鼠标在屏幕上的deltax和deltay。到目前为止,我已经尝试过:

第一:

thetaxz+=(omousex-mouseX)/( width ); 
thetaxy+=(omousey-mouseY)/( height);
(thetaxy是x、y轴上以弧度表示的角度,thetaxz是x、z轴上以弧度表示的角度) (I限制两个角度,使其小于或等于0时等于2*PI)

第二:

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)));
}

if(thetaxz)如果你真的想在这方面取得成功,你必须咬紧牙关,了解和/或。可能还有其他方法可以实现您想要的功能,但是使用旋转矩阵和四元数旋转仅仅是因为它们被广泛理解,并且是表示和应用向量旋转的最简单方法之一。有人能想出的任何其他表现形式都可能是对其中一个或两个的更复杂的重新表述。事实上,它可以表示为旋转,因此可以表示为。四元数旋转只是3D中旋转向量的简化方法,因此具有等效的矩阵表示

这就是说,听起来你对用鼠标点击并以一种自然的方式旋转抓取场景中的对象很感兴趣。如果是这样的话,你应该看看这个方法(你可能想看一下)。这仍然需要你对四元数有所了解。你还会发现,至少对基本方面的理解是有帮助的

更新:根据您的图表及其包含的注释,看起来您真正想要做的就是转换为。只要我们在符号上达成一致,那就容易了。假设θ是你称之为XY的角度,也就是说,X轴绕Z轴旋转的角度;这称为方位角,其范围为[0,2π)弧度或[0°,360°)。设Φ为XY平面与矢量之间的角度;这称为仰角,其范围为[-π/2,+π/2]或[-90°,+90°],与您称为XZ角的角度相对应(在XZ平面中围绕Y轴旋转)。还有其他约定,因此请确保一致。无论如何,转换只是:

x = d∙cos(Φ)∙cos(θ)
y = d∙cos(Φ)∙sin(θ)
z = d∙sin(Φ)

我不是100%这正是您想要的,但我认为您可能需要研究如何根据摄影机矩阵将二维坐标转换为三维坐标。对近距离和远距离摄影机平面上的点执行此操作,然后使用一些三角来沿结果线找到距原点所需距离的点。请注意,有0、1或2个sol但是这个问题的解决办法,取决于线条,你能用图片更清楚地说明原始问题吗?我添加了一个图片链接,因为我只有一个代表,因为我是这个网站的新手。谢谢,但我没有使用opengl,也没有真正抓取对象。我正在旋转场景摄影机,没有转换场景坐标stem。有没有办法从旋转矩阵中获取坐标,因为我可以使用它们?根据你的图表,我想你只是想从球面坐标转换为笛卡尔坐标。我编辑了我的回答,告诉你如何做到这一点。如果你想做任何与鼠标交互的事情,并在这个时间内围绕原点移动相机嗯,我认为你不会得到你所希望的结果。也就是说,我真的认为你最好至少考虑一下ArcBall方法。谢谢你,我在你发布这篇文章之前就发现了这一点,但无论如何,谢谢!我会给你加一的帮助,但我自己还没有足够的代表。我会尝试回来的后来,因为你提供了很多帮助和信息。看来arcball论文的链接已经变成了一个404@Mike“Pomax”Kamermans感谢您让我知道。我找到了另一个来源并更新了链接。祝您愉快。