Vega Prime具有典型面向对象特点,其核心功能模块都是以类的形式定义的,并存在一定的继承关系,对基本功能进行扩充。
vp***表示vp模块中的函数和类,这一层完全可以由Lynx Prime来操作完成;
vs***表示vsg模块中的函数和类,是vp的关键核心;
vr***表示render层,是硬件接口层,可以理解为对OpenGL或DirectX的封装层;
vu***表示一些内存管理、辅助、数学、工具类,对vega prime的其它功能进行了完善。
1、内核vpKernel
vpKernel继承于服务管理类(vsServiceMgr,继承关系如下图1所示),负责帧循环和管理各种服务。同时,内核创建一个遍历更新(vsTraversalUpdate)实例并控制它的执行。这个遍历一旦被内核的更新方法(vpKernel::update)触发,就会访问所有用内核注册登记的场景对象,自然就可以更新场景中所有对象的参数。内核提供了明确的API来操作它管理的场景(vpScene)。当观察者定位自己的通道(channel)时,内核也会通过消息机制提供控制。除此之外,内核还负责把相应的配置信息和帧循环控制信息发送给各个模块(vpModules)。另外,内核还要负责发布帧号和模拟仿真时间。
图1
vpKernel功能函数表1
函数原型 | 功能描述 |
instance() | 创建内核实例 |
define(const char* configFile) | 通过文件定义 |
configure() | 配置 |
beginFrame() | 开始帧循环 |
breakFrameLoop() | 暂停帧循环 |
endFrame() | 终止帧循环 |
getActualFrameRate() | 获取确切帧率 |
getBeginFrameTime() | 获取帧开始时间 |
getDesiredFrameRate() | 获取期望的帧率 |
getFrameNumber() | 获取帧号 |
setDesiredFrameRate(double rate) | 设置期望的帧率 |
setFrameRateLimiter(FrameRateLimiter *ctrl) | 设置帧率的限制 |
setFrameRateLimiterEnable(bool bEnable) | 使帧率限制设置有效 |
setPriority(vuThread::Priority pri) | 设置线程优先级 |
setProcessor(int cpu) | 设置处理器数目 |
update(void) | 更新数据 |
2、窗口vpWindow
vpWindow定义了基本窗口以及消息处理机制,提供了一条具体配置帧缓冲区和输入处理的途径。通过内核实例配置:vpKernel::instance()->configure(),为窗口设置默认的键盘函数、鼠标函数、改变形状函数和关闭函数。当然用户也可以在内核实例配置之后创建窗口。
图2
vpWindow功能函数表2
函数原型 | 功能描述 |
addChannel(vpChannel* chan,int loc=-1) | 添加通道 |
getChannel(int loc) | 获取通道 |
setFullScreenEnable(bool bFullScreen) | 设置窗口全屏 |
setInputEnable(bool bInput) | 设置运行输入 |
setKeyboardFunc(KeyboardFunc userFunc,void *data = NULL) | 设置键盘处理函数 |
setMouseFunc(MouseFunc userFunc,void* data = NULL) | 设置鼠标处理函数 |
setOrigin(int left,int bottom) | 设置窗口的位置 |
setParent(Window win) | 设置窗口的父载体 |
setReshapeFunc(ReshapeFunc userFunc,void *data=NULL) | 设置形状变化处理函数 |
setSwapInterval(int interval) | 设置交换间隔 |
updateStress(double frameRate) | 更新帧速率 |
KEY_1,KEY_a,KEY_RIGHT | 键盘键标示 |
MESSAGE_KEY_DOWN,MESSAGE_MOUSE_LEFT_DOWN | 鼠标键标示 |
getOrigin(int *left,int *bottom) | 获取窗口原始位置 |
3、通道vpChannel
pChannel定义了观察世界的视点,控制视点内地绘制区域,允许通过设置具体参数来控制从视点触发形成的可视化椎体和剪切面。一个通道只能附加于一个窗体上。
图3
vpChannel功能函数表3
函数原型 | 功能描述 |
setCullFunc(CullFunc f) | 设置剪切函数 |
setCullMask(unit mask) | 设置剪切掩码 |
setCullThreadPriority(vuThread::Priority) | 设置剪切线程优先级 |
setCullThreadProcessor(int cpu) |
设置剪切线程cpu数目 |
getViewMatrix() | 获取视点矩阵 |
setDrawArea(double l,double r,double b,double t) | 设置绘制区域 |
setDrawBuffer(DrawBuffer buffer) | 设置绘画缓冲 |
setDrawFunc(DrawFunc f) | 设置绘画函数 |
setLODFilter(vsLODFilterBase*) | 设置LOD过滤器 |
setLODTransitionRangeScale(double scale) | 设置LOD转换范围 |
setLODVisibilityRangleScale(double scale) | 设置LOD可视范围 |
setLogicalPipelineId(int logicalPipelineId) | 设置逻辑管道 |
setNearFar(float nr,float fr) | 设置视截面远近 |
setFrustumAsymmetric(float l,float r,float b,float t) | 设置不对称椎体 |
setLightPointComputeAsynchronousEnable(bool enable) | 设置允许不对称光点 |
setLightPointThreadPriority(vuThread::Priority pri) | 设置光点线程优先级 |
setLightPointThreadProcessor(int cpu) | 设置光点线程cpu数目 |
4、场景vpScene
场景是所有节点的容器,是一个场景图形的根节点,也是剪切遍历和更新遍历的起始点。从观察者(vpObserver)的角度出发,通过某个通道(vpChannel),在某个窗口(vpWindow)中就可以看到某个场景(vpScene)。其它物体对象(vpObject)都是位于某个场景中呈现在观察者的视截体中。
图4
vpScene功能函数表4
函数原型 | 功能描述 |
addChild(vsNode* child,int loc=-1) | 添加子节点 |
begin_child(),end_child() | 列举子节点 |
begin_parent(),end_parent() | 列举父节点 |
get_iterator_child(int loc) | 获取子节点 |
get_iterator_parent(int loc) | 获取父节点 |
getChild(int loc) | 获取子节点 |
getNumChildren() | 获取子节点数目 |
insert_child(vsNode* child,const_iterator_child it, unit mask=vsNode::DIRTY_UP_AALL) |
插入子节点 |
push_back_child(vsNode* child,unit mask=vsNode::DIRTY_UP_ALL) | 添加子节点到子节点列表的后面 |
removeChild(vsNode* child) | 移除子节点 |
replace_child(vsNode* child,const_iterator_child it, bool reparent,unit mask=vsNode::DIRTY_UP_ALL) |
替换子节点 |
addSubscriber(Event event,SubScriber *subscriber) | 添加订阅者 |
5、观察者vpObserver
vpObserver是一个具有位置特征的摄像机,用于定位、管理、渲染一系列通道。同时,观察者负责发布参数对象“视点”,如果在一个应用中存在多个观察着对象,最近一个被更新的观察者将负责发布参数对象“视点”。内核是通过附加在窗口上的通道对场景中的对象进行绘制渲染的,不同观察者通过不同的通道会看到场景中不同的视图。
图5
vpObserver功能函数表5
函数原型 | 功能描述 |
addAttachment(Attachment *attr) | 添加附属物 |
addChannel(vpChannel *chan,int loc=-1) | 添加通道 |
begin_attachment(),end_attachment() | 列举附属物 |
begin_channel(),end_channel() | 列举通道 |
erase_attachment(Attachment *attr) | 删除附属物 |
erase_channel(const_iterator_channel it) | 删除通道 |
getTranslate(double *x,double *y,double *z) | 获取观察者位置 |
getRotate(double *h,double *p,double *r) | 获取观察者旋转状态 |
setLookAt(const vpPositionable *target) | 设置目标观察物 |
setLookFrom(const vpPositionable *pos) | 设置观察点 |
setPosition(double p0,double p1,double p2, const vpCoordConverter *from = NULL) |
设置观察者位置 |
setRotate(double h,double p,double r,bool incr=false) | 设置观察者旋转状态 |
setScene(const vpScene* scene) | 设置场景 |
setStrategy(Strategy* strategy) | 设置策略 |
6、对象vpObject
vpObject是渲染的最基本单元数据,是几何体与材质的集合。对象采用引用计数机制,当对象被附加到场景中时自动加1,当对象被移除时自动减1,当引用计数为0时,对象将被删除。
图6
vpObject功能函数表6
函数原型 | 功能描述 |
addAttribute(Attribute* attr) | 添加属性 |
addChild(vsNode* child,int loc=-1,unit mask=vsNode::DIRTY_UP_ALL) |
添加子节点 |
begin_attribute(),end_attribute() | 列举属性 |
begin_child(),end_child() | 列举子节点 |
begin_geometry(),end_geometry() | 列举几何体 |
begin_named(),end_named() | 列举名称 |
begin_parent(),end_parent() | 列举父节点 |
begin_state(),end_state() | 列举状态 |
begin_texture(),end_texture() | 列举材质 |
copyFromSource() | 拷贝 |
find_named(const char* name,int occurrence=0) | 根据名字查找 |
setScale(double x,double y,double z,bool incr=false) | 设置缩放比例 |
setTranslate(double x,double y,double z,bool incr=false) | 设置位置 |
setRotate(double h,double p,double r,bool incr=false) | 设置旋转状态 |
7、自由度vsDOF
vpDOF定义了一个节点,为场景中的图形提供一种转换矩阵,典型应用于关节模型中。自由度确切地封装了两个矩阵,第一个矩阵是相对于父节点的本地单元矩阵,第二个是相对于本地矩阵的转换矩阵。该节点提供了API来定义本地坐标和相对于本地坐标的转换,包括:X、Y、Z上的位移,H、P、R上的旋转,沿X、Y、Z上的缩放因子。
图7
vsDOF功能函数表7
函数原型 | 功能描述 |
begin_child(),end_child() | 列举子节点 |
begin_parent(),end_parent() | 列举父节点 |
push_back_child(vsNode* child,unit mask=vsNode::DIRTY_UP_ALL) |
添加子节点到子节点列表后面 |
COMPONENT_ROTATE_H | 朝向旋转限制 |
EVENT_ISECT | 碰撞事件 |
update(vsTraversalUpdate* trav) | 更新遍历 |
setRotateH(double h,bool incr=false) |
设置x轴上的旋转因子 |
setRotateP(double p,bool incr=false) | |
setRotateR(double r,bool incr=false) | |
setScaleX(double x,bool incr=false) | |
setScaleY(double y,bool incr=false) | |
setScaleZ(double z,bool incr=false) | |
setTranslateX(double x,bool incr=false) |
|
setTranslateY(double y,bool incr=false) | |
setTranslateZ(double z,bool incr=false) | 设置z轴上的位移 |
setTranslate(double x,double y,double z,bool incr=fase) | 同时设置(x,y,z) |
8、转换vpTransform
vpTransform为场景中的图形提供了转换,封装了一个转换矩阵并提供了操作方法。转换重载了节点的所有遍历函数,同时也相应地修改了遍历矩阵堆栈。vpTransform继承于vsTransform和vpPositionable,这样可以使转换能够定位一个独立的坐标系统,并且不同于父场景中的坐标系统。
图8
vpTransform功能函数表8
函数原型 | 功能描述 |
begin_child(),end_child() | 列举子节点 |
begin_parent(),end_parent() | 列举父节点 |
push_back_child(vsNode* child,unit mask=vsNode::DIRTY_UP_ALL) |
添加子节点到子节点列表后面 |
update(vsTraversalUpdate* trav) | 更新遍历 |
setRotateH(double h,bool incr=false) |
设置x轴上的旋转因子 |
setRotateP(double p,bool incr=false) | |
setRotateR(double r,bool incr=false) | |
setScaleX(double x,bool incr=false) | |
setScaleY(double y,bool incr=false) | |
setScaleZ(double z,bool incr=false) | |
setTranslateX(double x,bool incr=false) |
|
setTranslateY(double y,bool incr=false) | |
setTranslateZ(double z,bool incr=false) | 设置z轴上的位移 |
setTranslate(double x,double y,double z,bool incr=fase) | 同时设置(x,y,z) |
9、运动模式vpMotion
pMotion定义了一种运动方式,本质上就是一种位置策略,通过使用标准的输入设备,定义了相应的能够很好地执行定义好的位置驱动方法。vpMotion是一个抽象的基类,包含的运动模式有:驾驶模式(vpMotionDrive)、飞行模式(vpMotionFly)、游戏模式(vpMotionGame)、旋转模式(vpMotionSpin)、链条模式(vpMotionTether)、固定链条模式(vpMotionTetherFixed)、链条跟随模式(vpMotionTetherFollow)、链接旋转模式(vpMotionTetherSpin)、不明飞行物模式(vpMotionUFO)、行走模式(vpMotionWalk)等。
图9
vpMotion功能函数表9
函数原型 | 功能描述 |
getInput() | 获取输入 |
getKeyboard() | 获取键盘输入 |
getMouse() | 获取鼠标 |
getName() | 获取名称 |
getNextStrategy() | 获取下一个策略 |
setInput(vpInput *input) | 设置输入 |
setKeyboard(vpInputKeyboard* keyboard) | 设置输入键盘 |
setMouse(vpInputMouse* mous) | 设置鼠标 |
setName(const char* name,bool hash=true) | 设置名称 |
setNextStrategy(Strategy *nextStrategy) | 设置下一个策略 |
getUserDataList(void) | 获取用户数据列表 |
10、碰撞vpIsector
vpIsector负责维护和管理用于碰撞检测的相交线段,并提供了一种数据结构和一组方法来查询碰撞结果。
图10
vpIsector功能函数表10
函数原型 | 功能描述 |
getEnable() | 获取碰撞检测有效性 |
getHit() | 获取碰撞 |
getHitGeometry() | 获取碰撞几何体 |
getHitMatrix(vuMatrix<double>* matrix) | 获取碰撞矩阵 |
getHitNode(const char* name=NULL,int occurence=0) | 获取碰撞节点 |
getHitNormal(vuVec3<float>* normal) | 获取碰撞法线 |
getHitObject() | 获取碰撞物体 |
getHitPoint(vuVec3<double>* point) | 获取碰撞点 |
getTarget() | 获取碰撞目标 |
setStrategy(Strategy* strategy) | 设置碰撞策略 |
setEnable(bool bEnable) | 设置碰撞检测有效 |
setIsectMask(unsigned int imask) | 设置碰撞掩码 |
setTarget(const vsNode* target) | 设置碰撞目标 |
setTranslate(double x,double y,double z,bool incr=false) | 设置位置 |