• ogre3D程序实例解析1-平移旋转与缩放


    接着上篇写

    http://www.cnblogs.com/songliquan/p/3294902.html

      旋转

    这里有必要看一下关于旋转的源代码:

       virtual void pitch(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

       virtual void yaw(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

       virtual void roll(const Radian& angle, TransformSpace relativeTo = TS_LOCAL);

       virtual void translate(const Matrix3& axes, Real x, Real y, Real z, TransformSpace relativeTo = TS_PARENT);

      由以上代码可看出,pitch,yaw,roll旋转是默认是按照局部坐标空间旋转的,而translate则是默认按照父空间坐标平移的。这样下面理解就简单了。

     

     将createScene()的代码删除,为实现旋转,可添加如下代码: 

     1     //旋转
    2
    //1 原始状态,未旋转 3 Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin1","penguin.mesh");// 4 Ogre::SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 5 node1->setPosition(-80,0,0);//设置位置 6 node1->attachObject(ent1);//添加到场景节点 7 //2 向右平移,并绕X轴旋转90度 8 Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin2","penguin.mesh");// 9 Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 10 node2->attachObject(ent2);// 11 node2->translate(-20,0,0);//平移到(-20,0,0) 12 node2->pitch(Ogre::Radian(Ogre::Math::HALF_PI));//绕着x轴旋转90度 13 //3 设置位置,并绕Y轴旋转90度 14 Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin3","penguin.mesh");// 15 Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 16 node3->setPosition(40,0,0);// 17 node3->yaw(Ogre::Degree(90.0f));//绕着y主旋转90度 18 node3->attachObject(ent3); 19 //4 设置位置,并绕Z轴旋转90度 20 Ogre::Entity *ent4 = mSceneMgr->createEntity("penguin4","penguin.mesh");// 21 Ogre::SceneNode *node4 = mSceneMgr->getRootSceneNode()->createChildSceneNode();// 22 node4->setPosition(100,0,0);
    23 node4->roll(Ogre::Radian(-Ogre::Math::HALF_PI));//绕着z轴旋转90度
    24 node4->attachObject(ent4);//

      效果如下:可看到四个小企鹅:  

      代码解释:

      pitch() 让节点绕着x轴绕着逆时针方向旋转90度,c参数Radian代表弧度,math代表数学类,而HALP_PI代表弧度为90。

      yaw() 绕y轴旋转指定的度数,Degree代表角度类

      roll() 绕z轴旋转指定的角度,参数如上

      缩放

      代码如下,主要用到scale()函数

     1         //缩放比例
     2         //1 原始比例
     3         Ogre::Entity *ent1 = mSceneMgr->createEntity("penguin1","penguin.mesh");
     4         Ogre::SceneNode * node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子节点
     5         node1->setPosition(0,0,0);
     6         node1->attachObject(ent1);//将实体对象绑定到场景节点
     7         //2 放大2倍
     8         Ogre::Entity *ent2 = mSceneMgr->createEntity("penguin2","penguin.mesh");
     9         Ogre::SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子场景节点
    10         node2->setPosition(100,0,0);
    11         node2->scale(2,2,2);//放大2倍
    12         node2->attachObject(ent2);//将实体对象绑定到场景节点
    13         //3 缩小一半
    14         Ogre::Entity *ent3 = mSceneMgr->createEntity("penguin3","penguin.mesh");
    15         Ogre::SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode();//创建子场景节点
    16         node3->setPosition(-100,0,0);
    17         node3->scale(0.5,0.5,0.5);//缩小一半
    18         node3->attachObject(ent3);//将实体对象绑定到场景节点

      效果如图:

       代码解释:

      scale() --- 对实体进行缩放,参数也比较简单。

     

     空间变换

      世界坐标空间和父坐标空间的变换:

     1         //空间坐标
     2         //1 节点1
     3         Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
     4         Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//创建节点
     5         node1->setPosition(0,0,450);
     6         node1->yaw(Ogre::Degree(180.0f));//旋转180度,节点1 z轴方向指向屏幕内
     7         mSceneMgr->getRootSceneNode()->addChild(node1);
     8         node1->attachObject(ent1);//将实体对象绑定到场景节点
     9         //2 节点2
    10         Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
    11         Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");//创建子场景节点
    12         node2->setPosition(20,0,0);
    13         //node2->translate(0,0,20,Node::TS_WORLD);//相对于世界坐标空间,而世界坐标空间始终指向屏幕外,故向指向屏幕方向移动20单位
    14         node2->translate(0,0,20);//相对于父节点移动,而node1 z轴方向指向屏幕内,故屏幕内移动20单位
    15         node2->attachObject(ent2);//将实体对象绑定到场景节点  

     效果如图 node2->translate(0,0,20);这样的话是相对于父节点移动,而node1 z轴方向指向屏幕内,故屏幕内移动20单位。

      将代码改为node2->translate(0,0,20,Node::TS_WORLD);这样是相对于世界坐标空间,而世界坐标空间始终指向屏幕外,故向指向屏幕方向移动20单位。效果如图:


     局部坐标空间和父坐标空间

      局部坐标空间 ---- 是针对模型自身的,可用一下代码实验。

      代码如下:

     1         //局部坐标空间变换
     2         Ogre::Entity *ent1 = mSceneMgr->createEntity("Sinbad1","Sinbad.mesh");
     3         Ogre::SceneNode * node1 = mSceneMgr->createSceneNode("node1");//创建节点
     4         node1->setPosition(0,0,400);
     5         node1->yaw(Ogre::Degree(180.0f));//绕y轴顺时针旋转180度,节点1 z轴方向指向屏幕内
     6         node1->pitch(Ogre::Degree(-90.0f));//绕x轴顺时针旋转90度
     7         mSceneMgr->getRootSceneNode()->addChild(node1);
     8         node1->attachObject(ent1);//将实体对象绑定到场景节点
     9 
    10         Ogre::Entity *ent2 = mSceneMgr->createEntity("Sinbad2","Sinbad.mesh");
    11         Ogre::SceneNode *node2 = node1->createChildSceneNode("node2");
    12         node2->yaw(Ogre::Degree(45));//绕y轴旋转45度
    13         node2->translate(0,0,20);//沿z轴正方向平移20 单位,以父坐标空间为基准
    14         node2->attachObject(ent2);
    15 
    16         Ogre::Entity*ent3 =mSceneMgr->createEntity("ent3","Sinbad.mesh");
    17         Ogre::SceneNode*node3 =node1->createChildSceneNode("node3");
    18         node3->yaw(Ogre::Degree(45));//绕y轴旋转45度
    19         node3->translate(0,0,20,Ogre::Node::TS_LOCAL);//以自身坐标空间为基准,沿下图中箭头所指方向平移20单位
    20         node3->attachObject(ent3);    

      效果图如下:

    代码解释:

      可以这样比喻,第一人首先向后转,然后我们切换视角,从上往下看,然后第二人在第一人的基础上直走20单位,而第三人在第一人的基础上,自己先左转了45度,然后直走20单位。

      

      这个空间旋转太绕了,迷了一天终于迷过来了。原来如此。

     

  • 相关阅读:
    30分钟带你了解Docker
    30分钟了解Springboot整合Shiro
    vuejs 和 element 搭建的一个后台管理界面
    MySQL缓存参数优化(转)
    MVC+EF(CODEFIRST)+EASYUI医药MIS系统
    博客园开通打赏功能以及HTTPS打赏失效的探究 -玩转打赏功能
    SpringMVC集成rabbitmq:优化秒杀下单环节
    国内最火5款Java微服务开源项目
    SpringCloud系列——SSO 单点登录
    玩转spring boot
  • 原文地址:https://www.cnblogs.com/songliquan/p/3296510.html
Copyright © 2020-2023  润新知