查看: 3192|回复: 13

求助!一个简单的向量旋转的问题

[复制链接]

该用户从未签到

发表于 2011-3-20 10:59:05 | 显示全部楼层 |阅读模式
本帖最后由 口口广大 于 2011-3-20 11:12 编辑

如下图,已知某白色点的位置osg::Vec3 pos1,姿态osg:uat att1,以及该点的北向量osg::Quat NothUp。

想求两个绿色点的位置osg::Vec3 pos2,osg::Vec3 pos3,这两点离白点的距离是10,且两点与白点的连线同时垂直于姿态osg::Quat att1,以及白点的北向量osg::Quat NothUp,也就是和白点同在一个水平面。

不知说清楚了没有,就是玩打飞机游戏时,飞机两边会出现两个“儿子”一样的小飞机,呵呵,他们和飞机的飞行轨迹和姿态是一样的,且始终处在同一平面,只是看起来各在飞机两侧有一段距离。谢谢!
旋转.jpg

该用户从未签到

发表于 2011-3-20 21:14:50 | 显示全部楼层
本帖最后由 rcyboom 于 2011-3-20 21:18 编辑

假设航向为向量M
pos2=(M×up).normailze*10+pos1
就是两个向量叉乘得到平面法线,归一化后缩放适合的长度(10)然后平移到飞机位置pos1就是pos2或pos3的坐标啦,取反就是另外一个所需的坐标。
既然有姿态att1,那么up就应该是变化的,应该不能直接使用吧
直接用姿态att1和初始化时候的航向和up得到最新的航向和UP。

该用户从未签到

发表于 2011-3-21 08:54:59 | 显示全部楼层
我想您只要在同一个Transform节点下添加多个飞机节点,然后设置它们不同的平移距离就可以了

该用户从未签到

发表于 2011-3-21 09:50:20 | 显示全部楼层
BINGO

该用户从未签到

 楼主| 发表于 2011-3-21 12:58:17 | 显示全部楼层
本帖最后由 口口广大 于 2011-3-21 18:13 编辑

谢谢 rcyboom !

您的方法我也想到了,只是M×up是两个向量之间的叉乘。而我现在的姿态att1和北向量NorthUp都是四元数,航向的向量M倒是知道,NorthUp是通过att1实时确定的。如何将四元数NorthUp转化成vec3 up向量呢?能不能用一个osg::Vec3 直接叉乘一个四元数?谢谢!

谢谢array ,我并不是想添加飞机节点,只是举个例子,实际的想是在两个儿子节点上画其他的几何体

该用户从未签到

发表于 2011-3-21 15:23:56 | 显示全部楼层
只是举个例子,实际的想是在两个儿子节点上画其他的几何体
那有什么区别呢,使用简单的矩阵级联就足以了

该用户从未签到

 楼主| 发表于 2011-3-21 15:50:02 | 显示全部楼层
本帖最后由 口口广大 于 2011-3-21 18:14 编辑
那有什么区别呢,使用简单的矩阵级联就足以了
array 发表于 2011-3-21 15:23


实际上我就想知道pos2,pos2两点的位置,然后连一条线就行了,而且这两个点都是在地心坐标系下,北向量一直在变化。


关键是我已知北向量是一个四元数,不知道该怎么转化成vec3用叉乘,谢谢!能不能用一个osg::Vec3 直接叉乘一个四元数?谢谢!

该用户从未签到

发表于 2011-3-21 21:15:29 | 显示全部楼层
osg里面貌似应该有直接用四元数乘以向量得到旋转后的向量的函数的吧。
我还没研究过,我是osg新手。不过四元数是可以转换为相应的旋转矩阵的,这个我可以肯定。初始向量和这个矩阵相乘不就是结果么?
你可以看一下文档或者自己实现一个四元数转矩阵的函数,这样子也有利于四元数的理解。

该用户从未签到

发表于 2011-3-22 08:27:56 | 显示全部楼层
可以用quat * vec3,得到的就是向量绕这个四元数旋转后的结果

该用户从未签到

 楼主| 发表于 2011-3-22 13:05:03 | 显示全部楼层
回复 9# array


    绕四元数旋转多少度呢?

该用户从未签到

发表于 2011-3-22 14:38:12 | 显示全部楼层
你看看四元数的定义,前三个是轴向量,最后一个是角度吧

该用户从未签到

 楼主| 发表于 2011-3-23 13:13:26 | 显示全部楼层
本帖最后由 口口广大 于 2011-3-23 13:14 编辑

以下是我利用矩阵旋转的思路,但是得不到理想结果,不知道哪里出问题,请大家看看,谢谢!

  1. osg::Matrix mat1;                    //定义一个单位矩阵
  2. osg::Quat att1 = osg::Quat(osg::PI_2,osg::Vec3(0.0,0.0,1.0));  //先绕着Z轴转90度
  3. att1 = att1*localLookUp;          //由于是地心坐标系,再乘上一个此时的北向量。
  4. mat1.makeRotate(att1);          //四元数转化为单位矩阵

  5. osg::Vec3d M ;                   //航向向量M,已知
  6. M = M*mat1;            //乘以旋转矩阵,此刻即想实现两个向量叉乘得到平面法线同等的效果
  7. M.normalize();              //归一化

  8. osg::Vec3d pos2 = pos1+10*M;        //坐标平移
  9. osg::Vec3d pos3 = pos1-10*M;
复制代码

该用户从未签到

发表于 2011-3-23 14:55:32 | 显示全部楼层
  1. att1 = att1*localLookUp;          //由于是地心坐标系,再乘上一个此时的北向量。
复制代码
我很诧异这句话居然能编译通过?您的localLookUp是Vec3类型吗?那么乘法操作的返回值显然应该是经过旋转后的新Vec3向量

该用户从未签到

 楼主| 发表于 2011-3-23 15:42:13 | 显示全部楼层
本帖最后由 口口广大 于 2011-3-23 18:57 编辑
我很诧异这句话居然能编译通过?您的localLookUp是Vec3类型吗?那么乘法操作的返回值显然应该是经过旋转后的 ...
array 发表于 2011-3-23 14:55



    localLookUp是个四元数,表示地心坐标系下点pos1的北向量。

    解决了!原来一直执着把localLookUp这个四元数转化成osg::Vec3,后来发现osg::Vec3 pos1与地心原点的连线不就是该点的北向量嘛,哈哈,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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