2011-12-22 158 views
7

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

第一:

thetaxz+=(omousex-mouseX)/(width); 
thetaxy+=(omousey-mouseY)/(height); 

(thetaxy是弧度在x在x的角度,Y轴和thetaxz,Z轴) (我限制两个角度这样,如果它们小于或等于0它们等于2 * PI)

第二:

pointX=cos(thetaxz)*d; 
pointY=sin(thetaxy)*d; 

(pointX是该点的X坐标和尖尖是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))); 
} 

(平方()是一个函数,平方和ABS()是绝对值函数) (pointZ应该是该点的Z坐标,它是除了在正z之间的交叉半球和负z球。当它接近边缘时,该点被拉伸得比它总是应该在x和y上的距离更长,并且看起来随机地在tazz的0.1-0.2弧度范围内,z坐标变成NAN或未定义)

我有考虑了一段时间,并且如实地说,我很难绕过四元数和旋转矩阵的概念,但是如果你能告诉我如何使用它们来产生实际的坐标,我很乐意学习。如果我可以在几个轴上使用一些三角函数,我仍然会更喜欢它。提前感谢您的帮助,如果您需要更多信息,请直接询问。

提示/最后一分钟的想法:我认为这可能与影响x和y位置的z位置有关,但我不确定。

编辑:我画了一张图: enter image description here

+0

我不是100%,这正是你想要的,但我想你可能想看看[gluUnProject](http://nehe.gamedev.net/article/using_gluunproject/16013 /)将2D坐标转换为基于相机矩阵的3D坐标。对近远相机平面上的一个点执行此操作,然后使用一些三角函数来查找沿着结果线的距离原点所需距离的点。请注意,对于此问题,有0,1或2种解决方案,具体取决于行 – Hybrid 2011-12-22 10:40:08

+3

您是否可以用图片说明原始问题更清楚些? – 2011-12-22 10:57:16

+0

我添加了一个图片链接,因为我只有1个代表,因为我是这个网站的新手。 – 2011-12-22 22:16:35

回答

5

如果你真的想在这个任何的成功,你将不得不硬着头皮了解rotation matrices和/或quaternion rotations。可能有其他方法来做你想做的事情,但旋转矩阵和四元数旋转的使用仅仅是因为它们被广泛理解,并且是表达和应用旋转到矢量的最简单手段之一。有人可以提出的任何其他表述可能会更复杂一个或两个这样的表述。事实上,它可以显示旋转是一个linear transformation,所以可以表示为matrix。四元数旋转只是在3D中旋转矢量的简化方法,因此具有等效的矩阵表示。

这就是说,您听起来像是有兴趣通过鼠标单击并以自然方式旋转来抓取场景中的对象。如果是这种情况,你应该看看ArcBall方法(有numerous examples你可能想看看)。这仍然需要你知道一些四元数。你也会发现对linear algebra的基本方面至少有一点理解是有帮助的。

更新:根据你的图表,它包含的评论上,它看起来像你真的想要做的是Spherical Coordinates转换为Cartesian Coordinates。只要我们同意这个表示法,那很容易。让θ为您称为XY的角度,即X轴围绕Z轴旋转的角度;这被称为方位角,并且将在[0,2 π)弧度范围内或[0 °,36°)。假设φ是XY平面和矢量之间的角度;这称为仰角,将在[ - π/2,+ π/2]或[-90 °,+90 °]范围内,它对应于您称为XZ角度的角度(在XZ平面围绕Y轴)。还有其他的约定,所以要确保你是一致的。不管怎样,转换很简单:

x = d∙cos(φ)∙cos(θ) 
y = d∙cos(φ)∙sin(θ) 
z = d∙sin(φ)
+0

谢谢,但我没有使用opengl,而且我也没有真正抓住一个物体,我正在旋转场景摄影机而不是转换场景坐标系。有没有办法从旋转矩阵中获取坐标,因为那样我就可以使用它们了? – 2011-12-22 22:13:31

+0

根据您的图表,我认为您只是想从球面坐标转换为笛卡尔坐标。我编辑了我的回复,告诉你如何做到这一点。如果你正在尝试用鼠标进行任何互动操作,并以这种方式移动你的相机的原点,我认为你不会得到你期望的结果。也就是说,我真的认为,至少考虑ArcBall方法会更好。 – andand 2011-12-23 05:09:35

+0

谢谢,我在你发布之前就已经想出了这个问题,不过谢谢!我会给你加上很大的帮助,但是我自己还没有足够的代表。我会尽力回复,因为你非常有帮助和信息丰富。 – 2011-12-27 20:37:29