查看: 1429|回复: 13

一个非常难的相对角度问题

[复制链接]

该用户从未签到

发表于 2010-8-31 17:42:01 | 显示全部楼层 |阅读模式
如下面的附图,一个向量V0,它最开始和X轴重合,先饶Z轴旋转R1角度,得到向量V1。然后向量V1饶水平轴(一个新的X轴)旋转R2角度,得到V2,如何求出V2相对于V0的角度?我只要计算出角度即可。

这里最好不要使用osg的四元数来计算,我这段代码根本没有使用OSG。
1.JPG

该用户从未签到

 楼主| 发表于 2010-8-31 17:44:09 | 显示全部楼层
上图中,V0到V1的旋转,旋转轴就是Z轴,也就是说,这是一个水平旋转。

然后V1到V2的旋转,旋转轴是(V1 ^ V2),这将是一个垂直旋转。

该用户从未签到

发表于 2010-9-1 00:13:32 | 显示全部楼层
设两者夹角为a  
则有:cos a=cos R1 *cos R2;
不知对否。

该用户从未签到

发表于 2010-9-1 08:40:06 | 显示全部楼层
任何时候,只要您知道v0和v2的值,就可以使用向量点积的概念来进行运算:
v0 * v2 = |v0|*|v2|*cosA
因此可以得到cosA的值,即两者的夹角

该用户从未签到

发表于 2010-9-1 08:41:30 | 显示全部楼层
这个好像不是很难吧。

该用户从未签到

发表于 2010-9-1 08:52:51 | 显示全部楼层
我觉得您自己已经分析的很透彻了,这里仅仅涉及一个饶任意轴旋转的问题。

该用户从未签到

发表于 2010-9-1 08:55:37 | 显示全部楼层
您可以在网上找一些矩阵类,这个问题就很容易解决了。

该用户从未签到

 楼主| 发表于 2010-9-1 09:56:02 | 显示全部楼层
任何时候,只要您知道v0和v2的值,就可以使用向量点积的概念来进行运算:
v0 * v2 = |v0|*|v2|*cosA
因此可以得到cosA的值,即两者的夹角
array 发表于 2010-9-1 08:40


这里V0可以直接假定为(1,0,0),但是V2是要计算出来的,我现在的麻烦就是计算V2了。

至于说用到矩阵之类的什么东西,其实我觉得这里不应该那么做,我连四元数都不想用,我觉得这个问题就通过普通的三角函数就可以直接完成。

该用户从未签到

发表于 2010-9-1 10:22:49 | 显示全部楼层
在三维空间中,仅仅三角函数是很难适用的,因为分支情况很多;建议您还是实现简单的四元数和矩阵计算类,比起埋在sin和cos中苦寻要方便得多

该用户从未签到

发表于 2010-9-1 21:34:58 | 显示全部楼层
不得不顶Array,四元数真是个好东西,深有体会。

该用户从未签到

 楼主| 发表于 2010-9-2 11:07:18 | 显示全部楼层
本帖最后由 yin_savage 于 2010-9-2 11:12 编辑

我的旋转角度是有其取值范围的,比如附图中的R1和R2两个旋转角度只可能在-180~180度之间。有了这种取值约束,很多问题可以简化了。 最终其实我已经解决了问题,使用三角函数互换,代码还是很简单的:
const Vec3 vec1(cos(fltR1), sin(fltR1), 0.0f);
const Vec3 vec2(vec1.x * cos(fltR2), vec1.y * cos(fltR2), sin(fltR2));
const float fltCosAngle = vec1 * vec2;
const float fltAngle = acos(fltCosAngle);

return fltAngle;

上述代码初步测试也没有发现什么问题。

该用户从未签到

发表于 2010-9-2 11:27:11 | 显示全部楼层
感谢分享经验~~
在0度或者其他边沿极限角度也该考虑下bug问题

该用户从未签到

发表于 2010-9-2 20:48:53 | 显示全部楼层
楼主的代码虽然很简单,但是缺乏可读性。

而且,是否正确也有待验证。

该用户从未签到

发表于 2010-9-2 20:50:46 | 显示全部楼层
建议楼主学习下矩阵的相关知识,这是个很简单的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表