Описание
Шкала, применяемая к обратной массе и тензору инерции тела перед решением ограничений.
Масштабируйте массу и тензор инерции, чтобы решатель суставов сходился быстрее, что приводит к меньшему растяжению конечностей типичной тряпичной куклы. Наиболее полезно в сочетании с Joint.connectedMassScale.
Например, если у вас есть два объекта в тряпичной кукле с массами 1 и 10, физический движок обычно разрешает соединение, изменяя скорость более легкого тела намного больше, чем более тяжелого. Применение шкалы масс 10 к первому телу заставляет решатель изменять скорость обоих тел на одинаковую величину. Применение масштабов масс таким образом, чтобы сустав воспринимал аналогичные эффективные массы и инерции, ускоряет сходимость решателя, что может сделать отдельные суставы менее эластичными или разделенными, а наборы сочлененных тел - менее дергаными
Обратите внимание, что масштабирование массы и инерции принципиально нефизично, и импульс не сохраняется.
Следующий скрипт полезен для настройки масштабирования массы и инерции, чтобы получить одинаковую корректирующую скорость от решателя. Прикрепите его к корню тряпичной куклы или к конечности, которая чрезмерно растянулась во время игры, и он найдет все суставы в иерархии преобразования ниже себя и отрегулирует масштаб массы.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NormalizeMass : MonoBehaviour
{
private void Apply(Transform root)
{
var j = root.GetComponent<Joint>();
// Apply the inertia scaling if possible
if (j && j.connectedBody)
{
// Make sure that both of the connected bodies will be moved by the solver with equal speed
j.massScale = j.connectedBody.mass / root.GetComponent<Rigidbody>().mass;
j.connectedMassScale = 1f;
}
// Continue for all children...
for (int childId = 0; childId < root.childCount; ++childId)
{
Apply(root.GetChild(childId));
}
}
public void Start()
{
Apply(this.transform);
}
}