Unity как найти угол между векторами

It’s easy if you just use addition and subtraction. Look at this:

/Degrees
  float signedAngleBetween (Vector3 a, Vector3 b, bool clockwise) {
  float angle = Vector3.angle(a, b);

  //clockwise
  if( Mathf.Sign(angle) == -1 && clockwise )
    angle = 360 + angle;

  //counter clockwise
  else if( Mathf.Sign(angle) == 1 && !clockwise)
    angle = - angle;
  return angle;
}

Here’s what i mean:
if we are clockwise and the angle is negative, e.g. -170
to make it 180, you use this equation. «180-|angle|+180»
you already know that the angle is negative, so, use «180-(-angle)+180» and add the 180’s «360 + angle».
Then if it’s clockwise, CONTINUE but if it’s counter clockwise, make the angle negative, this is because the other part of the 360 angle (which is the compliment of 360 + angle) is «360 — (360 + angle)» or
«360 — 360 — angle» OR «(360 — 360) — angle» and, again, OR «- angle». So there we go… your finished angle.

Я хочу узнать как вычислить угол между 2мя точками мыши:
mousePos.x, mousePos.y
Хотелось бы как узнать как это реализовать в 2 вариантах, полный угол 360 градусов и 180 градусов, в зависимости от того, в какую сторону повёрнут персонаж.
Прикрепляю наскальную живопись для лучшего понимания и код.введите сюда описание изображения

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Crosshair : MonoBehaviour {
public GameObject CrossHair;
public float Dir = 5f;

void Update () 
{
MoveCrossHair();
}

void MoveCrossHair(){
Vector3 point = new Vector3();
var mousePos = Input.mousePosition;
point = Camera.main.ScreenToWorldPoint(new Vector3(mousePos.x,  mousePos.y, Dir));
if (point.magnitude > 0.0f)
{
    CrossHair.transform.position = point;
}
}
}

задан 17 дек 2018 в 10:13

Александр's user avatar

АлександрАлександр

1611 серебряный знак10 бронзовых знаков

7

Угол направления от персонажа на мышь (т.е. угол между направлением оси OX и вектором person->mouse) в градусах можно найти так:

 float angle = Mathf.Atan2(mousePos.y - person.y, mousePos.x - person.x) * Mathf.Rad2Deg;

Для отображения диапазона 360 градусов потребуется исправлять отрицательные углы, добавляя +360 (если в юнити эта функция, как в большинстве языков, возвращает диапазон -Pi..Pi)

ответ дан 17 дек 2018 в 10:41

MBo's user avatar

MBoMBo

47.9k1 золотой знак17 серебряных знаков40 бронзовых знаков

Отражение

