C# 如何设置预制儿童的重心?

C# 如何设置预制儿童的重心?,c#,unity3d,C#,Unity3d,我在unity中有一个3d模型预置,我正在尝试添加物理。问题是预制件是从auto desk导入的,发生这种情况时,所有子网格对象的枢轴/重心都不是您所期望的位置。我曾尝试将刚体附加到各种子对象,并使用脚本设置质心,但它似乎没有像我预期的那样工作。我设置重心的方法是在高亮显示的对象两端创建两个子游戏对象,并使用中点公式设置“足够好”的重心。除了重建/重新导入对象之外,还有其他解决方法吗 显示偏心轴 显示奇怪的重心 使用系统; 使用系统集合; 使用System.Collections.Gener

我在unity中有一个3d模型预置,我正在尝试添加物理。问题是预制件是从auto desk导入的,发生这种情况时,所有子网格对象的枢轴/重心都不是您所期望的位置。我曾尝试将刚体附加到各种子对象,并使用脚本设置质心,但它似乎没有像我预期的那样工作。我设置重心的方法是在高亮显示的对象两端创建两个子游戏对象,并使用中点公式设置“足够好”的重心。除了重建/重新导入对象之外,还有其他解决方法吗

显示偏心轴

显示奇怪的重心

使用系统;
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类重心:单一行为
{
//在第一帧更新之前调用Start
公共中心点;
公共刚体;
void Start()
{
centerPoints=gameObject.GetComponentsInChildren();
Transform center1=Array.Find(centerPoints,elem=>elem.name.Equals(“center1”);
Transform center2=Array.Find(centerPoints,elem=>elem.name.Equals(“center2”);
向量3中心=(center1.localPosition+center2.localPosition)/2.0f;
rb=GetComponent();
rb.ResetCenterOfMass();
rb.centerOfMass=中心;
}
//每帧调用一次更新
无效更新(){}
}

首先是一些免责声明,恐怕在unity中无法做到这一点,但是!当我遇到类似问题时,我遇到了一个解决方法。问题是,我不太确定您的工作管道是什么,这个修复可能比在auto desk中修改网格并重新导入它更糟糕


其想法是将您的对象临时移动到另一个游戏对象,然后修改损坏的轴并将其恢复到原始对象。这个想法来源于此。它也可能对你有用

每次我必须更改对象的重心时,我都会在我希望成为重心的位置创建一个空的子游戏对象

之后,我将对象的重心偏移质量设置为新子对象的局部位置,如下所示:

    public GameObject childObj, myObj;

    void Start()
    {
      myObj.GetComponent<Rigidbody>().centerOfMass = childObj.transform.localPosition;
    }
公共游戏对象childObj,myObj;
void Start()
{
myObj.GetComponent().centerOfMass=childObj.transform.localPosition;
}
编辑:

如果要更改游戏对象的轴,需要执行以下操作:

1-创建一个空游戏对象并将其命名为“Pivot”

2-将轴放置在希望重心所在的位置

3-a将您要更改的初始游戏对象指定为名为“pivot”的新对象的子对象


现在,初始游戏对象的轴心应该是称为轴心的空游戏对象。

第二张图像仍然只显示刚体对象的轴心所在的位置,而不让我们看到重心所在的位置。另外,第一张图像是父对象的,因此很难说出预期结果与实际结果之间的确切差别。。。一般来说,似乎所有对象的轴都“错误”地放置在父轴上。。。但默认情况下,afaik Unity使用几何体中心(MeshRenderer.bounds的)作为默认质量中心。我的假设是,质量中心/轴是相同的,因为一旦模拟开始,高亮显示对象的轴点就直接位于旋转轴的下方(与右侧对象相同)。理想的结果是高亮显示的对象将以90度角垂直向下静止,而不是倾斜不会改变游戏对象的轴心点,而且网格数据很可能不会转换以匹配该中心。。。。第二张图像证明,轴仍然完全位于同一点,只有对象旋转了45°…a)是的,您可以通过变换原始网格顶点来重新计算轴。b) 如果这是不可能的,那有什么好处呢?我做了类似的事情,只是我在两端创建了两个空的儿童游戏对象,并将重心设置在中点。在任何情况下,无论出于何种原因,更改质心似乎对高亮显示的对象没有影响。
    public GameObject childObj, myObj;

    void Start()
    {
      myObj.GetComponent<Rigidbody>().centerOfMass = childObj.transform.localPosition;
    }