Unity3D: Отклонить вектор на N градусов

192
12 марта 2018, 23:59

Имеется некоторый единичный вектор, который представляет собой координату в сферическом пространстве. Необходимо получить из него 4 вектора отклонённых в разные стороны(вправо, влево, вперёд, назад) на определённое количество градусов. Для этих действий я использую следующий код:

Vector3 center = point;
Vector3 left = Quaternion.Euler(-30, 0, 0) * center;
Vector3 right = Quaternion.Euler(30, 0, 0) * center;
Vector3 back = Quaternion.Euler(0, 0, -30) * center;
Vector3 front = Quaternion.Euler(0, 0, 30) * center;

Проблема в том, что это работает когда point равен или близок Vector3.up. По мере отклонения от вертикального положения боковые вектора начинают "слипаться".

Вот визуализация того, что мне нужно:

Тестовый код и даже ссылка на тестовую сцену прилагаются.

using System.Collections;
using UnityEngine;
public class Test : MonoBehaviour
{
    public GameObject centerGO;
    public GameObject leftGO;
    public GameObject rightGO;
    public GameObject backGO;
    public GameObject frontGO;
    ArrayList list = new ArrayList();
    void Start()
    {
        SetCenterPoint(Vector3.up);
    }
    void Update()
    {
        DrawDebugRays();
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            SetCenterPoint(hit.point);
        }
    }
    void SetCenterPoint(Vector3 point)
    {
        Vector3 center = point;
        Vector3 left = Quaternion.Euler(-30, 0, 0) * center;
        Vector3 right = Quaternion.Euler(30, 0, 0) * center;
        Vector3 back = Quaternion.Euler(0, 0, -30) * center;
        Vector3 front = Quaternion.Euler(0, 0, 30) * center;
        centerGO.transform.position = center;
        leftGO.transform.position = left;
        rightGO.transform.position = right;
        backGO.transform.position = back;
        frontGO.transform.position = front;
        list.Clear();
        list.Add(center);
        list.Add(left);
        list.Add(right);
        list.Add(front);
        list.Add(back);
    }
    void DrawDebugRays()
    {
        for (int i = 0; i < list.Count; i++)
        {
            Color color = Color.red;
            switch (i)
            {
                case 0:
                    color = Color.green;
                    break;
                case 1:
                case 2:
                    color = Color.blue;
                    break;
            }
            Debug.DrawRay(Vector3.zero, (Vector3)list[i], color);
        }
    }
}
Answer 1

Помогли решить вопрос на gamedev.se. https://gamedev.stackexchange.com/questions/155322/unity3d-rotate-vector-by-n-degrees/155341#155341

Умножение кватернионов следует изменить следующим образом:

Quaternion localSpace = Quaternion.LookRotation(center);
Vector3 back = localSpace * Quaternion.Euler(-30, 0, 0) * Vector3.forward;
Vector3 front = localSpace * Quaternion.Euler(30, 0, 0) * Vector3.forward;
Vector3 right = localSpace * Quaternion.Euler(0, -30, 0) * Vector3.forward;
Vector3 left = localSpace * Quaternion.Euler(0, 30, 0) * Vector3.forward;
READ ALSO
Как работать с таблицей в MSWord из C#?

Как работать с таблицей в MSWord из C#?

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

196
Как избавится от утечки памяти с#

Как избавится от утечки памяти с#

Это меню для игрыСама игра работает нормально

259
Помогите с запросом SQL

Помогите с запросом SQL

Есть TextBox в который вводятся буквы и по этим буквам база выдает мне результат поискаВот код:

207
Resharper в проекте asp.net core 2 добавляет View в папку Pages

Resharper в проекте asp.net core 2 добавляет View в папку Pages

Внимание! Это перевод вопроса ASPNET Core 2 - ReSharper “Create Razor View” adds new view to Pages folder

291