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
АлександрАлександр
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
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