OpenSceneGraph控制模型

OpenSceneGraph控制模型

转自:http://www.cppblog.com/eryar/archive/2012/05/28/176538.html

一、简介

对模型的控制就是修改模型的位置和方向属性,使模型的位置和方向发生改变,通常通过移动、旋转、缩放来实现。在三维CAD软件中通常要对模型的位置进行修改,如装配模型时把其中一个零件模型移动一个位置。由计算机图形学知识得三维图形的几何变换可用一个四阶齐次矩阵来表示,即模型的几何变换都是对矩阵进行操作。

二、OSG模型控制

OSG中,加入模型的默认位置是屏幕中心,对模型的位置、方向控制是通过类osg::MatrixTransform来实现。由类图知,类osg::MatrixTransform继承自类osg::Transform,而类osg::Transform是由类osg::Group继承而来。

Figure 3.1 Inheritance Diagram for osg::MatrixTransform

声明类osg::MatrixTransform中的注释为:

/** MatrixTransform - is a subclass of Transform which has an osg::Matrix
* which represents a 4x4 transformation of its children from local coordinates
* into the Transform‘s parent coordinates.
*/ 

osg::MatrixTransform是类osg::Transform的子类,它有一个类osg::Matrix的成员变量_matrix来表示其子节点到其父节点的四阶齐次坐标变换。

声明类osg::Transform中的注释为:

/** A Transform is a group node for which all children are transformed by
* a 4x4 matrix. It is often used for positioning objects within a scene,
* producing trackball functionality or for animation.
*
* Transform itself does not provide set/get functions, only the interface
* for defining what the 4x4 transformation is. Subclasses, such as
* MatrixTransform and PositionAttitudeTransform support the use of an
* osg::Matrix or a osg::Vec3/osg::Quat respectively.
*
* Note: If the transformation matrix scales the subgraph then the normals
* of the underlying geometry will need to be renormalized to be unit
* vectors once more. This can be done transparently through OpenGL‘s
* use of either GL_NORMALIZE and GL_RESCALE_NORMAL modes. For further
* background reading see the glNormalize documentation in the OpenGL
* Reference Guide (the blue book). To enable it in the OSG, you simply
* need to attach a local osg::StateSet to the osg::Transform, and set
* the appropriate mode to ON via
* stateset->setMode(GL_NORMALIZE, osg::StateAttribute::ON);
*/ 

OSG通过osg::Transform节点类家族来实现几何数据的变换。osg::Transform类继承自osg::Group类,它可以有多个子节点。但是osg::Transform类是一个无法由程序实例化的虚基类。用户应当使用osg::MatrixTransformosg::PositionAttitudeTransform来替代它,这两个类均继承自osg::Transform类。根据用户程序的需要,可以使用其中任意一个或者同时使用他们。关于类osg::Transformosg::MatrixTransform类的更多内容,请参考《OpenSceneGraph快速入门》书中的组节点一章。

三、OSG中模型控制实现方法

OSG中,因为矩阵变换类osg::MatrixTransform继承自osg::Group,所以矩阵变换类可以当作一个特殊节点加入到场景中,矩阵变换类中也可以加入节点,加入的节点就会被这个矩阵变换类处理,可以对加入的节点模型进行移动、旋转、缩放操作。

编程实现模型控制程序,为了简便起见,模型节点仍然从文件中得到。得到模型节点后,分别对其进行移动、旋转和缩放操作。程序代码如下:

