查看: 1971|回复: 16

路径漫游 朝向问题

[复制链接]

该用户从未签到

发表于 2013-10-10 10:20:27 | 显示全部楼层 |阅读模式
知道三维空间中 一系列 三维点  然后我想设置 路径  朝向就是根据下一点和当前点 来计算的  就是从当前点朝向下一点的方向
代码如下

  1. osg::Matrixf matrix;
  2. matrix.makeRotate(positionCur, positionNext);
  3. animationPath->insert(time, osg::AnimationPath::ControlPoint(positionCur, matrix.getRotate()));
复制代码
positionCur positionNext 是当前点和下一点
运行效果 朝向不正确啊  请问哪出问题了 谢谢

该用户从未签到

 楼主| 发表于 2013-10-14 22:27:54 | 显示全部楼层
wangshaomeng 发表于 2013-10-14 21:49
我也这样试过,这样定义这个四元数不正确,应该是用方向向量的单位向量。方向向量若不单位化,总会时不时 ...
  1. osg::Vec3 eye;

  2.   osg::Vec3 center;
  3.         
  4.   osg::Vec3 direction=center-eye;
  5.   direction.normalize();

  6.   osg::Vec3 right=direction ^ osg::Vec3(0,0,1);
  7.   right.normalize();

  8.   osg::Vec3 up=right ^ direction;
  9.   up.normalize();

  10.   osg::Matrix mat(right[0],up[0],-direction[0],0,
  11.                right[1],up[1],-direction[1],0,
  12.                right[2],up[2],-direction[2],0,
  13.                0,0,0,0
  14.    );

  15.   osg::Quat rotate=mat.getRotate().inverse();
复制代码
找到了一个博客 通过eye和center 求quat的 你可以试试 另外 求解一个向量的单位向量 直接调用normalize()就可以了 不需要算长度 再除

该用户从未签到

发表于 2013-10-11 09:59:52 | 显示全部楼层
当您使用makeRotate(v1, v2)的时候,其意义是求取向量v1旋转到向量v2的旋转值。这里您直接使用坐标点显然是不对的

该用户从未签到

发表于 2013-10-12 15:30:50 | 显示全部楼层
我是先用两个点的方向向量,计算与各轴的夹角,然后用osg:uat设置方向,感觉有点麻烦,不知道有好点的方法没

该用户从未签到

 楼主| 发表于 2013-10-12 21:22:00 | 显示全部楼层
array 发表于 2013-10-11 09:59
当您使用makeRotate(v1, v2)的时候,其意义是求取向量v1旋转到向量v2的旋转值。这里您直接使用坐标点显然是 ...

明白了。那这里应该怎么写啊? 只知道每个关键点的位置 怎么设置朝向啊

该用户从未签到

 楼主| 发表于 2013-10-12 21:26:15 | 显示全部楼层
wangshaomeng 发表于 2013-10-12 15:30
我是先用两个点的方向向量,计算与各轴的夹角,然后用osg:uat设置方向,感觉有点麻烦,不知道有好点的方法 ...

可以发给我代码学习下么? 谢谢  lieren523@sina.com

该用户从未签到

发表于 2013-10-14 17:29:23 | 显示全部楼层
一大波蓝猫 发表于 2013-10-12 21:26
可以发给我代码学习下么? 谢谢

我发了一些,你要有更好的方法可以分享我学习一下

该用户从未签到

 楼主| 发表于 2013-10-14 20:07:03 | 显示全部楼层
wangshaomeng 发表于 2013-10-14 17:29
我发了一些,你要有更好的方法可以分享我学习一下

收到了! 写的非常详细! 十分感谢!  至于新方法  其实觉得数组哥说的这个方法也可以 就是利用两个关键点各自的向量 计算出v1到v2的变换矩阵 即makeRotate(v1, v2) 应该行得通

该用户从未签到

 楼主| 发表于 2013-10-14 20:47:57 | 显示全部楼层
本帖最后由 一大波蓝猫 于 2013-10-14 21:51 编辑

谢谢了 我得再研究研究其他方法。。有新方法再告诉你

该用户从未签到

发表于 2013-10-14 21:49:40 | 显示全部楼层
一大波蓝猫 发表于 2013-10-14 20:47
貌似这样就可以了 下一点减去当前点就是当前的朝向向量  然后四元数有vec4的构造 直接赋值就可以了 你试试 ...

我也这样试过,这样定义这个四元数不正确,应该是用方向向量的单位向量。方向向量若不单位化,总会时不时的出一大堆问题。

该用户从未签到

 楼主| 发表于 2013-10-14 22:03:37 | 显示全部楼层
wangshaomeng 发表于 2013-10-14 21:49
我也这样试过,这样定义这个四元数不正确,应该是用方向向量的单位向量。方向向量若不单位化,总会时不时 ...

嗯 想了想确实不对。。起码这个方向向量只是确定了eye 和 center  并没提供up的信息 ,,所以感觉 光知道关键点的信息 不可能确定 关键点的quat啊。。

该用户从未签到

发表于 2013-10-15 10:43:34 | 显示全部楼层
一大波蓝猫 发表于 2013-10-14 22:27
找到了一个博客 通过eye和center 求quat的 你可以试试 另外 求解一个向量的单位向量 直接调用normalize() ...

多谢,多谢,我用osg没多久,没注意到normalize(), 还有length()这些函数都封装好了,这样就方便多了

该用户从未签到

发表于 2014-1-16 17:52:50 | 显示全部楼层
你好,您是在osg上还是在osgEarth上啊,osg上我能用,但是到osgEarth上就不行了,不知道在osgEarth上怎么算的。。

该用户从未签到

发表于 2014-1-16 17:54:11 | 显示全部楼层
        ve=(*vt)[i+1]-(*vt)[i];
                        osg::Vec3 teoxy = osg::Vec3(ve.x(),ve.y(),0.0);
                        quatxy.makeRotate(or1,teoxy);
                        quatz.makeRotate(teoxy,ve);
path->insert(i,osg::AnimationPath::ControlPoint((*vt)[i],quatxy*quatz));就可以解决

该用户从未签到

发表于 2014-3-19 16:11:16 | 显示全部楼层
VPBBIT 发表于 2014-1-16 17:54
ve=(*vt)-(*vt);
                        osg::Vec3 teoxy = osg::Vec3(ve.x(),ve.y(),0.0);
                        quatxy.makeRotate(or1,teoxy ...

你好,你能把你的这个代码写详尽点么。非常想弄清楚这个东东啊。
如果方便的话发我邮箱一下吧,谢谢。
449084716@qq.com

该用户从未签到

发表于 2014-3-20 09:45:25 | 显示全部楼层
nie 发表于 2014-3-19 16:11
你好,你能把你的这个代码写详尽点么。非常想弄清楚这个东东啊。
如果方便的话发我邮箱一下吧,谢谢。

已经很详细了。。。

该用户从未签到

发表于 2014-3-20 10:26:44 | 显示全部楼层
VPBBIT 发表于 2014-3-20 09:45
已经很详细了。。。

谢谢,仔细琢磨了下AnimationPath,已经搞定了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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