Изменение pivot у меша в Unity

Части и запчасти к проектам, дополнительное программное обеспечение.

Изменение pivot у меша в Unity

Сообщение Diab10 13 янв 2015, 13:08

Всем привет.
Написал для себя утилиту для изменения пивота . Меняется только позиция, без поворота. Если мне понадобится, то и поворот сделаю, а пока - лень :)
Выкладываю, мб кому пригодится.
Удобство в этом методе в том, что пивот устанавливается "наглядно" передвижением объекта(подробности ниже), а не как тут установкой значений.

Код:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections;

public class SetPivots : EditorWindow
{
       
        public Transform oldPosition;
        public Transform newPosition;

        [MenuItem("Tools/Set Pivots")]
        public static void CreateWindow()
        {
                SetPivots window = GetWindow<SetPivots>();
                window.title = "Set Pivots";
        }
       
        public void OnGUI()
        {
                GUILayout.Space (20);
                GUILayout.BeginHorizontal();
                GUILayout.Label("Object:", GUILayout.Width(120));
                oldPosition = (Transform)EditorGUILayout.ObjectField(oldPosition, typeof(Transform),true);
                GUILayout.EndHorizontal();

                GUILayout.Space (20);

                GUILayout.BeginHorizontal();
                GUILayout.Label("New Position:", GUILayout.Width(120));
                newPosition = (Transform)EditorGUILayout.ObjectField(newPosition, typeof(Transform),true);
                GUILayout.EndHorizontal();

                GUILayout.Space (20);

                if(GUILayout.Button("Edit pivot mesh"))
                {
                        if(oldPosition==null)
                        {
                                Debug.LogError("No Object!");
                                return;
                        }
                        if(newPosition==null)
                        {
                                Debug.LogError("No newPosition!");
                                return;
                        }
                        MeshFilter mesh = oldPosition.GetComponent<MeshFilter>();
                        if(mesh==null)
                        {
                                Debug.LogError("No MeshFilter in Object!");
                                return;
                        }

                        Vector3 vect = new Vector3(newPosition.position.x-oldPosition.position.x,newPosition.position.y-oldPosition.position.y,newPosition.position.z-oldPosition.position.z);

                        Vector3[] verts = mesh.sharedMesh.vertices;
                        for(int i=0; i<verts.Length; i++) {
                                verts[i] += vect;
                        }
                        mesh.sharedMesh.vertices = verts;
                        mesh.sharedMesh.RecalculateBounds();

                        newPosition.position = oldPosition.position;

                        Debug.Log("Edit OK.");
                }
        }
}
 


Создайте в Project папку Editor. В этой папке создайте C# скрипт с именем SetPivots и положите в него данный скрипт.

Использование:

1. Объект, у которого нужно изменить пивот помещаем на сцену. Создаём для него клона, нажатием Ctrl+D. Устанавливаем клона так, как должен стоять меш после изменения пивота.
2. Вверху появится меню Tools/Set Pivots. Открыть его.
3. В поле Object поместить исходный объект, который с мешем.
4. В поле New Position поместить клона.
5. Нажать кнопку "Edit pivot mesh".
6. Если всё хорошо, то меш изменится и в консоле будет надпись "Edit OK.". Иначе - в консоле будет ошибка.
7. Клона можно удалить.

Внимание! Данная утилита меняет исходник меша в проекте, это необратимая операция! Обращайтесь осторожно :)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Вернуться в Компоненты (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4