动画对象 animation object
1、有数据,则存在动画。
2、每个元素为一个动画对象。
动画组对象 animation group object
1、gltf等模型使用
子节点 child nodes
直接在世界坐标下(不考虑层级树状关系),默认false
实体对象 entity object
是否固定大小,默认是false 1、如果固定大小,则相机的尺寸不跟随canvas 的resize而改变。(this.size是undefined) 2、用途: A、镜面反射等场景下,需要固定相机的尺寸,否则会导致反射效果异常 B、其他一些场景需要固定相机的尺寸的情况 3、如果固定大小,则相机的尺寸不能改变,GBuffer的尺寸也不能改变(也会单独处理)
节点ID node ID
骨架皮肤数据 ArrayBuffer of jointsMat 1、有数据,则存在骨骼动画。 2、工作流(每个NodeObject的逆绑定矩阵(世界逆绑定矩阵)=NodeObject的matrixWorld*inverseBindMatrix) A、获得matrixWorld, B、根据jointsMat,计算出每个joint的world matrix。
相机的lookAt坐标
初始化矩阵
模型对象 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、如果存在多个权重动画组,这个标志为当前使用的权重动画组。
背景颜色 无,则使用场景的背景色
shader 中的systemMVP的arraybuffer
struct st_system_mvp {
model: mat4x4f,
view: mat4x4f,
projection: mat4x4f,
cameraPosition: vec3f,
reversedZ: u32,
};
归一化的方向 lookAt 的 vector
初始化参数
是否全局坐标系的lookAt
local matrix
当前entity在世界坐标(层级的到root),可以动态更新 1、在directInWorldSpace为true时,matrixWorld与matrix相同 2、在directInWorldSpace为false时,matrixWorld为matrix的累计乘积
model matrix
MVP的Mat4的数组,[VP,view,projection] MVP中的M=V*P V=viewMatrix P=projectionMatrix
是否进行色调映射,默认是true 1、在camera应用在反射或镜像等场景,不需要进行色调映射,否则会进行二次映射射,导致在主camera的最终颜色异常。
是否需要更新本地矩阵
是否用户自定义更新函数
是否用户自定义更新函数,在update()函数最后调用
是否需要更新全局矩阵
单独设置背景色的预乘, 初始化参数中: 1、无|false:使用系统的背景色和预乘 2、true;则需要设置背景颜色
projection Matrix
todo:20251011,需要一系列验证;另外,最终输出的时候也需要考虑尺寸,尤其是copy的情况
相机管理器的大小 1、默认与场景大小相同 2、可以手动设置大小,有大小的camera,其尺寸不跟随canvas 的resize而改变。
stageID
GPUBuffer :系统的uniform buffer, 1、MVP 2、cameraPosition 3、reversedZ
节点类型 node type
4*4=matrix *4=byte *n=行数
节点UUID node UUID
view matrix
节点是否可见,如果不在root的树,则visible为false,但没有删除,还在资源池中 node visible
在世界坐标下的位置(x,y,z)
是否直接在世界坐标下(不考虑层级树状关系)
获取物理体对象 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、手工更新Position和LookAt之后执行。 2、如果有控制器,需要更新Position和LookAt执行,否则控制器不会检查变化(从而无法更新位置和方向)。
归一化的方向 * lookAt 的 vector
向上递归,判断是否可用性
获取本地坐标下的lookAt
返回MVP矩阵,分别是M,V,P三个矩阵
Mat4[]
向上递归,判断是否可见 1、通过parent.type 判断是否为root节点
三段式初始化的第二步:init()
Optionalparent: NodeObjectOptionalrenderID: number三段式初始化的第三步: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
设置lookAt,从本地坐标转换到世界坐标
本地坐标的lookAt
替换pos的位置(matrix的:12,13,14),其他的matrix数据不变, 将entity的位置变为POS,等价wgpu-matrix的mat4的translation,是替换,不是增加
:Vec3
设置viewMatrix,通过position
在现有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()
更新systemMVP
更新camera的modelMatrix and viewMatrix 1、用途: A、更新_position 和worldPosition B、通过position,dir更新camera的modelMatrix and viewMatrix 更新this.MPV[](M,V,P),其中projectionMatrix不再整理更新
A、position必须是camera的世界坐标系下 position
B、如果是camera的local坐标系(控制器模式),需要显示增加isControlMode=true.然后转换为世界坐标。
A、如果是控制器模式,需要将position转换为世界坐标。
B、direction 和normalize 不使用,通过lookat的世界坐标,重新计算方向。若使用,或需要确保也是世界坐标系下的位置或方向
:摄像机位置 *
:摄像机方向(归一化)||看向的位置(非归一化) *
:摄像机方向是否归一化的 *
OptionalisControlMode: booleanMVP的Mat4[]
1、矩阵操作一般来说: CPU中:SRT(右乘),行向量列矩阵=行向量 GPU中: TRS(左乘),列矩阵列向量=列向量
2、更新矩阵的顺序是先进行线性变换,再进行位置变换。其实是没有影响,线性工作在3x3矩阵,位置变换在[12,13,14],列优先。
3、旋转部分,四元数优先,然后后轴旋转。 A、在模型gltf中,旋转使用四元数。
更新世界矩阵, 递归乘以父节点的矩阵
Optional_parentMatrixWorld: Float32Array<ArrayBufferLike>强制更新世界矩阵
更新透视相机的投影矩阵
更新自身属性。 1、更新控制器或根据worldPosition更新属性 A、updateByPositionDirection B、updateByPositionYawPitch
2、本fn在update()的updateMatrix()之后调用。 updateMatrix(): ->updateMatrixWorld() ->updateMatrix() ->updateWorldPosition() 所以,调用控制器更新数据之后,需要再次更新position数据: 包括 : _position:下一帧updateMatrix()使用; worldPosition:system中camera的世界坐标 PositionOfModelMatrix:shader 的uniform 使用 MVP中的modelMatrix
更新自己的属性
更新世界位置 1、entity的worldPosition 是entity的position在世界坐标系下的位置 2、如果没有提供世界矩阵,默认使用entity的matrixWorld
Optional_matrixWorld: Float32Array<ArrayBufferLike>世界矩阵
世界位置
摄像机抽象类