Поворот обьекта

Программирование на Юнити.

Поворот обьекта

Сообщение casss 10 янв 2017, 21:38

Друзья,как можно определить в какую сторону вращается обьект,по часовой стрелке или против ?
casss
UNIт
 
Сообщения: 62
Зарегистрирован: 22 фев 2016, 19:41

Re: Поворот обьекта

Сообщение Paul Siberdt 10 янв 2017, 21:53

Запомните предыдущее вращение объекта, получите кватернион вращения объекта от предыдущего значения к текущему, представьте кватернион в эвлеровых координатах и посмотрите знаки.
Однако, не забываем о теоории относительности...

Изображение
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Поворот обьекта

Сообщение casss 10 янв 2017, 22:04

Paul Siberdt писал(а):Запомните предыдущее вращение объекта, получите кватернион вращения объекта от предыдущего значения к текущему, представьте кватернион в эвлеровых координатах и посмотрите знаки.
Однако, не забываем о теоории относительности...

Изображение

Хорошо,а с помощью какой функции можно проверить в какую сторону относительно камеры вращается обьект?
casss
UNIт
 
Сообщения: 62
Зарегистрирован: 22 фев 2016, 19:41

Re: Поворот обьекта

Сообщение Paul Siberdt 10 янв 2017, 22:10

Вы про 2Д или 3Д? Во втором случае, объект может вращаться не только вправо или влево, но еще в стопятистах направлениях.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Поворот обьекта

Сообщение casss 10 янв 2017, 23:13

Paul Siberdt писал(а):Вы про 2Д или 3Д? Во втором случае, объект может вращаться не только вправо или влево, но еще в стопятистах направлениях.

В 3D пространстве и объект поворачивается с помощью мыши вправо и влево.
casss
UNIт
 
Сообщения: 62
Зарегистрирован: 22 фев 2016, 19:41

Re: Поворот обьекта

Сообщение Paul Siberdt 11 янв 2017, 02:20

То есть игрок, вращая объект мышью, не в курсе, в какую сторону он вращается? Это как? :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Поворот обьекта

Сообщение casss 11 янв 2017, 10:17

Paul Siberdt писал(а):То есть игрок, вращая объект мышью, не в курсе, в какую сторону он вращается? Это как? :)

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

public class DragRotateX : MonoBehaviour
{
        public Vector3 selectedAxis = Vector3.one;
        public float speed = 5;



        private Quaternion originalRotation;
        private float startAngle = 0;
        public Vector3 tempVector;

        public void Start()
        {
                originalRotation = this.transform.rotation;
        }
        public void Update()
        {
                if (Input.GetMouseButtonDown(0))
                {
                        MouseDown();
                }

                //This block of code should be the last 2 things in your update
                if (Input.GetMouseButton(0))
                {
                        MouseHeld();
                        return;
                }
                transform.localEulerAngles = RotateAxisToNearestSide(transform.localEulerAngles, selectedAxis);
        }

        Vector3 RotateAxisToNearestSide(Vector3 eulerAngles, Vector3 selectedAxis)
        {
                Vector3 rounded = RoundToNearest90Degree(eulerAngles);
                Vector3 slerped = Vector3.Slerp(eulerAngles, rounded, Time.deltaTime * speed);
                return SetSelectedAxis(eulerAngles, slerped, selectedAxis);
        }

        Vector3 RoundToNearest90Degree(Vector3 eulerAngles)
        {
                for(int i = 0; i < 3; i++)
                {
                        eulerAngles[i] = Mathf.Round(eulerAngles[i] / 90f) * 90f;
                }
                return eulerAngles;
        }

        Vector3 SetSelectedAxis(Vector3 original, Vector3 desired, Vector3 selectedAxis)
        {
                for(int i = 0; i < 3; i++)
                {
                        if(selectedAxis[i] != 0)
                        {
                                selectedAxis[i] = desired[i];
                        }else{
                                selectedAxis[i] = original[i];
                        }
                }

                return selectedAxis;
        }






        public void MouseDown()
        {
                originalRotation = this.transform.rotation;
                Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
                Vector3 vector = Input.mousePosition - screenPos;
                startAngle = Mathf.Atan2(vector.y, vector.x) * Mathf.Rad2Deg;
        }
        public void MouseHeld()
        {
                Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
                Vector3 vector = Input.mousePosition - screenPos;
                float angle = Mathf.Atan2(vector.y, vector.x) * Mathf.Rad2Deg;
                Quaternion newRotation = Quaternion.AngleAxis(angle - startAngle, this.transform.up);
                newRotation.z = 0;
                newRotation.eulerAngles = new Vector3(0, -newRotation.eulerAngles.y, 0);
                this.transform.rotation = originalRotation * (newRotation);
        }
}

знать направление вращения мне нужно для того ,чтобы если крутил рычаг вправо то другой объект поднимался,а если влево,то опускался :)
casss
UNIт
 
Сообщения: 62
Зарегистрирован: 22 фев 2016, 19:41


Вернуться в Скрипты

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

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