骨骼运动数据的绘制

上传人:kms****20 文档编号:39986945 上传时间:2018-05-21 格式:DOC 页数:6 大小:55.50KB
返回 下载 相关 举报
骨骼运动数据的绘制_第1页
第1页 / 共6页
骨骼运动数据的绘制_第2页
第2页 / 共6页
骨骼运动数据的绘制_第3页
第3页 / 共6页
骨骼运动数据的绘制_第4页
第4页 / 共6页
骨骼运动数据的绘制_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《骨骼运动数据的绘制》由会员分享,可在线阅读,更多相关《骨骼运动数据的绘制(6页珍藏版)》请在金锄头文库上搜索。

1、运动骨骼数据的读取,存运动骨骼数据的读取,存 储和显示储和显示nustViewer 工程的源文件中有 15 个.cpp 文件,头文件中有 14 个.h 文件。除主函数所 在的 nustViewer.cpp 文件之外,每个.cpp 文件对应于一个同名的.h 文件。 头文件主要是相关类的声明,cpp 文件是类中相关函数的定义。下面是对这几个文件 的概要及重要的成员函数的说明。一、一、stdafx 这个文件是创建工程的时候,vc+自动创建的,用于建立一个预编译的头文件. PCH 和一个预定义的类型文件 STDAFX.OBJ,可以加速编译过程。可暂时不去理会。二、二、Posture2.1 成员变量成员

2、变量 Posture 类用来将骨骼段的长度,方向,开始坐标,结束坐标各保存在一个数 组中去,并提供对其进行访问和设置的函数。其成员变量为:private:osg:Vec3 rootPos;/根骨段的位置vector lengthArray;/骨段的长度数组 vector directionArray;/骨段的方向数组 vector startPtArray; /骨段的起点坐标数组(参照世界坐标系) vector endPtArray;/骨段的终点坐标数组(参照世界坐标系)2.22.2 intint computeEndPt(computeEndPt(unsignedunsigned intin

3、t npos)npos) 这个函数根据在 npos 位置的骨骼段(线段)的开始点和方向计算该骨骼段 在全局坐标的中结束点,作为子骨骼的开始点。 2.32.3 其他的函数是根据骨骼在数组中的存储位置对该骨骼段进行的读取和设置的 get 和 set 函数。三、三、Bone3.1 成员变量成员变量 Bone 类主要用来存储一个骨骼段的数据,其成员变量为:private: static int nextIdx;/下一个骨段号 int idx;/骨段的序号 string name;/骨段的名称 float length;/骨段的长度Bone* parentBone;/父骨段,Root的父骨段为NULL

4、vector childBones;/子骨段数组,若无子骨段,则该数组大小为0 osg:Vec3 direction;/骨段方向的单位向量(世界坐标系下) string axisOrder;/文件中给出的骨段坐标轴的顺序public: osg:Vec3 rAxis3;/坐标轴所对应的方向向量 float rAxisIncludedAngle3; /局部坐标轴与世界坐标轴的夹角,对 应关系按照axisOrder来确定 int dof3;/三方向自由度的标识,若有自由度则值为,若无则 为 float rotationLimit32; /自由度的旋转的角度限制范围3.23.2 intint Bone

