Vega Prime的DOF程序设计

发表于2015-08-26
评论0 1.1k浏览

Vega Prime的DOF程序设计



' ~2 o% ]* ^' O. G3 m1 引言
   在视景仿真应用中,使用DOF(Degree of Freedom,即自由度)技术可以使模型对象具有活动的能力,DOF节点可以控制它的所有子节点按照设置的自由度范围进行位移或者旋转。比如,为一个门的模型设置一个绕门轴转动的自由度,为一个窗户模型设置一个沿窗沿滑动的自由度,可以使门和窗按照符合逻辑的方式运动,这样可以大大增强模型数据库的真实性。又比如,我们想要场景里的某个物体绕着其自身的原点而不是整个场景的原点旋转,只需要为这个物体设置一个自由度节点即可。
   在下文中通过一个实例讲解DOF节点的程序设计方法,实例开发运行环境为:Windows XP SP3、Creator3.2、Vega Prime2.2.1、VS2005。
% q' M& h# ~+ O! O7 ?1 d% `- G
$ F: O3 ~$ n, P/ X2 vsDOF类

  n- A" _! R* X) N   vsDOF类派生自vsNode类,用来定义和控制一个自由度节点,其在场景图里提供一种转换矩阵,典型地应用于关节模型中。与vsTransform类不同,vsDOF类实际上封装了两个矩阵,而不是一个。第一个矩阵是相对于父节点的本地矩阵(或称局部矩阵),第二个矩阵是相对于本地矩阵的转换矩阵。vsDOF节点允许在场景里相对于本地坐标系(或称局部坐标系)的任意一点进行位移和旋转,提供API用来指定本地坐标系和相对于本地坐标系的转换,该转换包含若干自由度和施加在这些自由度上的最大最小值限制。这些自由度包括:X、Y、Z轴上的位移,H、P、R上的旋转,沿X、Y、Z轴上的缩放因子。六自由度X、Y、Z、H、P、R的定义如图1坐标系所示,符合笛卡尔坐标系中的右手定则。

图1 坐标系


   在这个坐标系中,假设我们站在负Y轴上,面向正Y轴,那么X、Y、Z、H、P、R定义如下:
     +X指向右,-X指向左;
     +Y指向前,-Y指向后;
     +Z指向上,-Z指向下;
! o6 G( p( x1 E+ n( |' g( I0 H     朝向角Heading是指绕Z轴的旋转,+H指向左旋转,-H指向右旋转;
3 K, Z$ s0 m' j% O% Q8 Z/ _     倾斜角Pitch是指绕X轴的旋转,+P指向上旋转,-P指向下旋转;
8 x1 N, T; f) q- t. z, V$ i     滚转角Roll是指绕Y轴的旋转,+R指向右旋转,-R指向左旋转。

        
  O" t0 s* H) lvsDOF类的主要成员函数如下:

     void   setTranslate (double x, double y, double z, bool incr=false)
9 m% N0 V4 e7 d: Y) C      void   getTranslate (double *x, double *y, double *z) const
      功能:设置/获取X、Y、Z轴上的位移。

 

     void   setTranslateX (double x, bool incr=false)
' K4 t4 I: X$ e# U( |; |      double getTranslateX () const
      功能:设置/获取X轴上的位移。

0 L9 h: c6 b4 O' @$ b     void   setTranslateY (double y, bool incr=false)
5 W' I2 s' _* j  D' n. N      double getTranslateY () const
      功能:设置/获取Y轴上的位移。
: : o2 V3 v* h% z
, r& p+ c6 c! {* A. g     void   setTranslateZ (double z, bool incr=false)
& g0 p! N9 X5 Q; U6 R      double getTranslateZ () const
      功能:设置/获取Z轴上的位移。

; F) n2 s( j6 M9 I7 u- Z     void   setRotate (double h, double p, double r, bool incr=false)
      void   getRotate (double *h, double *p, double *r) const
5 X1 H* ?0 a: _8 h; `7 m1 J6 N      功能:设置/获取H、P、R姿态

 

     void   setRotateH (double h, bool incr=false)
4 P) c& S( ^* J2 }; |      double getRotateH () const
      功能:设置/获取朝向角H。

( l; h! F$ V% W" ]4 y     void   setRotateP (double p, bool incr=false)

      double getRotateP () const
! ?; v" ^) x+ e$ f  ]      功能:设置/获取倾斜角P。

3 L3 E# e6 ~" ; C9 P1 n& ^     void   setRotateR (double r, bool incr=false)
6 |1 s+ g/ h% @8 T* o      double getRotateR () const
      功能:设置/获取滚转角R。

& S( j: l2 V& ~7 ?2 Q! x% w     void   setScale (double x, double y, double z, bool incr=false)
      void   getScale (double *x, double *y, double *z) const
      功能:设置/获取X、Y、Z轴上的缩放因子。

 

     void   setScaleX (double x, bool incr=false)
# ~6 y/ ]* f. c) I      double getScaleX () const
      功能:设置/获取X轴上的缩放因子。

 

     void   setScaleY (double y, bool incr=false)
& X7 k. X" ~; d8 e: |      double getScaleY () const

      功能:设置/获取Y轴上的缩放因子。

' D3   o" D2 ?/ ^     void   setScaleZ (double z, bool incr=false)

      double getScaleZ () const

      功能:设置/获取Z轴上的缩放因子。

# @0 W7 V0 Z2 m     void   setConstraint (Component component, const Constraint &c)
: E! J! P+ h! |" k$ g2 Q' e      const  Constraint & getConstraint (Component component) const
      功能:设置/获取某个自由度的范围。其中,第一个参数Component定义如下:

3 DOF程序设计

% y0 R8 F% v" L# m' I6 q  s   在Vega Prime应用程序中使用DOF技术,包括如下几个步骤:
5 W# j2 e) l$ `' A        ⑴ 创建DOF节点;
        ⑵ 设置DOF节点的子节点;
* ]. e+ E+ u# g- z" g        ⑶ 设置DOF节点的本地坐标系;
        ⑷ 设置DOF节点的自由度范围;
        ⑸ 控制DOF节点。

3.1创建DOF节点:

   在实时可视化三维建模软件Creator中,DOF节点跟组节点级别相同,所以必须用组节点或其它同等级别的节点(如LOD节点)作为DOF节点的父节点。用户可以使用Creator提供的创建工具箱中的创建DOF工具在模型数据库的层级视图中创建DOF节点。
# S. g+ y& a" w, Z. B/ Y$ W# R) A' H
8 C& A- N' U& G# Z. z" _) U% d* h3.2设置DOF节点的子节点
  }1 ]9 K2 r. d0 Z2 K   将需要设置自由度的模型对象的对应节点设置为DOF节点的子节点。DOF节点可以控制层级视图中它的所有子节点,包括子DOF节点,且DOF节点属性具有继承性,以保证所有的子节点都能符合逻辑的运动。 

