Unity3d 旋转时,网格渲染器的边界错误

Unity3d 旋转时,网格渲染器的边界错误,unity3d,Unity3d,当我尝试获取模型的边界(在Blender中创建)并在Inspector中显示它们时: 如您所见,当对象未旋转时,边界是正确的。但当它们是(最左边的对象)时,边界开始变得完全错误 以下是显示/获取边界的脚本: using System.Collections; using System.Collections.Generic; using UnityEngine; public class GetBounds : MonoBehaviour { public MeshRenderer

当我尝试获取模型的边界(在Blender中创建)并在Inspector中显示它们时:

如您所见,当对象未旋转时,边界是正确的。但当它们是(最左边的对象)时,边界开始变得完全错误

以下是显示/获取边界的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetBounds : MonoBehaviour
{
    public MeshRenderer mesh_renderer = null;

    public bool show_bounds = false;

    private void OnDrawGizmos()
    {
        if (!show_bounds) return;

        Gizmos.DrawWireCube(mesh_renderer.bounds.center, mesh_renderer.bounds.size);
        Gizmos.DrawWireSphere(mesh_renderer.bounds.center, 0.3f);
    }
}
我怎样才能解决这个问题呢?

在中,我遇到了这张图片,它可以很好地解释这个问题

Unity dos不会一直重新计算网格,除非您第一次添加网格或“手动”调用

然后,它使用此局部空间
Mesh.bounds
,以便基于
Mesh.bounds
在全局空间中计算平移、缩放和旋转的
Renderer.bounds
。这样,它总是需要迭代固定数量的边界框的8个顶点

如果希望直接从顶点计算出精确的边界,还提供了一个解决方案。我领养了它,并把它清理了一点

public类GetBounds:monobhavior
{
公共网格渲染器mesh_渲染器;
公共边界;
公共网过滤器;
公共网格;
private void OnDrawGizmos()
{
如果(!mesh_渲染器)返回;
如果(!show_bounds)返回;
如果(!meshFilter)meshFilter=mesh_renderer.GetComponent();
如果(!meshFilter)返回;
如果(!mesh)mesh=meshFilter.mesh;
如果(!mesh)返回;
var顶点=网格顶点;
如果(vertices.Length在中我遇到了这张图片,这很好地解释了这一点

Unity dos不会一直重新计算网格,除非您第一次添加网格或“手动”调用

然后,它使用此局部空间
Mesh.bounds
,以便基于
Mesh.bounds
在全局空间中计算平移、缩放和旋转的
渲染器.bounds
。这样,它始终必须迭代边界框的固定数量的8个顶点

如果您想直接从顶点计算出精确的边界,还提供了一个解决方案

public类GetBounds:monobhavior
{
公共网格渲染器mesh_渲染器;
公共边界;
公共网过滤器;
公共网格;
private void OnDrawGizmos()
{
如果(!mesh_渲染器)返回;
如果(!show_bounds)返回;
如果(!meshFilter)meshFilter=mesh_renderer.GetComponent();
如果(!meshFilter)返回;
如果(!mesh)mesh=meshFilter.mesh;
如果(!mesh)返回;
var顶点=网格顶点;

如果(vertices.Length)希望这能回答您的问题!希望这能回答您的问题!在最后一行中,有一个小错误:“Gizmos.DrawWireCube(bounds.center,B.size);”应该是“Gizmos.DrawWireCube(bounds.center,bounds.size);”@derHugo先生,以下主题我找到了你的答案。你知道unity场景中的默认白框是由unity或其网格部分计算的吗?这不会随着游戏对象的旋转而改变。但是,当它没有与gamobject的轴对齐时,我遇到了问题。感谢你在最后一行中的评论,这里有一个small打字错误:“Gizmos.DrawWireCube(bounds.center,B.size);”应该是“Gizmos.DrawWireCube(bounds.center,bounds.size);”@derHugo先生,以下主题我找到了你的答案。你知道unity场景中的默认白框是由unity或其网格部分计算的吗?这不会随着游戏对象的旋转而改变。但是,当它不与游戏对象的轴对齐时,我遇到了问题。谢谢你的评论