Функция отражения векторов в Unity (C#):

Vector3.Reflect(Vector3 inDirection, Vector3 inNormal)    //Отражение

Данная функция возвращает вектор, значение компонентов которого равны отражению вектора inDirection в плоскости с нормалью inNormal.

Пример:

using UnityEngine;
using System.Collections;

public class VectorReflect : MonoBehaviour {
	
	//Объеткт-"отражение"
	public Transform reflectObject;
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update ()
	{
		reflectObject.position = Vector3.Reflect(transform.position, Vector3.forward);
	}
}

В данном случае reflectObject будет «отражением» объекта, на котором висит скрипт. «Зеркалом» будет плоскость OXY (т. к. ось Z является нормалью данной плоскости).

Расстояние

Для нахождения расстояния между двумя точками в Unity есть функция:

Vector[X].Distance(Vector[X] a, Vector[X] b);

Использовать можно, например, для проверки возможности атаки.

Проекция

Функция проекции в Unity (C#):

Vector[X].Project(Vector[X] a, Vector[X] b);    //Проекция

Возвращает проекцию вектора a на вектор b.
Для чего может пригодиться?
Пример:
Летит самолёт скинуть груз на остров, мы знаем скорость самолёта, его координаты, знаем координаты острова. Нам нужно рассчитать время, через которое самолёт долетит.
Формула расчёта: время = расстояние/скорость. Скорость мы знаем, расстояние можем найти функцией Vector3.Distance, но… Самолёт выше острова и ему не требуется приземляться, чтобы скинут груз, поэтому рассчитанное время будет больше, чем на самом деле, т. к. будет учитываться высота. Для избежания этой проблемы можно использовать проекцию, в этом случае разницы в высоте не будет, и можно спокойно измерить расстояние, которое самолёт пролетит.

Угол

Функция для получения угла между векторами в Unity (C#):

Vector[X].Angle(Vector[X] a, Vector[X] b);    //Угол

Можно использовать для проверки, находится ли объект в поле видимости:

using UnityEngine;
using System.Collections;

public class VectorAngle : MonoBehaviour {
	
	//Угол обзора
	public float angle = 60;
	//Цель
	public Transform target;
	
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update ()
	{
		//Измеряем и сверяем угол между векторами
		if(Vector3.Angle(transform.forward, target.position - transform.position) <= angle)
		{
			Debug.Log("Visible!");
		}
	}
}

Конец.

Параметры

from Вектор, по которому измеряется угловая разность.
to Вектор, по которому измеряется угловая разность.

Возвращает

float Угол без знака в градусах между двумя векторами.

Описание

Получает беззнаковый угол в градусах между from и to.

Возвращенный угол представляет собой беззнаковый угол между двумя векторами.
Примечание. Возвращаемый угол всегда будет находиться в диапазоне от 0 до 180 градусов, поскольку метод возвращает наименьший угол между векторами. То есть он никогда не вернет угол рефлекса. Углы рассчитываются от точки начала координат (0,0,0) в качестве вершины.
Смотрите также: функция SignedAngle.


using UnityEngine;

public class Vector : MonoBehaviour
{
//Use these to get the GameObject's positions
Vector2 m_MyFirstVector;
Vector2 m_MySecondVector;

float m_Angle;

//Вы должны назначить этим двум GameObjects в Инспекторе
public GameObject m_MyObject;
public GameObject m_MyOtherObject;

void Start()
{
//Инициализировать вектор
m_MyFirstVector = Vector2.zero;
m_MySecondVector = Vector2.zero;
m_Angle = 0.0f;
}

void Update()
{
// Получить позицию первого GameObject
m_MyFirstVector = new Vector2(m_MyObject.transform.position.x, m_MyObject.transform.position.y);
// Получить позицию второго GameObject
m_MySecondVector = new Vector2(m_MyOtherObject.transform.position.x, m_MyOtherObject.transform.position.y);
// Найти угол для двух векторов
m_Angle = Vector2.Angle(m_MyFirstVector, m_MySecondVector);

// Рисуем линии от исходной точки до векторов
Debug.DrawLine(Vector2.zero, m_MyFirstVector, Color.magenta);
Debug.DrawLine(Vector2.zero, m_MySecondVector, Color.blue);

// Значения векторов и углов в консоли
Debug.Log("MyFirstVector: " + m_MyFirstVector);
Debug.Log("MySecondVector: " + m_MySecondVector);
Debug.Log("Angle Between Objects: " + m_Angle);
}

void OnGUI()
{
// Вывести угол, найденный выше
GUI.Label(new Rect(25, 25, 200, 40), "Angle Between Objects" + m_Angle);
}
}

Как найти угол между двумя векторами ?

Как найти угол между двумя векторами ?

Здравствуйте. Помогите найти угол между векторами, если один известный, а другой переменный.
Изображение
Открыл учебник по геометрии. Сделал всё по формулам, но выходит какие-то неправильные цифры.

Используется csharp

                VectorA.x = 0;
                VectorA.y = 10;
                VectorB.x = CoordinateTap.x Scale/2 ;
                VectorB.y = CoordinateTap.y Scale/2 ;

                Scalar = VectorA.x * VectorB.x + VectorA.y * VectorB.y;

                VectorAL = Mathf.Sqrt ((VectorA.x * VectorA.x) + (VectorA.y * VectorA.y));
                VectorBL = Mathf.Sqrt ((VectorB.x * VectorB.x) + (VectorB.y * VectorB.y));
                Cos = Scalar / (VectorAL * VectorBL);
                Angle = Mathf.Acos (Cos) * 180 / Mathf.PI ;

Мучаюсь уже неделю. Подскажите, можно ли сделать это проще ? Заранее спасибо

Аватара пользователя
Dymanski200
UNIт
 
Сообщения: 147
Зарегистрирован: 28 ноя 2014, 19:19
Skype: dim4ik3908

Re: Как найти угол между двумя векторами ?

Сообщение Tolking 24 мар 2017, 18:26

float angle= Vector3.Angle(new Vector3(VectorA.x,VectorA.y,0),new Vector3(VectorB.x,VectorB.y,0));

Ковчег построил любитель, профессионалы построили Титаник.

Аватара пользователя
Tolking
Адепт
 
Сообщения: 2694
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как найти угол между двумя векторами ?

Сообщение Dymanski200 24 мар 2017, 19:35

Спасибо. А почему если я ставлю палец в точку A (как на рисунке), то градусная мера 20, хотя должно быть 0 ?
В моём коде была точно такая же ошибка, хотя всё работало. Подскажите как исправить ? Мне нужно чтобы отсчёт начинался с точки A

Аватара пользователя
Dymanski200
UNIт
 
Сообщения: 147
Зарегистрирован: 28 ноя 2014, 19:19
Skype: dim4ik3908

Re: Как найти угол между двумя векторами ?

Сообщение Yaro 25 мар 2017, 21:17

у меня почему-то Vector2.Angle и Vector3.Angle в не зависимости от векторов почему-то всегда показывает 90, косяк какой-то

можно через арктангенс

Используется csharp

float BA_Rad = Mathf.Atan2 (A.y B.y, A.x B.x);
float BC_Rad = Mathf.Atan2 (C.y B.y, C.x B.x);
float CA_Ang = (BA_Rad BC_Rad ) / Math.PI * 180.0f;

Что значит отсчета от A? ABC это угол, он не имеет точку отсчета

Yaro
UNIт
 
Сообщения: 86
Зарегистрирован: 20 сен 2016, 21:44

Re: Как найти угол между двумя векторами ?

Сообщение NOVA 26 мар 2017, 08:33

Tolking писал(а):float angle= Vector3.Angle(new Vector3(VectorA.x,VectorA.y,0),new Vector3(VectorB.x,VectorB.y,0));

Помоему это что-то странное.
VectorOne=A-B; если A и B это вектора координат.
VectorTwo=C-B;
float angle= Vector3.Angle(VectorOne,VectorTwo)

Аватара пользователя
NOVA
Адепт
 
Сообщения: 1716
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 27



Понравилась статья? Поделить с друзьями:
  • Как составить алгоритм для исполнителя робот
  • Url фейсбук как найти свой
  • Как найти основание равнобедренной трапеции 8 класс
  • Как найти дешевый отель в адлере
  • Как найти массу кристаллогидрата в растворе