查看: 908|回复: 12

请教:两个点之间如何画一个圆柱体体,并且随着点运动动态调整

[复制链接]

该用户从未签到

发表于 2014-5-12 10:24:56 | 显示全部楼层 |阅读模式
问题:两个点运动的,两个点之间如何画一个圆柱体体,并且随着点运动动态调整,距离是可以解出来的,但是MT矩阵那块怎么求,例如圆柱体始终指向两个点的方向,。求大神详细讲解,实在搞不懂。不要说得太抽象哦。谢谢了

该用户从未签到

发表于 2014-5-12 10:46:02 | 显示全部楼层
本帖最后由 cenfer 于 2014-5-12 11:00 编辑

你先把两点和圆柱体的关系描述清楚了
例如
1. 两点在圆柱体的回转轴上,半径已知,根据动点计算圆柱体高度和方向,绘制圆柱体;
2. 两点在圆柱体的横切面的圆周上且过直径线,回转轴方向已知,根据动点计算圆柱体半径,绘制圆柱体;

我想你理清楚这些,就知道怎么弄了

该用户从未签到

 楼主| 发表于 2014-5-12 11:20:23 | 显示全部楼层
cenfer 发表于 2014-5-12 10:46
你先把两点和圆柱体的关系描述清楚了
例如
1. 两点在圆柱体的回转轴上,半径已知,根据动点计算圆柱体高 ...

谢谢你的解答,但是还是不能解决我的问题

半径是已知的,但是这个方向我不知道如何确定啊

当2个点变化时,圆柱也会变化,这变化之间有个矩阵,就是知道2个点,不知道如何求这个矩阵。

该用户从未签到

发表于 2014-5-12 11:44:13 | 显示全部楼层
先定义 圆柱体绘制的局部坐标系, 圆柱体底面在xy面上,回转轴和Z轴重合。
如果 动点P1、P2在回转轴上,P1指向P2为正方向

代码示意
        osg::Vec3 P1,P2;
        osg::Vec3 dir = P2 - P1; //方向
        float height = dir.length(); //高度
        dir.normalize();
        osg::Matrix mat = osg::Matrix::rotate(osg::Z_AXIS,dir)*osg;;Matrix::translate(P1);//位姿

        float rad;//已知半径
        osg::Node* shapeNode = shape(height,rad); //自己实现绘制形状节点

        osg::MatrixTransform* matNode = new osg::MatrixTransform;//设置位姿
        matNode->setMatrix(mat);
        matNode->addChild(shapeNode);

该用户从未签到

 楼主| 发表于 2014-5-12 21:06:52 | 显示全部楼层
cenfer 发表于 2014-5-12 11:44
先定义 圆柱体绘制的局部坐标系, 圆柱体底面在xy面上,回转轴和Z轴重合。
如果 动点P1、P2在回转轴上,P1 ...

谢谢你的回答,我明天试下。

该用户从未签到

 楼主| 发表于 2014-5-13 20:58:39 | 显示全部楼层
cenfer 发表于 2014-5-12 11:44
先定义 圆柱体绘制的局部坐标系, 圆柱体底面在xy面上,回转轴和Z轴重合。
如果 动点P1、P2在回转轴上,P1 ...

这个方法不行的吧,osg里是makerotate,而且这个方法要角度和绕着什么方向,这个角度不知道如何确定。

该用户从未签到

发表于 2014-5-13 21:33:35 | 显示全部楼层
rotate和makerotate都是多态的。
有绕一个轴向旋转一个角度构造一个矩阵,
也有从一个方向转到另一个方向构造一个矩阵。

该用户从未签到

发表于 2014-5-13 21:34:37 | 显示全部楼层
rotate是静态方法
makerotate是修改对象自身

该用户从未签到

 楼主| 发表于 2014-5-13 22:04:24 | 显示全部楼层
能详细点吗,谢谢。现在是用makerotate的方法,不知道这个角度如何求出,最好是以代码的形式

该用户从未签到

 楼主| 发表于 2014-5-13 22:06:04 | 显示全部楼层
cenfer 发表于 2014-5-13 21:34
rotate是静态方法
makerotate是修改对象自身

能详细点吗,谢谢。现在是用makerotate的方法,不知道这个角度如何求出,最好是以代码的形式

该用户从未签到

发表于 2014-5-13 22:08:42 | 显示全部楼层
呵呵 你看看头文件就知道了,不知还能怎么详细
不一定非要知道角度 才能求一个矩阵啊

该用户从未签到

发表于 2014-5-13 22:10:48 | 显示全部楼层
各种 makeRotate 根据需求 随便选
       void makeRotate( const Vec3f& from, const Vec3f& to );
        void makeRotate( const Vec3d& from, const Vec3d& to );
        void makeRotate( value_type angle, const Vec3f& axis );
        void makeRotate( value_type angle, const Vec3d& axis );
        void makeRotate( value_type angle, value_type x, value_type y, value_type z );
        void makeRotate( const Quat& );
        void makeRotate( value_type angle1, const Vec3f& axis1,
                         value_type angle2, const Vec3f& axis2,
                         value_type angle3, const Vec3f& axis3);
        void makeRotate( value_type angle1, const Vec3d& axis1,
                         value_type angle2, const Vec3d& axis2,
                         value_type angle3, const Vec3d& axis3);

该用户从未签到

发表于 2014-5-13 22:12:05 | 显示全部楼层
各种 rotate 根据需求 也随便选   
        inline static Matrixd rotate( const Vec3f& from, const Vec3f& to);
        inline static Matrixd rotate( const Vec3d& from, const Vec3d& to);
        inline static Matrixd rotate( value_type angle, value_type x, value_type y, value_type z);
        inline static Matrixd rotate( value_type angle, const Vec3f& axis);
        inline static Matrixd rotate( value_type angle, const Vec3d& axis);
        inline static Matrixd rotate( value_type angle1, const Vec3f& axis1,
                                      value_type angle2, const Vec3f& axis2,
                                      value_type angle3, const Vec3f& axis3);
        inline static Matrixd rotate( value_type angle1, const Vec3d& axis1,
                                      value_type angle2, const Vec3d& axis2,
                                      value_type angle3, const Vec3d& axis3);
        inline static Matrixd rotate( const Quat& quat);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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