Unity 中 Pivot 与 Center,重置模型物体的轴心为中心

03-27 5809阅读 0评论

文章目录

  • 1. 概念
  • 2. 动态计算正确的模型中心点Center
  • 3. 重置模型物体的轴心为中心

    1. 概念

    在 Unity 面板的左上角有两个按钮,在本文中主要研究 Pivot/Center

    Unity 中 Pivot 与 Center,重置模型物体的轴心为中心 第1张

    • Pivot(轴心):模型的真实位置,是由建模软件设定的可在模型软件中更改,如果选中了场景中多个物体则坐标是第一个选择的Pivot坐标,transform.position 获取的就是 pivot ,是模型旋转、缩放的参考点

      对于Unity中可创建的2D,3D资源是不能更改轴心点的,对于导入的资源可以进行修改

      • 2D:可以在Project->选择2D精灵图片->Import Settings->Pivot
      • 3D:可以在模型软件中更改Pivot的坐标,也就是更改模型的轴

        Center(中心):由Unity根据模型的 mesh 计算出来的中心位置,是选择的所有物体的物理上的中心,如果选择了多个物体则坐标是所有选择的物体的中心,getComponent().bounds.center 获取的是center坐标

        2. 动态计算正确的模型中心点Center

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

        3. 重置模型物体的轴心为中心

        遇到的问题:因为在Unity开发中经常会遇到模型物体的轴心点偏离模型很远的情况,导致我们在操作位置,旋转,缩放时很麻烦,我们很希望轴心点是物体模型的网格中心

        Unity 中 Pivot 与 Center,重置模型物体的轴心为中心 第2张

        解决方法:

        1.在建模软件(3dmax,maya等)里面设置后导出.个人觉得麻烦…

        2.自己创建一个空物体拖拽至目标模型的网格中心,然后将目标模型物体拖拽入创建的空物体中,来达到重置轴心的目的(但将空物体拖拽至目标模型的网格中心还是有些困难的,主要是得自己用眼色去判断…)

        3.写脚本(最方便)

        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(true);
                if (meshRenderers.Length == 0)
                {
                    EditorUtility.DisplayDialog(dialogTitle, "选中的物体不是有效模型物体!!!", "确定");
                    return;
                }
                //将所有的网格渲染的边界进行合并
                Bounds centerBounds = meshRenderers[0].bounds;
                for (int i=1;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, "重置模型物体的轴心完成!", "确定");
            }
        }
        

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,5809人围观)

还没有评论,来说两句吧...

目录[+]