Как вычислить Z-координату луча при горизонтальном повороте в 3D сцене THREE.js?

Вопрос скорее всего нубский, да и поставлен, вероятно, неправильно. Если есть возможность помочь в более точном формулировании - помогите, я исправлю вопрос.

Есть 3D-тур по квартирам, в нем есть точки(панорамы), на которые нужно перейти и прокрутиться по горизонтали на 360 градусов с определенным шагом, на каждом шагу замеряя расстояние до ближайшего объекта, чтобы определять где находятся стены, а где - вид на комнату.

В моем понимании, за прокрутку по горизонтали отвечает x координата, но когда я получаю луч из положения курсора, при прокрутке по горизонтали, меняется так же и z координата, причем обе (x и z) меняются нелинейно по отношению друг к другу.

Например, я получаю луч из курсора и выходит вектор x:0, z:-1 (y не указываю, он всегда 0), сдвигаю курсор немного вправо и получаю направление x:0.2, z:-0.98, затем сдвигаю ещё немного вправо и получаю x:0.5, z:-0.86. Подскажите, пожалуйста, формулу или алгоритм, по которому я смогу вычислить z, зная x или наоборот. В геометрии я довольно слаб, поэтому даже не знаю в какую сторону смотреть, подскажите хотя бы направление где искать.

Вот материалы для воспроизведения:

Ссылка на 3D-тур - https://listing3d.com/embed/r5f33XWFLPyyJjj6r8P3rkQ

Вот так можно получить луч по положению курсора - window.player.Application.Api.Tags.getCursorRay()

Вот так можно получить координаты активной точки - window.player.Application.Api.props.GCV.Panoramas.active.position

Вот так можно получить коллизию - window.player.Application.Api.Tags.props.GCV.HighPolyCollisionTree.trace(position: Vector3, direction: Vector3)

Тур использует библиотеку THREE.js и, возможно, что-то ещё, доступа к исходникам у меня нет.


Ответы (1 шт):

Автор решения: MBo

Основное тригонометрическое тождество

x^2 + z^2 = 1
x = Sqrt(1 - z^2)

Получить значение можно только с точностью до знака, поэтому знак нужно корректировать, если известно близкое (прошлое) значение, но и это чревато...

Проще, если угол известен (не знаю, от чего он отсчитывается в вашей системе) - тогда это просто Cos(Fi) и Sin(Fi)

→ Ссылка