动画对象 animation object
1、有数据,则存在动画。
2、每个元素为一个动画对象。
动画组对象 animation group object
1、gltf等模型使用
子节点 child nodes
直接在世界坐标下(不考虑层级树状关系),默认false
实体对象 entity object
节点ID node ID
骨架皮肤数据 ArrayBuffer of jointsMat 1、有数据,则存在骨骼动画。 2、工作流(每个NodeObject的逆绑定矩阵(世界逆绑定矩阵)=NodeObject的matrixWorld*inverseBindMatrix) A、获得matrixWorld, B、根据jointsMat,计算出每个joint的world matrix。
初始化矩阵
模型对象 model object
如果此节点为模型实例化的根节点,则_modelOrigin为模型对象。
morphTarget 目标值数据 ArrayBuffer of morphTargetMat 1、有数据,则存在morphTarget动画。
节点名称 node name
父节点 parent node
父空间的矩阵世界
粒子对象 particle object
物理体对象 physical body object
四元数
节点是否以及GPU准备好 node is ready of GPU
renderID,use for pickup generate by stage
任意点的任意轴的罗德里格斯旋转(考虑_position位置) 1、数组第一个元素为旋转点,第二个元素为旋转轴 2、数组第三个元素为旋转角度 3、数组第四个元素为是否在世界坐标下旋转
旋转:自身原点为中心( 不,考虑_position位置)
骨架动画数据 SkinAnimation object 目前只设计了一个蒙皮动画。同一节点上不存在多个蒙皮动画。
BVH空间类型
权重动画 weight animation object 1、有数据,则存在权重动画。权重动画存在于_animation[]中,这里是指针的概念。 2、工作流 update(),根据是否有权重动画,选择matrixWorld的更新方式。 3、如果存在多个权重动画组,这个标志为当前使用的权重动画组。
是否作为一个整体渲染 1、BVH作为一个使用AABB 2、pickup使用一个RenderID
gltf当前场景索引
实例化gltf绑定动画与动画组的资源的map,key为节点实例
local matrix
当前entity在世界坐标(层级的到root),可以动态更新 1、在directInWorldSpace为true时,matrixWorld与matrix相同 2、在directInWorldSpace为false时,matrixWorld为matrix的累计乘积
gltf模型中的mesh和skin的绑定 1、在initScene()中使用addNode()时,根据node的mesh和skin,push到meshAndSkinBundle中.
模型原始数据 20260226 ,逐步作废
模型资源
是否需要更新本地矩阵
是否用户自定义更新函数
是否用户自定义更新函数,在update()函数最后调用
是否需要更新全局矩阵
stageID
节点类型 node type
节点UUID node UUID
节点是否可见,如果不在root的树,则visible为false,但没有删除,还在资源池中 node visible
在世界坐标下的位置(x,y,z)
动画组对象 animation group object
是否直接在世界坐标下(不考虑层级树状关系)
获取物理体对象 physical body object
获取空间类型
设置空间类型
OptionalmodelAttachValue: IV_NodeSpace添加子节点
4、如果是Model,根据modelAttachValue创建对应的Node Instance
NodeObject | BaseEntity | IV_Node
OptionalmodelAttachValue: IV_NodeSpacePromise
附着entity到NodeObject上
检查是否需要更新矩阵 这里是TRS
检查是否需要更新矩阵
销毁节点 1、递归销毁所有子节点 2、需要entityManager中移除entity;entity的updateSelf()会更新instance 相关 3、需要注销动画 4、需要注销骨骼动画 5、需要注销动画组 6、需要注销粒子系统 7、需要注销BVH和物理引擎中的相关数据
注销场景 1、注销所有实体和camera
用途: 1、在场景切换时,注销当前场景的所有实体和camera 2、不适用在gltf的销毁时,gltf的注销有RootGPU的destroy方法实现
释放模型原始资源
获取accessor
向上递归,判断是否可用性
获取顶点数组
primitive
meshID
primitiveID
顶点数组数据
获取primitive的索引缓冲区和drawMode
primitive
meshID
primitiveID
索引缓冲区和drawMode
获取节点的morph target 数量
节点索引
morph target 数量
获取资源,根据资源类型(T_ModelResKind)和资源id获取资源
资源类型
资源id
Optionaloptione: { format?: GPUTextureFormat; premultipliedAlpha?: boolean }资源
获取primitive的顶点数据
primitive数据
meshID
primitiveID
顶点数据集合
向上递归,判断是否可见 1、通过parent.type 判断是否为root节点
三段式初始化的第二步:init()
Optionalparent: NodeObjectOptionalrenderID: number初始化模型数据,
实例化 初始化模型节点 1、被parent的addChild调用 2、调用initScene初始化场景
父节点
OptionalattachValue: IV_NodeSpace节点空间属性
场景节点实例
初始化默认材质 1、初始化默认材质 2、按照gltf的material,初始化材质
初始化entity
初始化场景入口。 1、gltf会新建一个node object作为场景节点,并返回 2、根据场景索引,初始化场景中的节点 3、初始化节点是递归操作(包括:mesh、camera) 4、如果有animation,则在新的Node Object上初始化animation,并注册到animationManager 5、如果有animation,则在新的Node Object上初始化animation group,并注册到animationGroupManager
Optionalid: number场景索引
OptionalattachValue: IV_NodeSpace节点空间属性
场景节点实例
初始化采样器 1、初始化默认采样器:linear 2、按照gltf的sampler,初始化采样器
初始化纹理 1、按照gltf的texture,初始化纹理
判断primitive是否有morph target
primitive
boolean 是否有morph target
三段式初始化的第三步:readyForGPU 当前对象的GPU已经可以用时,执行此调用。 when GPU is ready, call this function
remove this node from parent 从父节点移除当前节点,不递归移除子节点
remove child from this node 移除子节点
子节点
是否只移除一个子节点,默认:true 只删除单个节点,删除后,从children中移除 删除所有子节点,不从children中移除(防止for失效),最后由removeChildren()移除
是否移除成功
remove all children 移除所有子节点
绕任意轴旋转
绕X轴(1,0,0)旋转
绕y轴(0,1,0)旋转
绕z轴(0,0,1)旋转
scale
替换pos的位置(matrix的:12,13,14),其他的matrix数据不变, 将entity的位置变为POS,等价wgpu-matrix的mat4的translation,是替换,不是增加
:Vec3
在现有matrix(原有的position)上增加pos的xyz, 将entity的矩阵应用POS的位置变换,是在原有矩阵上增加
:Vec3
创建单位矩阵,矩阵的xyz(12,13,14)=pos
:Vec3
更新 1、判断是否需要更新(时间上) 2、调用super.update()更新, A、NodeSpace:更新空间属性 B、RootGPU:更新user call back,调用最终子类更新自身updateSelf() 3、更新NodeObject的属性 4、更新子节点
Clock 时钟
是否调用自身的updateSelf(),默认=true 此参数可以方便子类重载时,决定调用的updateSelf()的时间顺序或是否调用updateSelft()
1、矩阵操作一般来说: CPU中:SRT(右乘),行向量列矩阵=行向量 GPU中: TRS(左乘),列矩阵列向量=列向量
2、更新矩阵的顺序是先进行线性变换,再进行位置变换。其实是没有影响,线性工作在3x3矩阵,位置变换在[12,13,14],列优先。
3、旋转部分,四元数优先,然后后轴旋转。 A、在模型gltf中,旋转使用四元数。
更新世界矩阵, 递归乘以父节点的矩阵
Optional_parentMatrixWorld: Float32Array<ArrayBufferLike>强制更新世界矩阵
更新自己的属性
更新世界位置 1、entity的worldPosition 是entity的position在世界坐标系下的位置 2、如果没有提供世界矩阵,默认使用entity的matrixWorld
Optional_matrixWorld: Float32Array<ArrayBufferLike>世界矩阵
世界位置
节点对象 1、导入导出需要实例化 2、readyForGPU需要实例化 3、_destroy需要实例化 4、updateSelf需要实例化