SkinnedMeshRenderer相关知识

发布于:2025-02-10 ⋅ 阅读:(41) ⋅ 点赞:(0)

SkinnedMeshRenderer和MeshRenderer

unity中SkinnedMeshRenderer是CPU去更改顶点位置的。
而当使用MeshRenderer时,可以靠GPU来进行蒙皮(即更改顶点位置)。
SkinnedMeshRenderer是多线程处理的,在小程序游戏中,只支持同步处理,所以小程序游戏最好使用MeshRenderer去进行蒙皮处理

蒙皮

描述

将骨骼(Bone)与网格(Mesh)的顶点(Vertices)关联起来的过程。

顶点动画

描述

通过在动画帧中直接修改mesh顶点的位置来实现,通常在mesh顶点数目较少,动画简单的情况下使用,如草的摆动,树的摆动,水的波动等

蒙皮动画

描述

通过在动画中直接修改bone的位置,让mesh的顶点随着bone的变化而变化,通常用于人形动画,如人物的跑动,跳跃等

原理

顶点在骨骼下的相对坐标保持不变,骨骼根据动画作移动。

bones

SkinnedMeshRenderer skinnedMeshRenderer = go.GetComponent<SkinnedMeshRenderer>();
Transform[] bones = skinnedMeshRenderer.bones;
描述

用于对网格进行蒙皮的骨骼。

bindposes

Mesh mesh = skinnedMeshRenderer.sharedMesh;
Matrix4x4[] bindposes = mesh.bindposes;
描述

每根bone从mesh空间到自己的bone空间的变换矩阵。
绑定姿势。每个索引处的绑定姿势引用索引相同的骨骼。
当骨骼处于绑定姿势时,绑定姿势是骨骼变换矩阵的逆矩阵。

boneWeight和vertices

描述

boneWeight:描述 4 个影响网格顶点的蒙皮骨骼权重。
vertices:mesh的顶点位置的副本或分配新顶点位置数组。

关系

BoneWeight和vertices的下标在Unity中是一一对应的。每个BoneWeight数组中的元素都直接关联到vertices数组中相同索引的顶点。这意味着,如果你有一个顶点数组和一个蒙皮权重数组,它们的大小(长度)通常是相同的,并且数组的每个索引位置都对应于同一个网格顶点的蒙皮信息。

Mesh mesh = skinnedMeshRenderer.sharedMesh;
BoneWeight[] boneWeights = mesh.boneWeights;
Vector3[] vertices = mesh.vertices;
bones、bindPoses和boneWeight的关系

通过boneWeight的boneIndex0存储的骨骼索引能够拿到bones数组中的骨骼Transform数据。
通过boneWeight的boneIndex0存储的骨骼索引能够拿到bindPoses数组中的骨骼变换矩阵数据。

Transform bone = bones[boneWeight.boneIndex0];
Matrix4x4 bindpose = bindposes[boneWeight.boneIndex0];

网站公告

今日签到

点亮在社区的每一天
去签到