5、:computeChildrenPostures(PostureBone:computeChildrenPostures(Posture Bone(Bone);Bone(Bone /root在世界坐标系中的位置信息 string rootOrder; /asf文件中root部分所给出的位置、旋转数据出现的顺 序 vector bones; /骨骼段数组,骨骼段数据按次序存入 4.24.2 其他是一些对骨骼段的get和set函数五、五、SkeletonPat5.1 成员变量成员变量 SkeletonPat 类主要存放了位置变换节点(osg:PositionAttitudeTransform)的

6、数组,该数组主要存放了从 amc 文件中读入的绕各个轴旋转的欧拉角。成员变量 的定义为:public: vector bonePat;5.2 intint UpdatePosture(osg:Vec3UpdatePosture(osg:Vec3 skRootPos,skRootPos, constconst Action*Action* action,action, boolbool updateByQuat)updateByQuat)这第一个参数是根节点的坐标,第二个是某一帧的指针(后面会介绍这个类) ,第三个参数表示是否根据四元数进行旋转,true 表示是,false 表示否。这个函数主要

7、用来将 amc 文件中的旋转的欧拉角,结合 asf 文件中三个轴的 方向向量,将之转化为四元数。存放在 bonePat 数组中相应骨骼段中。同时, 设置 bonePat0中的位置为根节点的位置。六、六、OsgSkeletonFactory 与与 OsgLineSkeletonFactory OsgLineSkeletonFactory 继承了 OsgSkeletonFactory 类,OsgSkeletonFactory 提 供了一些虚函数,OsgLineSkeletonFactory 实现了这些虚函数,表明用线条绘制骨 骼。 6.1 osg:ref_ptr CreateGeode(osg:V

8、ec3 startPt,osg:Vec3 endPt)这个函数根据传入参数的起始点位置和结束点位置,绘制骨骼段。返回该节 点的指针。 6.2 int CreateBonePat(Bone* bone, SkeletonPat* skeletonData)这个函数通过递归调用,将一帧中的全部骨骼段(不包括根节点)进行绘制。 利用 SkeletonPat 类中的位置变换节点(osg:PositionAttitudeTransform)设置骨骼 的旋转,并将通过调用 CreateGeode 函数创建的几何节点作为子节点加到该位置 变换节点上,以便对该骨骼进行旋转。 6.3 SkeletonPat*

9、CreateSkeletonPat(Skeleton vector crspdBones;/欧拉角所对应的骨头 vector rotations; /若某骨段自由度不足个,则不 足位由0补上vector rotQuat; 7.2 其他其他除了上述成员变量外,还有 Action 类的构造函数和析构函数。八、八、ActionSequence8.1 成员变量成员变量这个类主要用来将多个运动的数据存入数组。成员变量为private: vector actions;8.28.2 其他成员函数其他成员函数一个获取数组头指针的 get 函数和一个增加新的运动的函数。 九、九、OsgUIOsgUI9.19.1

10、 成员变量成员变量这个类用于图形化界面的设置。其成员变量为:public: static bool isPause; static int nfps;/预设定的显示帧率private: osg:ref_ptr viewer; osg:ref_ptr root; osg:ref_ptr sceneRootNode; osg:ref_ptr figureRootNode; osg:ref_ptr frameNumText; osg:ref_ptr frameRateText; std:vector figureDataArray;9.29.2 intint createBaseGround()cr

11、eateBaseGround()这个函数用来创建地面,作为人运动的参考。9.39.3 osg:Group*osg:Group* createLight(osg:Node*createLight(osg:Node* node)node)创建光源。9.49.4 intint createWindow()createWindow()创建窗口,配置上下文,设置视角。9.59.5 intint createFigureSkeletonPat(std:vectorcreateFigureSkeletonPat(std:vector string buf;vector parts;file 为文件名,par

12、ts 则对应于 asf 文件中各个骨骼段的名称。10.2 intint parse_root(Skeleton*parse_root(Skeleton* skeleton)skeleton)对根节点进行解析,asf 文件中的数据对应于保存的数据结构为:order : stringaxis : stringposition : Vec3orientation : float310.3 intint parse_bonedata(Skeleton*parse_bonedata(Skeleton* skeleton)skeleton)对骨骼段数据解析,相应的数据结构为:idx : int name

13、: string direction : Vec3 length : float rAxisIncludedAngle : float3 axisOrder : string rAxis : Vec33 dof : int3 rotationLimit : float32 读入后,将相应的数据存入 Skeleton 对象中。10.4 intint parse_hierarchy(Skeleton*parse_hierarchy(Skeleton* skeleton)skeleton)对骨骼段间的层次关系进行存储,对应的数据结构为: parentBone : Bone* childBones :

14、 vector 10.5 intint parse(Skeleton*parse(Skeleton* skeleton)skeleton)调用以上解析函数对 asf 文件进行解析。十一、十一、 AmcFileReader这个类利用成员函数 int parse_single_frame(string str, const Skeleton std:vector acSeqArray;OsgUI osgui; MotionFileManipulator mFileManipulator;几个全局变量。首先调用 MotionFileManipulator 对象的成员函数,对 asf,amc 文件读入

15、。接着将 asf 文件数据加入数组 skArray 中,amc 中数据加入数组 acSeqArray 中。最后,调用 osgui 的 display 函数进行显示。 十四、十四、UtilityUtility这个类是对字符串处理的通用类,如 str2flt 函数是将数字的 string 类型转化为 float 类型,这在 asf,amc 的文件读取时用到。 十五、十五、关于文件如何读入及多个运动文件关于文件如何读入及多个运动文件 的同时显示问题的同时显示问题由于底层的函数的功能比较强大,因此读入文件时,只需要调用 MotionFileManipulator 类的 openFile 函数即可完成,此函数的原型是:int openFile(const char* skele_path, Skeleton& skeleton, const char* action_path, ActionSequence& actionSequence)。skele_path 为 asf 文件的路径, action_pat 为 amc 文件的路径。然后将 skeleton 加入到 std:vector中, 将 actionSequence 加入到 std:vector中。重复这几步便可将多 个运动文件读入,最后调用 osgui 的 display 函数便会将数组中的所有骨骼数据进行 显示。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号