Страница 1 из 1

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

СообщениеДобавлено: 10 янв 2017, 21:38
casss
Друзья,как можно определить в какую сторону вращается обьект,по часовой стрелке или против ?

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

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

Изображение

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

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

Изображение

Хорошо,а с помощью какой функции можно проверить в какую сторону относительно камеры вращается обьект?

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

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

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

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

В 3D пространстве и объект поворачивается с помощью мыши вправо и влево.

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

СообщениеДобавлено: 11 янв 2017, 02:20
Paul Siberdt
То есть игрок, вращая объект мышью, не в курсе, в какую сторону он вращается? Это как? :)

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

СообщениеДобавлено: 11 янв 2017, 10:17
casss
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);
        }
}

знать направление вращения мне нужно для того ,чтобы если крутил рычаг вправо то другой объект поднимался,а если влево,то опускался :)