一种3D对象在虚拟场景中的节点化组织方法与流程

文档序号:15804591发布日期:2018-11-02 21:42阅读:306来源:国知局

本发明涉及计算机图形技术领域,具体来说,3d对象在虚拟场景中节点化组织方法的技术实现。

背景技术

3d场景中组织虚拟节点的一种方式是扁平化的组织方式,即所有的节点处于平行位置,相互之间没有父子关系,修改一个节点的属性不会影响其他节点,由于这种组织方式计算量相对较少,也不用考虑其他节点的变化带来的一些额外的判断(通常是由节点的不均等缩放造成的矩阵计算问题),所以一般的模型展示引擎普遍采用这种组织方式,但是这种组织方式的缺点也同样明显,在大型复杂环境下,对象与对象之间存在明显的层级关系,如餐桌上的茶杯,这时如果要正确的让茶杯随着餐桌一同运动,则需要分别设置餐桌对象和茶杯对象的属性才能并且在设置茶杯的属性时还需要考虑餐桌的运动才能呈现出正确的效果,这样对于有复杂层级关系的大型应用来说是致命的,而且现有技术只在pc端3d引擎中实现,所以为了应对复杂的场景应用,需要设计一套能够处理复杂层级关系的场景组织方法,实现节点对象在节点树中变化后渲染形态一致的技术。



技术实现要素:

为了达到上述目的,本发明提供一种3d对象在虚拟场景中的节点化组织方法,针对3d对象在场景中进行节点化的过程中所涉及的节点对象的三个属性位置(position)、旋转(rotation)、缩放(scale)以及局部坐标系(local)和世界坐标系(world)进行处理,局部坐标系表示节点对象相对于父节点对象的位置、旋转以及缩放,世界坐标系表示节点对象在3d空间中的实际位置、旋转以及缩放;所述3d对象在虚拟场景中的节点化组织方法包括对节点对象进行定义、对节点进行渲染处理对新生节点的处理、将一个节点树分支下的子节或者子节点树移动到另一个节点下的处理四个部分;其中,对节点对象进行定义,包括如下几个步骤;

s11、用position、rotation以及scale分别表示节点对象在世界坐标系下的位置、旋转以及缩放;

s12、用localposition、localrotation、localscale分别表示节点对象在局部坐标系下的位置、旋转以及缩放;

s13、节点对象通过_parent属性设置其父节点,通过_children数组索引其子节点,以建立节点数的双向链表,保证从任意一个节点可以遍历到整颗节点树;并且提供了iterateup以及iteratedown调用分别用来从当前节点向上遍历到场景节点树的根节点,以及向下遍历该节点的所有子节点;

对节点进行渲染,是通过分别计算出节点的position、rotation、scale属性值来组成矩阵传给渲染引擎进行渲染实现的;其中,position、rotation、scale的计算均需要调用iterateup遍历其所有父节点通过localposition计算出最终的position、rotation和scale,切rotation的计算需要使用四元数;

对新生节点的处理,具体方法为将新生成的节点对象加入到已经存在的节点对象下作为其子节点,每一个节点对象均实现了一个名为addchild函数,addchild函数将新节点对象的position、rotation和scale与它的父节点的position、rotation和scale进行运算,其中position与scale运算只需要进行一个除法运算即可得到新节点的localposition、localscale,对于rotation则需要使用四元数进行运算得到新节点的localrotation,然后再将新节点要挂载的节点作为其_parent属性,将新节点加入到挂载节点的_children当中,这样就建立了一颗新的节点树;

将一个节点树分支下的子节或者子节点树移动到另一个节点下的处理,具体方法为在移动节点时纪录下该节点的position,rotation和scale,然后在挂载节点时将数值赋值给相应的属性即可,其中,这个过程中要保持节点及其子节点的position,rotation和scale不变,具体是将position,rotation和scale均表达为es6中的get和set属性,并在赋值时对position,rotation和scale进行处理同时保证localposition、localrotation以及localscale的正确来实现节点及其子节点的position,rotation和scale不变。

