Версия гайда: 1.2 (31.10.23)
Вектор взгляда может пригодиться, если вы хотите запускать снаряд в направлении взгляда игрока и спавнить снаряд перед лицом игрока, чтобы снаряд не столкнулся с игроком который его запустил. Также необходим для рейкаста (перемещения по лучу взгляда в основном для проверки пересечения/близости луча взгляда и сущности/блока).
Для понимания потребуются некоторые знания из тригонометрии, поэтому в первой части я расскажу про тригонометрическую окружность, синус и косинус. Если уверен в своих знаниях - пропускай её.
Часть I. Начала тригонометрии.
Тригонометрическая окружность - это единичная окружность (окружность с радиусом 1) с центром в начале координат.
![1.png 1.png](https://ruforum.mineland.net/data/attachments/4/4098-7482b4dd7ad3b78aa59c8133d2f6d79b.jpg)
Какой угол (по величине) показан на правой окружности?
Возьмём единичную окружность, отметим на ней случайную точку P.
Проведём отрезок PA параллельно оси X, точка A лежит на оси Y.
Проведём отрезок PB параллельно оси Y, точка B лежит на оси X.
![2.jpg 2.jpg](https://ruforum.mineland.net/data/attachments/4/4099-c9b054ade8cfe3b91e5b41c8806b5971.jpg)
Синус - координата точки A на оси Y.
Косинус - координата точки B на оси X.
Т.е синус и косинус - это просто координаты любой точки, лежащей на единичной окружности.
Синус - координата на вертикальной оси, косинус - на горизонтальной оси (если оси расположены так как на рисунке).
Но что если радиус окружности не равен 1?
С изменением радиуса окружности пропорциоонально изменяются и координаты точки.
Чему равен косинус этого угла?
![3.jpg 3.jpg](https://ruforum.mineland.net/data/attachments/4/4100-5fda4367bb641b58756934577a37f99f.jpg)
Часть II. Что такое вектор взгляда?
Вектор - это отрезок, имеющий направление, т.е начало и конец.
![4.png 4.png](https://ruforum.mineland.net/data/attachments/4/4101-a350a54037a6e794e47992d641de74c9.jpg)
Единичный вектор - это вектор, длина которого равна 1.
Координатами вектора являются значения, сместившись на которые из начальной точки вектора (т.е прибавив их к координатам точки начала), мы окажемся в конечной точке вектора. Если начало вектора находится в начале координат, координаты вектора и координаты его конечной точки совпадают. Если начало не находится в начале координат, то чтобы найти координаты вектора нужно от координат конечной точки отнять координаты начальной.
Пример 1: есть вектор AB: A(0; 0), B(1; 3). Тогда AB{1-0; 3-0} = AB{1; 3}.
Пример 2: есть вектор CD: C(1; 1), D(-2; 3). Тогда CD{-2-1; 3-1} = CD{-3; 2}.
Вектор взгляда - это единичный вектор в трёхмерном пространстве, имеющий координаты, сместившись на которые точка будет находиться на луче взгляда.
Другими словами,
Вектор взгляда - это координаты для осей XYZ, на которые нужно сместиться, чтобы пройти единицу расстояния в направлении взгляда.
![5.jpg 5.jpg](https://ruforum.mineland.net/data/attachments/4/4102-a4fb77e05c3be37bf14844b6289975d5.jpg)
Часть III. Как получить вектор взгляда?
Получить вектор взгляда - значит найти координаты на которые нужно сместиться по осям XYZ, чтобы пройти единицу расстояния в направлении взгляда.
Для начала получим YAW и PITCH, вытащив значения из "Игровое значение" -> "Текущее направление взгляда".
![6.png 6.png](https://ruforum.mineland.net/data/attachments/4/4103-5fa184c2a3e0a0ebd7f7e4d79a0cd06c.jpg)
PITCH и YAW измеряются в градусах.
PITCH - это поворот вниз-вверх
- Отсчёт: -Y (90°) +Y (-90°) (-90° .. 90°).
YAW - это поворот влево-вправо
- Отсчёт: +Z (0°/360°) -X (90°) -Z (180°) +X (270°) (0° .. 360°).
Так как длина вектора взгляда равна 1 (не меняется), набор всех возможных точек (концов векторов) образуют сферу (т.к сфера это по определению набор равноудалённых точек в трёхмерном пространстве).
На этой сфере PITCH - широта, а YAW - долгота (если вам это как-то поможет).
![7.PNG 7.PNG](https://ruforum.mineland.net/data/attachments/4/4104-6862b76ac6ab93ff0bccd98cd5c741cd.jpg)
Рассмотрим PITCH (широту) на плоскости YA (см левую часть).
A - луч, который может лежать на оси X или Z, а может и не лежать, его местоположение зависит от YAW. Смотря на предыдущую картинку несложно представить, как эта полуокружность вращается вокруг оси Y с изменением YAW.
![8.jpg 8.jpg](https://ruforum.mineland.net/data/attachments/4/4105-5be4d08288bf73724e0249453c90a415.jpg)
Для удобства перевернём картинку (см. правую часть). На полуокружности возможных значений PITCH находится точка M - случайное значение PITCH. Найдём значение синуса. Как можно видеть, оно лежит на перевёрнутой оси Y. Поэтому, для нахождения координаты Y вектора, его нужно домножить на -1 (это понятно ещё отсюда: "-Y (90°) +Y (-90°)" - в майнкрафте "вверх" это под отрицательным углом)
Итак, координата Y вектора взгляда найдена: -sin(pitch)
Теперь найдём точку косинуса, а точку sin(M) обозначим буквой P.
Можно заметить что длина отрезка PM = cos(M) = cos(pitch).
![9.jpg 9.jpg](https://ruforum.mineland.net/data/attachments/4/4106-8292fc64c32a261366a2252f7ebde44f.jpg)
PM - это радиус окружности, которая получится на сечении сферы плоскостью XZ (горизонтальной плоскостью) в точке Y равной P. Сечение это то, что находится в секущей плоскости.
Фиолетовым выделена окружность, которая получится на сечении. Это окружность всех возможных значений YAW (долготы). Её центр - точка P, PM - радиус. Радиус PM (равный cos(pitch)) обозначим за R.
![10.PNG 10.PNG](https://ruforum.mineland.net/data/attachments/4/4107-142d4a165d5aa7d74f5eb25d164a2134.jpg)
Рассмотрим эту окружность:
![11.jpg 11.jpg](https://ruforum.mineland.net/data/attachments/4/4108-2bdcca6e489cc9e784d0f6c789b46a96.jpg)
Для удобства повернём на 90 градусов по ч.с. Отметим случайное значение YAW, например точку K. Найдём точки синуса и косинуса.
![12.jpg 12.jpg](https://ruforum.mineland.net/data/attachments/4/4109-a777d278649ad3ebfcd79217b890d1c7.jpg)
Ось X перевернута, значит синус нужно домножить на -1.
Получаем координаты X и Z нашего вектора взгляда:
X = -sin(yaw)
Z = cos(yaw)
Не забываем домножить на R, потому что окружность не единичная.
Получаем формулы для нахождения вектора взгляда:
X = -sin(yaw) * R = -sin(yaw) * cos(pitch)
Y = -sin(pitch)
Z = cos(yaw) * R = cos(yaw) * cos(pitch)
Вектор взгляда может пригодиться, если вы хотите запускать снаряд в направлении взгляда игрока и спавнить снаряд перед лицом игрока, чтобы снаряд не столкнулся с игроком который его запустил. Также необходим для рейкаста (перемещения по лучу взгляда в основном для проверки пересечения/близости луча взгляда и сущности/блока).
Для понимания потребуются некоторые знания из тригонометрии, поэтому в первой части я расскажу про тригонометрическую окружность, синус и косинус. Если уверен в своих знаниях - пропускай её.
Часть I. Начала тригонометрии.
Тригонометрическая окружность - это единичная окружность (окружность с радиусом 1) с центром в начале координат.
![1.png 1.png](https://ruforum.mineland.net/data/attachments/4/4098-7482b4dd7ad3b78aa59c8133d2f6d79b.jpg)
Какой угол (по величине) показан на правой окружности?
приблизительно -45°
Возьмём единичную окружность, отметим на ней случайную точку P.
Проведём отрезок PA параллельно оси X, точка A лежит на оси Y.
Проведём отрезок PB параллельно оси Y, точка B лежит на оси X.
![2.jpg 2.jpg](https://ruforum.mineland.net/data/attachments/4/4099-c9b054ade8cfe3b91e5b41c8806b5971.jpg)
Синус - координата точки A на оси Y.
Косинус - координата точки B на оси X.
Т.е синус и косинус - это просто координаты любой точки, лежащей на единичной окружности.
Синус - координата на вертикальной оси, косинус - на горизонтальной оси (если оси расположены так как на рисунке).
Но что если радиус окружности не равен 1?
С изменением радиуса окружности пропорциоонально изменяются и координаты точки.
- Чтобы найти координаты точки зная синус и косинус нужно умножить их на радиус.
- Чтобы найти синус и косинус точки зная координаты нужно разделить координаты на радиус.
Чему равен косинус этого угла?
![3.jpg 3.jpg](https://ruforum.mineland.net/data/attachments/4/4100-5fda4367bb641b58756934577a37f99f.jpg)
0.5 (1/R = 1/2 = 0.5)
Часть II. Что такое вектор взгляда?
Вектор - это отрезок, имеющий направление, т.е начало и конец.
![4.png 4.png](https://ruforum.mineland.net/data/attachments/4/4101-a350a54037a6e794e47992d641de74c9.jpg)
Единичный вектор - это вектор, длина которого равна 1.
Координатами вектора являются значения, сместившись на которые из начальной точки вектора (т.е прибавив их к координатам точки начала), мы окажемся в конечной точке вектора. Если начало вектора находится в начале координат, координаты вектора и координаты его конечной точки совпадают. Если начало не находится в начале координат, то чтобы найти координаты вектора нужно от координат конечной точки отнять координаты начальной.
Пример 1: есть вектор AB: A(0; 0), B(1; 3). Тогда AB{1-0; 3-0} = AB{1; 3}.
Пример 2: есть вектор CD: C(1; 1), D(-2; 3). Тогда CD{-2-1; 3-1} = CD{-3; 2}.
Вектор взгляда - это единичный вектор в трёхмерном пространстве, имеющий координаты, сместившись на которые точка будет находиться на луче взгляда.
Другими словами,
Вектор взгляда - это координаты для осей XYZ, на которые нужно сместиться, чтобы пройти единицу расстояния в направлении взгляда.
![5.jpg 5.jpg](https://ruforum.mineland.net/data/attachments/4/4102-a4fb77e05c3be37bf14844b6289975d5.jpg)
Часть III. Как получить вектор взгляда?
Получить вектор взгляда - значит найти координаты на которые нужно сместиться по осям XYZ, чтобы пройти единицу расстояния в направлении взгляда.
Для начала получим YAW и PITCH, вытащив значения из "Игровое значение" -> "Текущее направление взгляда".
![6.png 6.png](https://ruforum.mineland.net/data/attachments/4/4103-5fa184c2a3e0a0ebd7f7e4d79a0cd06c.jpg)
PITCH и YAW измеряются в градусах.
PITCH - это поворот вниз-вверх
- Отсчёт: -Y (90°) +Y (-90°) (-90° .. 90°).
YAW - это поворот влево-вправо
- Отсчёт: +Z (0°/360°) -X (90°) -Z (180°) +X (270°) (0° .. 360°).
Так как длина вектора взгляда равна 1 (не меняется), набор всех возможных точек (концов векторов) образуют сферу (т.к сфера это по определению набор равноудалённых точек в трёхмерном пространстве).
На этой сфере PITCH - широта, а YAW - долгота (если вам это как-то поможет).
![7.PNG 7.PNG](https://ruforum.mineland.net/data/attachments/4/4104-6862b76ac6ab93ff0bccd98cd5c741cd.jpg)
Рассмотрим PITCH (широту) на плоскости YA (см левую часть).
A - луч, который может лежать на оси X или Z, а может и не лежать, его местоположение зависит от YAW. Смотря на предыдущую картинку несложно представить, как эта полуокружность вращается вокруг оси Y с изменением YAW.
![8.jpg 8.jpg](https://ruforum.mineland.net/data/attachments/4/4105-5be4d08288bf73724e0249453c90a415.jpg)
Для удобства перевернём картинку (см. правую часть). На полуокружности возможных значений PITCH находится точка M - случайное значение PITCH. Найдём значение синуса. Как можно видеть, оно лежит на перевёрнутой оси Y. Поэтому, для нахождения координаты Y вектора, его нужно домножить на -1 (это понятно ещё отсюда: "-Y (90°) +Y (-90°)" - в майнкрафте "вверх" это под отрицательным углом)
Итак, координата Y вектора взгляда найдена: -sin(pitch)
Теперь найдём точку косинуса, а точку sin(M) обозначим буквой P.
Можно заметить что длина отрезка PM = cos(M) = cos(pitch).
![9.jpg 9.jpg](https://ruforum.mineland.net/data/attachments/4/4106-8292fc64c32a261366a2252f7ebde44f.jpg)
PM - это радиус окружности, которая получится на сечении сферы плоскостью XZ (горизонтальной плоскостью) в точке Y равной P. Сечение это то, что находится в секущей плоскости.
Фиолетовым выделена окружность, которая получится на сечении. Это окружность всех возможных значений YAW (долготы). Её центр - точка P, PM - радиус. Радиус PM (равный cos(pitch)) обозначим за R.
![10.PNG 10.PNG](https://ruforum.mineland.net/data/attachments/4/4107-142d4a165d5aa7d74f5eb25d164a2134.jpg)
Сообщение объединено:
Рассмотрим эту окружность:
![11.jpg 11.jpg](https://ruforum.mineland.net/data/attachments/4/4108-2bdcca6e489cc9e784d0f6c789b46a96.jpg)
Для удобства повернём на 90 градусов по ч.с. Отметим случайное значение YAW, например точку K. Найдём точки синуса и косинуса.
![12.jpg 12.jpg](https://ruforum.mineland.net/data/attachments/4/4109-a777d278649ad3ebfcd79217b890d1c7.jpg)
Ось X перевернута, значит синус нужно домножить на -1.
Получаем координаты X и Z нашего вектора взгляда:
X = -sin(yaw)
Z = cos(yaw)
Не забываем домножить на R, потому что окружность не единичная.
Получаем формулы для нахождения вектора взгляда:
X = -sin(yaw) * R = -sin(yaw) * cos(pitch)
Y = -sin(pitch)
Z = cos(yaw) * R = cos(yaw) * cos(pitch)
Последнее редактирование: