Pivote y Centro en Unity restablecen el eje del objeto modelo al centro

1. Concepto

Hay dos botones en la esquina superior izquierda del panel de Unity. En este artículo, estudiamos principalmente Pivot/Center.
Insertar descripción de la imagen aquí

  • Pivote (eje): la posición real del modelo la establece el software de modelado y se puede cambiar en el software de modelado. Si se seleccionan varios objetos en la escena, las coordenadas son las primeras coordenadas de pivote seleccionadas, obtenidas mediante transform.position It es pivote, que es el punto de referencia para la rotación y escalado del modelo.

Para los recursos 2D y 3D que se pueden crear en Unity, el punto de pivote no se puede cambiar, pero los recursos importados se pueden modificar.

  • 2D: Puede seleccionar una imagen de sprite 2D en Proyecto->Configuración de importación->Pivotar
  • 3D: Puedes cambiar las coordenadas del Pivot en el software de modelado, es decir, cambiar el eje del modelo.

Centro: la posición del centro calculada por Unity en función de la malla del modelo es el centro físico de todos los objetos seleccionados. Si se seleccionan varios objetos, las coordenadas son los centros de todos los objetos seleccionados, getComponent().bounds.center obtiene el centro coordenadas

2. Calcule dinámicamente el punto central del modelo correcto

using UnityEngine;
 
public class Util : MonoBehaviour
{
    
    
    /// <summary>
    /// 重新计算中心点
    /// </summary>
    /// <param name="go">要重新计算中心点的游戏物体</param>
    public static void RecalculateCenter(GameObject go)
    {
    
    
        if (go.GetComponent<MeshRenderer>() == null)
        {
    
    
            Debug.LogWarning("游戏物体身上没有MeshRenderer组件");
            return;
        }
        Vector3 center = go.GetComponent<MeshRenderer>().bounds.center;
        GameObject newGo = new GameObject(go.name);
        newGo.transform.position = center;
        go.transform.SetParent(newGo.transform);
    }
}

3. Restablezca el eje del objeto modelo al centro.

Problemas encontrados: porque en el desarrollo de Unity, a menudo nos encontramos con situaciones en las que el punto de pivote del objeto del modelo se desvía mucho del modelo, lo que nos causa problemas al operar la posición, la rotación y la escala. Realmente esperamos que el punto de pivote sea el modelo de objeto. Solución del centro de cuadrícula
Insertar descripción de la imagen aquí
:
1. Configúrelo en el software de modelado (3dmax, maya, etc.) y expórtelo. Personalmente, lo encuentro problemático...
2. Cree un objeto vacío usted mismo y arrástrelo al centro de cuadrícula del objetivo. modelo y luego arrastre el objeto del modelo de destino Arrastre al objeto vacío creado para restablecer el eje (pero todavía es un poco difícil arrastrar el objeto vacío al centro de la cuadrícula del modelo de destino. Principalmente debe juzgarlo con tus propios ojos...) 3. Escribe un guión
(más conveniente)

using UnityEngine;
using UnityEditor;

public class MyTool : ScriptableObject
{
    
    
    //重置模型的轴心为中心
    [MenuItem("Tools/MyTool/ResetPivot")]
    static void ResetPivot()
    {
    
    
        //获取选中的物体
        GameObject target = Selection.activeGameObject;
        string dialogTitle = "Tools/MyTool/ResetPivot";

        if (target == null)
        {
    
    
            EditorUtility.DisplayDialog(dialogTitle, "没有选中需要重置轴心的物体!!!", "确定");
            return;
        }

        //获取目标物体下所有网格渲染
        MeshRenderer[] meshRenderers = target.GetComponentsInChildren<MeshRenderer>(true);
        if (meshRenderers.Length == 0)
        {
    
    
            EditorUtility.DisplayDialog(dialogTitle, "选中的物体不是有效模型物体!!!", "确定");
            return;
        }
        //将所有的网格渲染的边界进行合并
        Bounds centerBounds = meshRenderers[0].bounds;
        for (int i=1;i<meshRenderers.Length;i++)
        {
    
    
            centerBounds.Encapsulate(meshRenderers[i].bounds);
        }
        //创建目标的父物体
        Transform targetParent = new GameObject(target.name + "-Parent").transform;
        
        //如果目标原来已有父物体,则将创建目标父物体的父物体设为原父物体;
        Transform originalParent = target.transform.parent;
        if (originalParent != null)
        {
    
    
            targetParent.SetParent(originalParent);
        }
        //设置目标父物体的位置为合并后的网格渲染边界中心
        targetParent.position = centerBounds.center;
        //设置目标物体的父物体
        target.transform.parent = targetParent;

        Selection.activeGameObject = targetParent.gameObject;
        EditorUtility.DisplayDialog(dialogTitle, "重置模型物体的轴心完成!", "确定");
    }
}

Cómo usarlo:
seleccione el objeto que necesita restablecer su eje y luego use el botón RestablecerPivot en Herramientas/MiHerramienta arriba.
Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45136016/article/details/132688040
Recomendado
Clasificación