transform.rotatin.z возвращает странный угол

125
08 февраля 2021, 05:30

Вот код

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Gun : MonoBehaviour
{
    private Vector3 mousePosition;
    public GameObject bullet;
    public GameObject bulletSpawn;
    private float headRotation;
    public static float rotation_z;
    private void Start()
    {
        headRotation = transform.localRotation.z; // при transform.rotation.z возвращает тот же угол
        Debug.Log("Z rotaton: " + transform.rotation.z);
    }
    void Update()
    {
        mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        // поворот пушки
        var difference = mousePosition - transform.position;
        var angle = 90;
        difference.Normalize();
        // вычисление угла
        rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
        // поворачиваем
       float additionalAngle = 0;
       if (headRotation == 90)
            additionalAngle = 0;
        else if (headRotation == -90)
            additionalAngle = 180;
        else if (headRotation == 0)
            additionalAngle = -90;
        transform.rotation = Quaternion.Euler(0f, 0f, rotation_z + additionalAngle);

Мои спрайты имеют разный угол, однако выполняют оду и туже роль. Атлас довольно большой и поэтому я решил написать пару if для решения проблемы с разными углами. Однако, когда я взял данные об угле, ожидая увидеть угол z из инспектора, обнаружил угол 0,7071068, вместо 90 (и -0,7071068 при -90). Что произошло? Где он взял этот угол?

Answer 1

Для того, чтобы понять, как работают повороты объектов в Unity (да и не только в Unity), придется окунуться в пространственную геометрию.

Что такое поворот? Это изменение положение объекта относительно некой оси.

Как можно описать поворот? Двумя способами:

  1. Используя углы Эйлера - рысканье, тангаж и крен. По ссылке - краткий экскурс для начала.

  2. Используя кватернионы - аналогично.

Кватернион кодируется 4-мя числами - {x, y, z, w}, где {x, y, z} - вектор оси поворота, а w - угол поворота.

Принципиальная разница в том, что углами Эйлера мы поворачиваем систему координат, а с помощью кватернионов задаем вектор оси и доворачиваем на нужный угол.

Советую вам потратить время и разобраться с математикой, потом будет гораздо проще (проверено на личном примере).

READ ALSO
Вызов метода контроллера MVC из папки Scripts

Вызов метода контроллера MVC из папки Scripts

Есть следующий контроллер:

136
Влияет ли имя таблицы, как параметр хранимой процедуры, на производительность?

Влияет ли имя таблицы, как параметр хранимой процедуры, на производительность?

Хочу реализовать хранимую процедуру, которая будет принимать название таблицы, колонки и значение для повышения производительности, тк

115
Можно ли сделать в MySQL CREATE TABLE LIKE с триггерами?

Можно ли сделать в MySQL CREATE TABLE LIKE с триггерами?

Возможно ли перенести триггеры в другую(точно такую же) таблицу в MySQL? У меня есть таблица test, со временем я её архивирую и на ее месте создаю...

136
MySQL текущая дата + значение

MySQL текущая дата + значение

Можно ли в MySQL создать столбец, в котором дата будет по умолчанию вычисляться как "дата1 + некоторое количество дней"? Например, у меня есть...

128