首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算旋转来看三维点?

计算旋转来看三维点?
EN

Stack Overflow用户
提问于 2009-08-09 17:41:10
回答 3查看 34.6K关注 0票数 12

我需要计算一个三维物体面对任意三维点的两个角度(偏航和俯仰)。这些旋转被称为“欧拉”旋转,仅仅是因为在第一次旋转之后(比如Z,根据下面的图片)Y轴也和物体一起旋转。

这是我正在使用的代码,但它不能完全工作。当物体在地面上(Y = 0)正确旋转以面对点时,当我在Y中向上移动点时,旋转看起来就不正确了。

代码语言:javascript
复制
// x, y, z represent a fractional value between -[1] and [1]
// a "unit vector" of the point I need to rotate towards

yaw = Math.atan2( y, x )
pitch = Math.atan2( z, Math.sqrt( x * x + y * y ) )

你知道如何计算给定点的2欧拉角吗?

下面的图片显示了我旋转的方式。这些是我需要计算的角度。(唯一的区别是,我按X,Y,Z的顺序旋转物体,而不是Z,Y,X)

这是我的系统。

backward

  • rotations的
  • 坐标系为x=向右,y=向下,z=进一步向后的
  • (0,0,1),它面对的是X,Y,Z的顺序是X,Y,Z,其中X上的旋转是俯仰,Y是偏航,Z是滚动的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-26 08:30:23

以下是我的工作假设:

  • 坐标系(x,y,z)是这样的,正x在右边,正y向下,z是剩余的方向。特别是,y=0是地面平面。
  • (0,0,0,0)是指(0,0,0,1)当前面向(0,0,1)的物体被转向(x,y,z)。为了实现这一点,
  • 将围绕x轴旋转,然后绕y轴旋转。最后,围绕z轴旋转,以使物体直立。

(术语偏航、俯仰和滚动可能会令人困惑,所以我想避免使用它,但粗略地说,对应关系是x=pitch、y=yaw、z=roll。)

鉴于这种设置,下面是我解决您的问题的尝试:

代码语言:javascript
复制
rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )

希望这是正确的迹象。我认为最简单的解决路标的方法是反复试验。实际上,你似乎在rotxroty上得到了正确的标记--包括关于z的一个微妙的问题--所以你只需要在rotz上修复这个标志。

我希望这是非常重要的(可能取决于您所处的位置),但是在说它是错误之前,请尝试一些可能性。祝好运!

这是最后对我起作用的代码。

当物体从任何前象限(正Z)移动到任何后象限时,我注意到了一个“翻转”效应。在前象限中,对象的总是面对点。在后象限中,对象的向后总是面向点的。

这段代码纠正了翻转效果,因此对象的前面始终是面对的点。我经历了反复的尝试,所以我真的不知道发生了什么!

代码语言:javascript
复制
 rotx = Math.atan2( y, z );
 if (z >= 0) {
    roty = -Math.atan2( x * Math.cos(rotx), z );
 }else{
    roty = Math.atan2( x * Math.cos(rotx), -z );
 }
票数 15
EN

Stack Overflow用户

发布于 2009-08-09 23:15:50

富卖家的答案告诉你如何旋转一个点从一个三维坐标系到另一个系统,给定一组描述两个坐标系之间旋转的欧拉角。

但听起来你要求的是不同的东西:

你有:一个点的三维坐标

你想要:一组欧拉角

如果这就是你想要的,你就没有足够的信息。要找到欧拉角,你需要至少两个点的坐标,在两个坐标系中,确定从一个坐标系到另一个坐标系的旋转。

你也应该注意到,欧拉角可能是模棱两可的:里奇的答案假设旋转适用于Z,然后X',然后Z',但这是不标准化的。如果您必须使用Euler角度与其他代码进行互操作,则需要确保您使用的是相同的约定。

您可能需要考虑使用旋转矩阵或四元数来代替欧拉角。

票数 7
EN

Stack Overflow用户

发布于 2009-09-02 00:50:02

说到轴的旋转,我认为第三步应该是X'-,Y‘-和Z’-轴围绕Y‘-轴的旋转。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1251828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档