Вращение, относительно центра составной фигуры. (решено)

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Вращение, относительно центра составной фигуры. (решено)

Сообщение Monah_Monahich 27 янв 2013, 11:48

Доброго времени...
Есть фигура, составленная из нескольких других фигур. Надо ее вращать, и хочется вращать относительно центра фигуры.

Конструкция, для примера.
Изображение

Код вращения. Привязан к обведенному кубу. При вращении мышкой вращается куб, а вместе с ним и все связанные фигуры. Но вращается относительно этого куба, а не центра всей фигуры.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class testrotation : MonoBehaviour {

        private GameObject SelectObject;
       
        // Use this for initialization
        void Start () {
                SelectObject = new GameObject ();
                SelectObject = GameObject.Find ("Cube1");
        }
       
        // Update is called once per frame
        void Update () {
       
                SelectObject.transform.Rotate(10*Input.GetAxis("Mouse Y"), - 10*Input.GetAxis("Mouse X"),0,0);
        }
}
 


При работе с редактором, есть кнопка "Pivot/Center". При переключении в "Center" в редакторе, фигура поворачивается так, так как мне нужно. Можно тоже самое сделать в коде ? Указать другую точку вращения ?
Последний раз редактировалось Monah_Monahich 27 янв 2013, 20:19, всего редактировалось 1 раз.
Monah_Monahich
UNIт
 
Сообщения: 52
Зарегистрирован: 10 окт 2012, 10:15
Откуда: Украина Киев

Re: Вращение, относительно центра составной фигуры.

Сообщение seaman 27 янв 2013, 11:57

seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Вращение, относительно центра составной фигуры.

Сообщение Monah_Monahich 27 янв 2013, 12:16

seaman писал(а):Transform.RotateAround


Да, копаю. Но почва тверда.
Monah_Monahich
UNIт
 
Сообщения: 52
Зарегистрирован: 10 окт 2012, 10:15
Откуда: Украина Киев

Re: Вращение, относительно центра составной фигуры.

Сообщение Левш@ 27 янв 2013, 13:25

есть кнопка "Pivot/Center". При переключении в "Center" в редакторе, фигура поворачивается так, так как мне нужно.

А у тебя что, пивоты не в центре ?
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Вращение, относительно центра составной фигуры.

Сообщение Monah_Monahich 27 янв 2013, 17:00

Задачку решил при помощи Transform.RotateAround.

Точно не понял, как работает Transform.RotateAround, но на предположениях задача решена. Суть в том, чтобы найти центр фигуры самостоятельно, и подставить его в RotateAround. Дальше все просто. Особенно если фигура стоит в координатах 0,0,0. Надеюсь, для Vector3 сработают операции суммирования.

Код, для объяснения. Довольно большой получился.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class testrotation : MonoBehaviour {
       
        // Фигура.
        private GameObject SelectObject;
        // Все элементы фигуры
        Transform[] testObjects = new Transform[9];

        // Точа вращения всей фигуры.
        Vector3 point1;
        // Направление вращения.
        Vector3 point2;

        void Start () {
                // Присвоения...
                SelectObject = new GameObject ();
                SelectObject = GameObject.Find ("Cube1");
               
                testObjects[1] = GameObject.Find ("Cube1").transform;
                testObjects[2] = GameObject.Find ("Cube2").transform;
                testObjects[3] = GameObject.Find ("Cube3").transform;
                testObjects[4] = GameObject.Find ("Cube4").transform;
                testObjects[5] = GameObject.Find ("Cube5").transform;
                testObjects[6] = GameObject.Find ("Cube6").transform;
                testObjects[7] = GameObject.Find ("Cube7").transform;
                testObjects[8] = GameObject.Find ("Cube8").transform;
               
                // Получение центра фигуры
                // НЕ СТАВИТЬ В UPDATE. Результат не совсем ожидаем.
                point1 = GetNewRotarionPoint();
        }
       

        void Update () {
       
                // Поворот по мышке.
                point2 = new Vector3 (Input.GetAxis("Mouse Y"), - Input.GetAxis("Mouse X"),0);
                // сам поворот.
                SelectObject.transform.RotateAround(point1, point2, 5);
        }
       
        // Расчет центра вращения фигуры.
        // Идея в том, что бы найти среднее арифметическое из расстояний
        // самой отдаленной и самой приближенной фигуры.
        // Не стоит забывать, что это 3Д и координат 3.
        Vector3 GetNewRotarionPoint(){
                // мин и макс значения по координатам.
                float maxX = 0;
                float minX = 0;
                float maxY = 0;
                float minY = 0;
                float maxZ = 0;
                float minZ = 0;
                // результат нахождения среднего арифметического.
                float findX = 0;
                float findY = 0;
                float findZ = 0;
               
                for (int i=1; i<9; i++){
                        // Поиск мин. и макс. знач.
                        if (maxX < testObjects[i].position.x) {maxX = testObjects[i].position.x;}
                        if (minX > testObjects[i].position.x) {minX = testObjects[i].position.x;}
                        if (maxY < testObjects[i].position.y) {maxY = testObjects[i].position.y;}
                        if (minY > testObjects[i].position.y) {minY = testObjects[i].position.y;}
                        if (maxZ < testObjects[i].position.z) {maxZ = testObjects[i].position.z;}
                        if (minZ > testObjects[i].position.z) {minZ = testObjects[i].position.z;}
                }
                // поиск ср. арифм.
                findX = (minX + maxX) / 2;
                findY = (minY + maxY) / 2;
                findZ = (minZ + maxZ) / 2;
               
                // Подготовка и возврат результатов
                Vector3 VectorReturn = new Vector3(findX, findY, findZ);
                return VectorReturn;
        }
}
 




Спасибо всем заинтересовавшимся.
Monah_Monahich
UNIт
 
Сообщения: 52
Зарегистрирован: 10 окт 2012, 10:15
Откуда: Украина Киев


Вернуться в Почемучка

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

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