首页 > 解决方案 > 如何找到 SkinnedMeshRenderer 的 BoundingBox 的世界坐标

问题描述

我写了一个这样的脚本:

这是通过查看边界框的坐标将对象移动到原点附近的代码。

MeshCheck.cs

using UnityEngine;

public class MeshCheck : MonoBehaviour
{
    Mesh mesh;

    // Start is called before the first frame update
    void Start()
    {
        GameObject topGrp = GameObject.Find("GameObject");

        var MeshRenderer = GetComponent<MeshRenderer>();
        var SkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
        if (MeshRenderer != null)
        {
            Debug.Log("this is MeshRenderer");
            Bounds bounds = MeshRenderer.bounds;
            float meshCenterX = bounds.center.x;
            float meshMinCenterY = bounds.center.y - bounds.extents.y;
            float meshScenterZ = bounds.center.z;
            topGrp.transform.localPosition = new Vector3(-meshCenterX, -meshMinCenterY, -meshScenterZ);
        }
        else if(SkinnedMeshRenderer != null)
        {
            Debug.Log("this is SkinnedMeshRenderer");
            Bounds bounds = SkinnedMeshRenderer.sharedMesh.bounds;
            float meshCenterX = bounds.center.x;
            float meshMinCenterY = bounds.center.y - bounds.extents.y;
            float meshScenterZ = bounds.center.z;
            topGrp.transform.localPosition = new Vector3(-meshCenterX, -meshMinCenterY, -meshScenterZ);
        }
        else
        {
            Debug.Log("this is not mesh");
        }
    }
}

为了测试上面的代码,创建一个名为“GameObject”的空游戏对象,并在其中放置一个立方体等。然后,移动 Cube 后,按下 Start 按钮,确认 Cube 移动到原点。然后将 MeshCheck.cs 附加到 Cube 上。

在此处输入图像描述

在上面的代码中,如果对象有一个 MeshRenderer,它就可以正常工作。

但是当对象有一个 SkinnedMeshRenderer 时,它并没有按预期工作。

SkinnedMeshRenderer的bounding box值是相对坐标,而MeshRenderer的bounding box值是世界坐标,所以我认为可能会出现这种行为。

有没有办法在 SkinnedMeshRenderer 和 MeshRenderer 中获取边界框的世界坐标?

SkinnedMeshRenderer 可以在骨骼的影响下进行缩放。即使在这种情况下,我也希望它能够正常工作。

标签: c#unity3d

解决方案


在您透露的评论中,您实际上正在使用

SkinneMeshRenderer.sharedMesh.bounds

但请注意,这样你得到的Mesh.bounds确实是网格坐标空间的局部。

这是网格在其局部空间中的轴对齐边界框(即不受变换影响)。请注意,该Renderer.bounds属性类似,但返回世界空间中的边界。

也是sharedMesh所有实例之间共享的原始实例,还不受蒙皮影响;)


你想要的是

SkinnedMeshRenderer.bounds

为了得到这个渲染器实例的世界空间边界。看Renderer.bounds

渲染器的包围体(只读)。

这是在世界空间中完全包围对象的轴对齐边界框。

请注意,Mesh.bounds 属性类似,但返回网格在本地空间中的边界。


推荐阅读