OpenSceneGraph控制模型

简介: OpenSceneGraph控制模型 一、简介 对模型的控制就是修改模型的位置和方向属性,使模型的位置和方向发生改变,通常通过移动、旋转、缩放来实现。在三维CAD软件中通常要对模型的位置进行修改,如装配模型时把其中一个零件模型移动一个位置。

OpenSceneGraph控制模型

一、简介

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

二、OSG模型控制

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

Class Diagram

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,所以矩阵变换类可以当作一个特殊节点加入到场景中,矩阵变换类中也可以加入节点,加入的节点就会被这个矩阵变换类处理,可以对加入的节点模型进行移动、旋转、缩放操作。

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

  1 :   // --------------------------------------------------------------------------
    2 :   //     Copyright (c) 2012 eryar All Rights Reserved.
    3 :   //
    4 :   //         File    : Main.cpp
    5 :   //         Author  : eryar@163.com
    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 :  }

运行效果如下图所示:

Transform

Figure 3.2 Translate, Scale, Rotate Model

 

PDF Version:

OSG Transform

目录
相关文章
|
存储 传感器 编解码
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
|
9月前
|
编解码 并行计算 算法
MPI分形图像高精度绘制程序和PC端Mandelbrot-Julia分形集预览程序
这篇文章描述了一个使用2010年技术的集群程序,该程序基于Linux + MPI + C++或Windows + .NET + C#,用于并行计算生成高分辨率BMP图像,特别是Mandelbrot和Julia集。在8台节点上,程序实现了7.31的稳定加速比,并在更大规模任务中有望提升。它支持MPI并行计算、任务日志、不同阶数的分形集生成、批处理、多线程以及优化的颜色处理等功能。创新点包括颜色表的正弦控制、动态调整运算精度、复杂颜色生成、优化的颜色更新和并发机制等。程序产生的图像样本显示了其多样性和质量。作者提供源代码,并提到设计思路可应用于类似图像生成任务。
|
5月前
|
JavaScript
threeJs通过GUI实现动态对模型的控制
这篇文章讲述了如何使用three.js结合GUI工具实现实时控制3D模型的属性,以便于在开发过程中动态调整和预览模型效果。
141 2
threeJs通过GUI实现动态对模型的控制
|
8月前
|
Shell vr&ar 图形学
数学库,3D建模库,设计之图形化设计方案公式,3D建模库,圆柱体,圆的计算方式,三角形的计算方式
数学库,3D建模库,设计之图形化设计方案公式,3D建模库,圆柱体,圆的计算方式,三角形的计算方式
|
定位技术 Python
通过ArcMap的模型构建器生成空间坐标系转换的代码
本文介绍在ArcMap软件中,通过创建模型构建器(ModelBuilder),导出地理坐标系与投影坐标系之间相互转换的Python代码的方法~
123 2
通过ArcMap的模型构建器生成空间坐标系转换的代码
|
前端开发
栅格化系统的原理以及实现
栅格化系统的原理以及实现
157 0
|
Python
Maya测量尺寸python脚本Mesh Resizer
能够准确测量Maya软件中模型的尺寸大小。通过打开脚本编辑器,加入python脚本代码,点击模型运行即可。 import maya.cmds as cmds from collections import Counter from functools import partial JobSelected=cmds.scriptJob(event=["SelectionChanged", "AutoUpdateInfo()"]) def KillJob(): cmds.scrip..
244 0
Maya测量尺寸python脚本Mesh Resizer
|
缓存 图形学
计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制
VS+OpenGL绘图环境及基本图形绘制 1、 熟悉OpenGL的主要功能; 2、 掌握OpenGL的绘图流程和原理; 3、 掌握OpenGL核心函数的使用; 4、 熟悉OpenGL基本图形元素的绘制函数。 二. 实验内容 1、 如预备知识所述,创建一个OpenGL工程,修改第一个程序中的Display()函数,如下: 该程序是在窗口中画两条线,分别用黄色和红色绘制。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态: GL_POINTS 画点 GL_LINES 画线
546 0
计算机图形学——实验一 VS+OpenGL绘图环境及基本图形绘制
SwiftUI—两个图像视图之间的色彩混合
SwiftUI—两个图像视图之间的色彩混合
454 0
SwiftUI—两个图像视图之间的色彩混合
|
缓存 BI API
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波