查看: 1056|回复: 5

各位大神,请抽空指导指导~。~

[复制链接]

该用户从未签到

发表于 2011-12-27 14:10:50 | 显示全部楼层 |阅读模式
各位大神好:
    小弟最近在学习osg的fbx骨骼动画,遇到如下几个问题:

    1. 导出的fbx人物在场景中是横躺着,通过实验知道几种解决方法(在osg程序了旋转模型,或者在导出的时候选择Z-up或者Y-up)前面一种实验成功,但是后面一种怎么弄都没反映,由于想在程序里控制人物行走,也需要矩阵计算,这样和前面的旋转人物的矩阵计算起了冲突,不知道有什么解决方法?

    2. 关于动作分段的问题,听威哥大神说过可以用整个动作以关键帧时间分段,可惜小弟的程序功底不好,不知道怎么去实现,有没有类似的例子供参考呢?  还听说可以用Motionbuilder来制作带多个动作的fbx文件,不知道具体的步骤是?

    3. 还有就是跟随摄像头的问题,怎么实现摄像头随着人的移动而移动,有没有实例?
  
    4。控制人物前后左右移动怎么实现呢?通过实验,解决了左右旋转问题,但是前后走还解决不了,尝试了以下方法,但是只有左右旋转效果,没有前后移动效果。

class UseEventHandler : public osgGA::GUIEventHandler
{
public:
        UseEventHandler(osg::MatrixTransform* tankPosistion)
        {
                trans=tankPosistion;
                trans->setMatrix(osg::Matrix::translate(0,0,7));
                //trans->setMatrix(osg::Matrix::rotate(osg:I_2,osg::Vec3(1,0,0)));
                m_tankPosistion=osg::Vec3(0,0,7);
                tankSpeed=0.2;
                m_fAngle=0;

                btnUP=false;
                btnDOWN=false;
                btnLEFT=false;
                btnRIGHT=false;
        }
        virtual bool handle(const osgGA::GUIEventAdapter & ea,osgGA::GUIActionAdapter & aa)
        {
                switch (ea.getEventType())
                {
                case osgGA::GUIEventAdapter::KEYDOWN:
                        {
                                if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                                {
                                        btnUP=true;
                                        return true;
                                }
                                if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
                                {
                                        btnDOWN=true;
                                        return true;
                                }
                                if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
                                {
                                        btnLEFT=true;
                                        return true;
                                }

                                if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
                                {
                                        btnRIGHT=true;
                                        return true;
                                }
                                return false;
                case osgGA::GUIEventAdapter::KEYUP:
                        if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                        {
                                btnUP=false;
                                return true;
                        }
                        if (ea.getKey() == 0xFF54 || ea.getKey () == 0x53 || ea.getKey () == 0x73 )//down
                        {

                                btnDOWN=false;
                                return true;
                        }
                        if (ea.getKey () == 0x41||ea.getKey () == 0x61) //A
                        {
                                btnLEFT=false;
                                return true;
                        }

                        if (ea.getKey () == 0x44||ea.getKey () == 0x64)//D
                        {
                                btnRIGHT=false;
                                return true;
                        }               
                        }
                        break;
                default:
                        break;
                }
                if (btnUP)
                {
                        m_tankPosistion+=osg::Vec3(tankSpeed*cosf(osg:egreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg::DegreesToRadians(m_fAngle+90)),0);

                        trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));
                }

                if (btnDOWN)
                {
                        m_tankPosistion-=osg::Vec3(tankSpeed*cosf(osg::DegreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg::DegreesToRadians(m_fAngle+90)),0);

                        trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));
                }

                if (btnLEFT) //A
                {
                        m_fAngle -= 1 ;

                        trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));

                        return true;
                }

                if (btnRIGHT)//D
                {

                        m_fAngle += 1 ;

                        trans->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(m_fAngle),0,0,1)*osg::Matrix::translate(m_tankPosistion));

                        return true;
                }
                return false;
        }
private:
        float tankSpeed;
        osg::MatrixTransform* trans;
        osg::Vec3 m_tankPosistion;
        float m_fAngle;
private:
        bool btnUP;
        bool btnDOWN;
        bool btnLEFT;
        bool btnRIGHT;
};

该用户从未签到

 楼主| 发表于 2012-1-9 17:08:26 | 显示全部楼层
已解决问题1,2,期待着帮忙解决3,4

该用户从未签到

发表于 2012-1-10 08:54:44 | 显示全部楼层
3. 还有就是跟随摄像头的问题,怎么实现摄像头随着人的移动而移动,有没有实例?
NodeTrackerManipulator

该用户从未签到

发表于 2012-1-10 09:02:23 | 显示全部楼层
本帖最后由 fenma3422 于 2012-1-10 09:05 编辑
m_tankPosistion-=osg::Vec3(tankSpeed*cosf(osg:egreesToRadians(m_fAngle+90)),tankSpeed*sinf(osg:egreesToRadians(m_fAngle+90)),0);

直接用旋转找出前后向量,然后加一下不行啊?如果要限制在平面内,投影一下就可以了,你这样让人很费解,不直观,而且很容易出错

该用户从未签到

 楼主| 发表于 2012-2-22 20:10:44 | 显示全部楼层
fenma3422 发表于 2012-1-10 09:02
直接用旋转找出前后向量,然后加一下不行啊?如果要限制在平面内,投影一下就可以了,你这样让人很费解, ...

嗯 好的,我试试。我前面的也是可以的,一开始就是设置的速度值太小,看不到效果。

该用户从未签到

 楼主| 发表于 2012-2-22 20:11:25 | 显示全部楼层
fenma3422 发表于 2012-1-10 09:02
直接用旋转找出前后向量,然后加一下不行啊?如果要限制在平面内,投影一下就可以了,你这样让人很费解, ...

3q,i will goto hava a look
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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