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中的注释为:

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

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

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

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

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(-, , ));
  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(,,));
  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

OpenSceneGraph控制模型的更多相关文章

  1. 在DirectX9中使用DXUT定制按钮来控制模型旋转的问题

    使用DXUT中的按钮控件类实现 控制模型旋转的过程如下: 1.创建一个CDXUTDialog对话框,并绑定至CDXUTDialogResourceManager对话框资源管理器. 2.绑定回调函数GU ...

  2. 1.使用脚本控制模型的移动 --《Unity 3D 游戏开发》笔记

    由于最新版的unity已经不支持javascript语言啦,本人又是个C#小白,所以记录一下自己写的脚本. first 创建一个模型,放在平面上,调整下角度,就像这样: 然后写一个脚本来控制模型移动: ...

  3. 图文详解基于角色的权限控制模型RBAC

    我们开发一个系统,必然面临权限控制的问题,即不同的用户具有不同的访问.操作.数据权限.形成理论的权限控制模型有:自主访问控制(DAC: Discretionary Access Control).强制 ...

  4. python RBAC权限控制模型扩展 基于JWT实现

    jwt,全称 json web token,是使用一定的加密规则生成的token串来保证登录状态.验证用户身份.做权限认证等工作 以往保存用户登录状态多用session实现,但是当服务涉及多台服务器分 ...

  5. threejs 鼠标移动控制模型旋转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Unity在UI界面上显示3D模型/物体,控制模型旋转

    Unity3D物体在UI界面的显示 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  7. osg fbx 绘制坐标轴、控制模型影藏与显示

    int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...

  8. 两种RBAC权限控制模型详解

    序言 由于最近一直卡在权限控制这个坎上,原来设计的比较简单的权限控制思路已经无法满足比较复杂一些的场景,因此一直在探索一种在大部分场景下比较通用的权限模型. 首先,这里说明一下两种RBAC权限模型分别 ...

  9. unity3d控制模型的运动

    这里就不多做解释了,直接上代码,只为了备忘. public class HeroMove : MonoBehaviour { private float speed;//人物行动速度 private ...

随机推荐

  1. 最大公共字串LCS问题(阿里巴巴)

    给定两个串,均由最小字母组成.求这两个串的最大公共字串LCS(Longest Common Substring). 使用动态规划解决. #include <iostream> #inclu ...

  2. NOSDK--一键打包的实现(一)

    所谓一键打包,包含五个流程: 刷新mk,这个只有在文件数目改变的时候才会需要: 编译,在实现了统一接入以后,只需要编译一次就可以打多个包,这个以后再介绍: 拷贝资源,这个使用的是cocos2d-x自带 ...

  3. 原生JavaScript技巧

    时常在技术论坛有看见一些比较好的示例,于是就出于一种收集并学习的态度,于是就保留下来啦~  当然现在展示的也只是一部分,先放一部分出来尝尝鲜~~~

  4. poj 1112

    昨天晚上看的题. 说实话,我一眼就看出了是二分图,再一眼就看出了是二分图+dp(01背包).但悲剧的是我一眼看出的算法是正确的,但我总以为它是错误的,浪费了很长时间像其他算法(TAT). 今天终于把代 ...

  5. tornado 重定向404(方法不对)

    application = tornado.web.Application(url_wrapper([ (r"", include('app.views.web_services. ...

  6. Unity3D 摄像机的Transform通过摇杆输出的方向

    要解决的问题是:摄像机的方向不固定,当摇杆向前(0,1)推时,主角要往摄像机的朝向(忽略Y方向)走,当摇杆往右(1,0)推的时,主角朝摄像机的右方向 /// <summary> /// 摄 ...

  7. BOM and Event Source

    EventSource: var test = function(){ var btn = event.srcElement; var str += btn.type + ":" ...

  8. mysql知识

    1.Limit 在语句的最后,起到限制条目的作用 Limit [offset,] [N] offset:偏移量 N:取出条目 例子:select * from stu limit 3,3; 2.左连接 ...

  9. 使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  10. FluentData(微型ORM)

    using FluentData; using System; using System.Collections.Generic; using System.Linq; using System.Te ...