//--------------------------------------------------------------------------
   2:  //    Copyright (c) 2012 eryar All Rights Reserved.
   3:  //
   4:  //        File    : Main.cpp
   5:  //        Author  : [email protected]
   6:  //        Date    : 2012-1-5 21:42
   7:  //        Version : 1.0v
   8:  //
   9:  //    Description : Model transformations: Translate, Rotate, Scale.
  10:  //
  11:  //==========================================================================
  12:
  13:  #include <osgDB/ReadFile>
  14:  #include <osgViewer/Viewer>
  15:  #include <osg/MatrixTransform>
  16:  #include <osgViewer/ViewerEventHandlers>
  17:
  18:  int main(int argc, char* argv[])
  19:  {
  20:      osgViewer::Viewer   viewer;
  21:      viewer.addEventHandler(new osgViewer::WindowSizeHandler);
  22:      viewer.addEventHandler(new osgViewer::StatsHandler);
  23:
  24:      osg::ref_ptr<osg::Group> root   = new osg::Group;
  25:      osg::ref_ptr<osg::Node> axes   = osgDB::readNodeFile("axes.osgt");
  26:
  27:      // Translate: Offset along X axis 2 unit;
  28:      osg::ref_ptr<osg::MatrixTransform> mtMove = new osg::MatrixTransform;
  29:      mtMove->setMatrix(osg::Matrix::translate(-2, 0, 0));
  30:      mtMove->addChild(axes.get());
  31:
  32:      // Rotate: Rotate along Z axis about 45 degree then translate along x axis 2 unit.
  33:      osg::ref_ptr<osg::MatrixTransform> mtRotate = new osg::MatrixTransform;
  34:      mtRotate->setMatrix(osg::Matrix::rotate(
  35:          osg::DegreesToRadians(45.0),osg::Z_AXIS) * osg::Matrix::translate(2,0,0));
  36:      mtRotate->addChild(axes.get());
  37:
  38:      // Scale
  39:      osg::ref_ptr<osg::MatrixTransform> mtScale  = new osg::MatrixTransform;
  40:      mtScale->setMatrix(osg::Matrix::scale(0.5,0.5,0.5));
  41:      mtScale->addChild(axes.get());
  42:
  43:      root->addChild(mtMove);
  44:      root->addChild(mtRotate);
  45:      root->addChild(mtScale);
  46:
  47:      viewer.setSceneData(root.get());
  48:      viewer.realize();
  49:      return viewer.run();
  50:  }

运行效果如下图所示:

Figure 3.2 Translate, Scale, Rotate Model

PDF Version:

OSG Transform

时间: 2024-11-06 17:08:42

OpenSceneGraph控制模型的相关文章

利用unity3d自带的CharacterController包制作第一人称控制模型的简单Demo

1.首先打开unity3d创建一个新的项目.在新项目中创建Plane和Directional light平行光,Plane作为地面. 2.在项目中导入CharacterController包.把3rd Person Controller模型放到Plane上. 3.把3rd Person Controller模型上的ThirdPersonController脚本和ThirdPersonCamera脚本Remove掉. 4.在3rd Person Controller模型上添加CharacterMo

控制模型展示视角

  1 using UnityEngine; 2 using System.Collections; 3 4 public class CameraControl : MonoBehaviour { 5 public Transform target; 6 public float distance = 5f;//缩放系数 7 public float mixdistance = 2;//摄像机离物体的最近距离,越小放大倍数越大 8 public float maxdistance = 10;/

unity3d控制模型的运动

这里就不多做解释了,直接上代码,只为了备忘. public class HeroMove : MonoBehaviour { private float speed;//人物行动速度 private Animation ani; // Use this for initialization void Start () { speed = 1f; ani = GetComponent<Animation> (); } // Update is called once per frame void

鼠标控制模型旋转

using UnityEngine; using System.Collections;public class RotaRole : MonoBehaviour{    public Vector3 mousePos;    IEnumerator OnMouseDown()    {        mousePos = Input.mousePosition;        while (Input.GetMouseButton(0))        {            Vector3

Unity3D物体在UI界面的显示同时控制模型旋转

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ChinarSmoothUi3DCamera : MonoBehaviour { public Transform point; private Vector3 Tras = Vector3.zero; public float distance = 10.0f; public float minDistance

Unity3D Kinect 控制人物模型

两个参考地址: 结合Kinect游戏开发 yuyuyouer工作室 我使用的是unity3D 4.X,kinect SDK为1.7,Kinect1.7UnityPackage.unitypackage(插件包) KinectModelControllerV2 - 你需要将这个脚本拖放到你想要应用kinect控制的模型上.为了让模型能够跟上人的节奏,你需要将模型上控制模型动作的关键骨骼拖放到这个脚本暴漏的合 适的变量中 ,也就是将模型中的骨骼与kincet识别到的人的骨骼绑定起来.另外这个脚本暴漏

OpenSceneGraph基础:Helloworld

OpenSceneGraph的基本流程(main函数): 转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言 int main() { Group *scene = startupScene(); osgViewer::Viewer viewer; viewer.setSceneData(scene); viewer.setCameraManipulator(new osgGA::TrackballManipulator); viewer.realize(); w

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

转向控制调节经验谈

如上图所示,是我们导航循迹的策略. 就是一个PD,其他没有. 角度用的是第三个点与第一个点的横向偏差.距离用的第一和第三个点的弧长的中点所对应的点. Y = k1*S + k2*A. 摄像头策略: 如图:上面主要思路是寻单边,哪个靠谱用哪个.算法部分还是用的PD.这里面涉及到参数模型的问题,下面是四种控制模型.(上图中的iserror是有用的,左车道为主,右车道次之.注意正负号等.) 此方法中我们使用的是第一种,比例模型. 调参数的经验: 先调节P,当P出现走大S弯的时候,说明P参数过大,需要将