Имеется некоторый единичный вектор, который представляет собой координату в сферическом пространстве. Необходимо получить из него 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);
}
}
}
Помогли решить вопрос на 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;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть шаблон документа, в котором есть таблица, но при необходимости требуется добавить новую строку в таблице, добавилНО как обозначить в таблице...
Есть TextBox в который вводятся буквы и по этим буквам база выдает мне результат поискаВот код:
Внимание! Это перевод вопроса ASPNET Core 2 - ReSharper “Create Razor View” adds new view to Pages folder