c# - 如何找到 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 可以在骨骼的影响下进行缩放。即使在这种情况下,我也希望它能够正常工作。
解决方案
在您透露的评论中,您实际上正在使用
SkinneMeshRenderer.sharedMesh.bounds
但请注意,这样你得到的Mesh.bounds
确实是网格坐标空间的局部。
这是网格在其局部空间中的轴对齐边界框(即不受变换影响)。请注意,该
Renderer.bounds
属性类似,但返回世界空间中的边界。
也是sharedMesh
所有实例之间共享的原始实例,还不受蒙皮影响;)
你想要的是
SkinnedMeshRenderer.bounds
为了得到这个渲染器实例的世界空间边界。看Renderer.bounds
渲染器的包围体(只读)。
这是在世界空间中完全包围对象的轴对齐边界框。
请注意,Mesh.bounds 属性类似,但返回网格在本地空间中的边界。
推荐阅读
- python - 使用检查点数据框覆盖表失败并出现 FileNotFoundException
- python-3.x - Sqlite 数据存储
- android - Kotlin 和 android studio 中的 HTTP 获取请求
- geant4 - 使用 Geant4 运行 exampleB1.exe 时未找到 ENSDFSTATE.dat 文件错误
- java - 骆驼sql存储的java,无法输入数组作为oracle存储过程的输入参数
- java - 如何使用处理在单独的线程中读取 OpenGL 像素?
- migration - 如何从主应用程序运行另一个应用程序的迁移
- php - 试图过滤品牌名称但它不起作用
- python-3.x - 您可以删除一个随机的逗号字符串并替换为一个以导出到 CSV
- javascript - 舍入函数给出不同的结果