我知道有很多关于3d旋转的问题已在这里得到解答,但它们似乎都处理OpenGL中的旋转矩阵和四元数(我并不关心我是否得到万向节锁定)。我需要获得一个始终必须是相同距离的点的三维坐标EX:(x,y,z),我现在称之为“d”,来自原点。我输入的唯一信息是鼠标在屏幕上的deltax和deltay。到目前为止,这是我尝试过的:
首先:
thetaxz+=(omousex-mouseX)/( width );
thetaxy+=(omousey-mouseY)/( height);
(thetaxy是x,y轴上的弧度角和x,z轴上的thetaxz) (我限制两个角度,如果它们小于或等于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)));
}
(sq()是square和abs()是绝对值函数的函数) (pointZ应该是点的z坐标,除了在正z半球和负z半球之间的交叉处。当它接近边缘时,点被拉伸得比它在x和y中总是应该处于的距离更远。并且看似随机地围绕thetaxz的0.1-0.2弧度,z坐标变为NAN或未定义)
我已经考虑了一段时间了,说实话我很难绕过四元数和旋转矩阵的概念,但如果你能告诉我如何使用它们来生成实际坐标,我很乐意学习。如果我可以在几个轴上使用一些三角法,我仍然会更喜欢它。提前感谢您的帮助,如果您需要更多信息,请询问。
提示/最后一刻的想法:我认为这可能与影响x和y位置的z位置有关,但我不确定。
编辑:我画了一张图:答案 0 :(得分:7)
如果您真的希望在此方面取得任何成功,那么您将不得不咬紧牙关并了解rotation matrices和/或quaternion rotations。可能还有其他方法可以做你想要的,但旋转矩阵和四元数旋转的使用只是因为它们被广泛理解,并且是表达和应用向量旋转的最简单方法。某人可以提出的任何其他陈述可能是对这些中的一个或两个的更复杂的重新表述。事实上,它可以显示为linear transformation,因此可以表示为matrix。四元数旋转只是在3D中旋转矢量的简化方法,因此具有等效的矩阵表示。
也就是说,听起来你有兴趣通过鼠标点击并以自然的方式旋转来抓取场景中的物体。如果是这种情况,您应该查看ArcBall方法(您可能需要numerous examples查看)。这仍然需要你知道四元数的一些东西。您还会发现至少对linear algebra基本方面的理解很有帮助。
更新:根据您的图表及其中包含的评论,看起来您真正要做的就是将Spherical Coordinates转换为Cartesian Coordinates。只要我们就符号达成一致,那就很容易了。设θ为您调用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(φ)