Unity 6.3
0 онлайн 29 гостей 3 в системе
Вход

Mesh.GetAllBoneWeights

Declaration

public NativeArray<BoneWeight1> GetAllBoneWeights();

Возвращаемое значение

NativeArray<BoneWeight1> Возвращает все ненулевые веса костей для сетки, в порядке индекса вершин. Массив использует Allocator.None и не требует удаления вручную. Данные остаются действительными до тех пор, пока сетка не будет изменена или уничтожена.

Описание

Получает весы костей для сетки.

Используйте Mesh.GetBonesPerVertex для получения числа ненулевых весов для каждой вершины, а затем используйте это для итерации над этими данными.

Для каждой вершины структуры BoneWeight1 сортируются по BoneWeight1.weightв убывающем порядке.

Дополнительные ресурсы: Mesh.SetBoneWeights, Mesh.GetBonesPerVertex, Mesh.boneWeights, Mesh.GetBoneWeights ModelImporter.maxBonesPerVertex, QualitySettings.skinWeights, SkinnedMeshRenderer.quality.

using UnityEngine;

public class TestSkinnedMesh : MonoBehaviour { void Start() { // Get a reference to the mesh var skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>(); var mesh = skinnedMeshRenderer.sharedMesh;

// Get the number of bone weights per vertex var bonesPerVertex = mesh.GetBonesPerVertex(); if (bonesPerVertex.Length == 0) { return; }

// Get all the bone weights, in vertex index order var boneWeights = mesh.GetAllBoneWeights();

// Keep track of where we are in the array of BoneWeights, as we iterate over the vertices var boneWeightIndex = 0;

// Iterate over the vertices for (var vertIndex = 0; vertIndex < mesh.vertexCount; vertIndex++) { var totalWeight = 0f; var numberOfBonesForThisVertex = bonesPerVertex[vertIndex]; Debug.Log("This vertex has " + numberOfBonesForThisVertex + " bone influences");

// For each vertex, iterate over its BoneWeights for (var i = 0; i < numberOfBonesForThisVertex; i++) { var currentBoneWeight = boneWeights[boneWeightIndex]; totalWeight += currentBoneWeight.weight; if (i > 0) { Debug.Assert(boneWeights[boneWeightIndex - 1].weight >= currentBoneWeight.weight); } boneWeightIndex++; } Debug.Assert(Mathf.Approximately(1f, totalWeight)); } } }