Как вычислить 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 шт):
Основное тригонометрическое тождество
x^2 + z^2 = 1
x = Sqrt(1 - z^2)
Получить значение можно только с точностью до знака, поэтому знак нужно корректировать, если известно близкое (прошлое) значение, но и это чревато...
Проще, если угол известен (не знаю, от чего он отсчитывается в вашей системе) - тогда это просто Cos(Fi) и Sin(Fi)