空间三维向量的旋转角度问题?

feigleund 2008-05-27 08:05:09
本人遇到一个问题,关于空间三维向量旋转角度问题, a(x1,y1,z1) 旋转到b(x2,y2,z2)怎样来确定他们的角度?
angle = arccos(dot(n1,n2))
由此得到的夹角值的范围是[0,PI]之间,由于我现在处理的是向量,它们之间的夹角的实际值域应该在[0,2PI]之间,请问如何计算得到两个向量的夹角在[0,2PI]之间?
别人提供的办法不合适
******************************************************
补充说明一下,在本人的blog当中的算法公式是:

theta = atan2 ( (a×b) *N, a*b )
这里面,N是a,b所在平面的单位法向量(这个方向也许和a×b相同,也许相反的)
也就是把a旋转theta到达b方向时候的转轴

当a和b是任意的空间向量,而N是未知的时候,一般取a×b作为旋转轴
那么这个时候,不需要上面的公式,只需要计算
theta = acos(a*b/|a|/|b|)
结果是0到Pi
而事实上,按照a×b作为转轴旋转的时候,角度只会是0到Pi之间的
×××××××××××××××××××××××××××××××××××××××××××××××××××××
定义:平面上的三点P1(x1,y1),P2(x2,y2),P3(x3,y3)的面积量:
|x1 x2 x3|
S(P1,P2,P3) = |y1 y2 y3| = (x1-x3)*(y2-y3) - (y1-y3)(x2-x3)
|1 1 1|
当P1P2P3逆时针时S为正的,当P1P2P3顺时针时S为负的。

所以你只要算S(N2,0,N1)的值,
如果大于或等于0,angle = arccos(dot(n1,n2)),
小于0,则angle = 2PI - arccos(dot(n1,n2))
××××××××××××××××××××××××××××××××××××××××××××××××××××××
请问有没有啥好办法?谢谢指教


...全文
3519 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamboy110 2010-09-03
  • 打赏
  • 举报
回复
结了还让发不?
feigleund 2008-05-29
  • 打赏
  • 举报
回复
sorry , I have got the point, thanks very much!
feigleund 2008-05-28
  • 打赏
  • 举报
回复
谢谢大家的建议
不过还是有疑问
一楼的朋友:n1Xn2(叉乘)如何来确定正负?它们相乘是个向量。
二楼的朋友:平面的法向量怎么来确定求出?我认为平面的法向量是自己定义,如果从沿着法向量的方向看去a逆时针旋转theta角度到b,theta的范围是0~2pi,这种情况下,N和a×b反向( 我就是要解决这个问题)。现在按您说的,如果N和a×b反向,则只能确定pi~2pi的范围,还是不能完成0~2pi计算。
我还是不明白法向量是怎么确定,难道N可以在a到b旋转的过程中改变方向?
请指教,thanks!
virtualfunction 2008-05-27
  • 打赏
  • 举报
回复
1、(a×b).N>0 a×b与N(平面法向量) 同向:
(1)、如果a.b>=0 角度在0~pi/2之间;
(2)、如果a.b<0 角度在pi/2~pi之间;
2、(a×b).N<0 a×b与N 反向:
(1)、如果a.b>=0 角度在3pi/2~2pi之间;
(2)、如果a.b<0 角度在pi~3pi/2之间;
DRACULAX05 2008-05-27
  • 打赏
  • 举报
回复
arccos(dot(n1,n2)) 就可以,你只要再判断一下 n1 * n2(叉积)的正负就可以判断这个角在0-PI还是PI-2PI

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