本发明的3d对象在虚拟场景中的节点化组织方法能够满足复杂成绩关系的大型应用,并且保证了3d对象在虚拟场景中的节点的节点树下的每一个节点即使在移动过程中不做任何处理也能在使用时保证其正确性,不仅可以应用到pc端3d引擎,其他3d引擎中也能适用。

具体实施方式

为了更好的理解本发明,下面详细说明本发明。

场景节点化的过程中主要是需要处理节点对象的三个属性位置(position)、旋转(rotation)以及缩放(scale),并且涉及到两个坐标系局部坐标系(local)以及世界坐标系(world),局部坐标系表示的是节点对象相对于父节点对象的位置、旋转以及缩放,世界坐标系表示的是节点对象在3d空间中的实际位置、旋转以及缩放。

在实际的对象定义中,我们用position、rotation以及scale表示节点对象在世界坐标系下的位置、旋转以及缩放,用localposition、localrotation以及localscale表示节点对象在局部坐标系下的位置、旋转以及缩放,节点对象通过_parent属性设置其父节点通过_children数组索引其子节点这样就建立了整颗节点树的双向链表可以很轻易的从任意一个节点遍历到整颗节点树,并且提供了iterateup以及iteratedown调用分别用来从当前节点向上遍历到场景节点树的根节点,以及向下遍历该节点的所有子节点。

一个节点在3d空间中渲染时并没有层级关系,需要我们提供节点在3d场景中真实的位置、旋转以及缩放,所以这个时候要提供给渲染引擎的是position、rotation以及scale属性的值,在扁平化的节点关系中,这三个属性可以直接使用但是在节点化的场景关系中,需要计算每一个节点的父节点的属性对节点本身的影响,如position的计算需要调用iterateup遍历其所有父节点通过localposition计算出最终的position,rotation和scale的计算同理,只是rotation的计算需要使用四元数来计算不能简单的加减,当分别计算出节点的position,rotation以及scale以后将这三个属性组成一个矩阵传给渲染引擎渲染。

接下是如何将节点加入到场景树中以及如何从某一个节点树分支移动节点到另一个节点下,并且保持节点的position,rotation和scale不变,首先是将新生成的节点对象加入到已经存在的节点对象下作为其子节点,每一个节点对象均实现了一个名为addchild的函数,这个函数的主要工作原理,是将新节点对象的position,rotation和scale与它的父节点的position,rotation和scale进行运算position与scale运算相对简单只需要进行一个除法运算即可得到新节点的localposition、localscale,对于rotation则需要使用四元数进行运算得到新节点的localrotation,然后再将新节点要挂载的节点作为其_parent属性,将新节点加入到挂载节点的_children当中,这样就建立了一颗新的节点树,另外的难点在于将一颗节点树分支下的子节点或者子节点树移动到另一个节点下,这里采用的方法是在移动的节点时纪录下该节点的position,rotation和scale然后在挂载节点时将数值赋值给相应的属性即可,这个过程中保持节点及其子节点的position,rotation和scale不变的一个重要的技术手段是将position,rotation和scale均表达为es6中的get和set属性,这样在赋值时我们可以对position,rotation和scale进行处理同时保证localposition、localrotation以及localscale的正确,并且由于position,rotation和scale是在使用时计算生成的,这样保证了子节点树下的每一个节点即使在移动的过程中不做任何处理也能在使用时保证其正确性,这项保持节点在节点树中变动时其属性不变(在3d编辑器中视觉表现不变)的技术以前只在pc端3d引擎中使用。

本发明的3d对象在虚拟场景中的节点化组织方法能够满足复杂成绩关系的大型应用,并且保证了3d对象在虚拟场景中的节点的节点树下的每一个节点即使在移动过程中不做任何处理也能在使用时保证其正确性,不仅可以应用到pc端3d引擎,其他3d引擎中也能适用。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1