" e7 o, 1 Z* f7 i3.3设置DOF节点的本地坐标系
   为模型对象定义自由度,必须设置相应的本地坐标系,因为模型对象的所有自由度运动都是相对于本地坐标系进行的。创建DOF节点后,Creator会在模型数据库的原点上设置一个默认的本地坐标系,通常需要对其重新定位。定位方法是选择DOF节点,选择菜单命令“Local-DOF”-“Position DOF”,打开对话框如图2所示,按照对话框提示,在图形视图中依次确定DOF节点的本地坐标系原点、X轴和Y轴。

图2 DOF本地坐标系


& a: a) B% m( U' h5 y- s  I3.4设置DOF节点的自由度范围
9 _" d* Q" M! @   DOF节点的自由度属性都是相对于本地坐标系而言的,默认值均为0,需要对其重新设置。设置方法是选择DOF节点,选择菜单命令“Local-DOF”-“Set DOF Limits”,打开对话框如图3所示,在此对话框中,对DOF节点的位移和旋转范围进行设置。

图3 DOF自由度范围



7 {1 w# [1 x7 B4 ^3.5控制DOF节点
   在Vega Prime应用程序中,使用vsDOF类实例控制模型对象中的DOF节点。下面结合一个基于MFC单文档框架的Vega Prime应用实例,给出主要编程步骤如下:
   ⑴ 在视图类头文件中添加vsDOF类的头文件
/ ?9 K8 ~; t0 A# J* t   #include "vsDOF.h"
   ⑵ 在视图类头文件中添加相关变量定义
4 ]+ l: C6 N0 x5 P9 y; {   // 属性
   public:
     vpObject    *m_OBJ;     //指向模型对象类的指针
$ |8 n% i3 }# o/ ~! i     vsDOF      *m_DOF;    //指向vsDOF类的指针

     CString     str1OBJ;   //模型对象的名字
     CString     str2DOF;   //DOF节点的名字
* ?# e4 B' ^# U; {
8 v8 c+ _3 h' w# V" w4 M7 q
% F2 j$ D8 h1 _+ x: n9 ]2 s# X$ ~% e( x   ⑶ 在视图类实现文件中初始化DOF节点

⑷ 在视图类实现文件中调整DOF节点

在程序实例中,通过ACF文件加载一个坦克模型对象tank,在坦克模型里定义3个DOF节点,分别是tankDOF控制坦克整体运动,turretDOF控制炮塔运动和barrelDOF控制炮管运动,程序运行界面截图如图4所示:

图4 控制DOF节点




2 |  e9 v, h/ @4 结语

   在视景仿真应用中,使用DOF技术可以使模型对象具有活动的能力,自由度节点用于为模型对象设置一定的可运动范围,从而为其增加动态效果。通过实例讲解了DOF节点的程序设计方法,在此基础上可以在视景仿真中开发具体的DOF应用。


文章转自:VR虚拟社区

原文链接

著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台