Преобразование 3D-вектора в 2 угла

Это именно то, что я хочу: 3D-вектор, определяемый двумя углами, кроме обратного .

Я хочу перейти от 6 точек (3D-вектор) к 2 углам (рысканье и тангаж. Ролл не нужен).

Кто-нибудь может помочь? Я не использую язык программирования, который кто-либо знает. Это GML в GameMaker: Studio (yoyogames.com). У меня есть скрипт, который преобразует координаты мыши в 3D-вектор из положения камеры, и чтобы преобразовать его в направления, я начал его разрабатывать.

У меня есть идеальный код для рыскания, но я не могу понять, как найти шаг. Это код, если вы можете его понять:

{
var mm,dX,dY,dZ,uX,uY,uZ,vX,vY,vZ,mX,mY,mZ, width, height, tFOV;
dX = argument3-argument0;
dY = argument4-argument1;
dZ = argument5-argument2;
mm = sqrt(dX*dX+dY*dY+dZ*dZ);
dX /= mm;
dY /= mm;
dZ /= mm;
uX = argument6;
uY = argument7;
uZ = argument8;
mm = uX*dX+uY*dY+uZ*dZ;
uX -= mm*dX;
uY -= mm*dY;
uZ -= mm*dZ
mm = sqrt(uX*uX+uY*uY+uZ*uZ);
uX /= mm;
uY /= mm;
uZ /= mm;
// v = u x d
vX = uY*dZ-dY*uZ;
vY = uZ*dX-dZ*uX;
vZ = uX*dY-dX*uY;
tFOV = tan(argument9*pi/360);
uX *= tFOV;
uY *= tFOV;
uZ *= tFOV;
vX *= tFOV*argument10;
vY *= tFOV*argument10;
vZ *= tFOV*argument10;
width = window_get_width();
height = window_get_height();
mX = dX+uX*(1-2*mouse_y/height)+vX*(2*mouse_x/width-1);
mY = dY+uY*(1-2*mouse_y/height)+vY*(2*mouse_x/width-1);
mZ = dZ+uZ*(1-2*mouse_y/height)+vZ*(2*mouse_x/width-1);
mm = sqrt(mX*mX+mY*mY+mZ*mZ);
global.mouse_dx = mX/mm;
global.mouse_dy = mY/mm;
global.mouse_dz = mZ/mm;
global.mouse_yaw = point_direction(0,0,global.mouse_dx,global.mouse_dy);
global.mouse_pitch = point_direction(0,0,dcos(global.mouse_dy),global.mouse_dz);
}

Единственное, что неправильно в этом, это

global.mouse_pitch = point_direction(0,0,dcos(global.mouse_dy),global.mouse_dz);

неправильно.

Некоторая предыстория GML: -dcos используется вместо cos, потому что dcos использует градусы, а cos использует радианы. -point_direction возвращает направление между двумя координатами (x1,y1,x2,y2) -sqrt возвращает квадратный корень значения -Это скрипт, использующий 11 аргументов. Аргументы по порядку:

xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, zup, угол, аспект

from values ​​— координаты камеры. to values ​​— это координаты места, куда смотрит камера. значения up представляют трехмерный вектор «вверх» в трехмерном пространстве. В моем случае я использую 0,0,1, чтобы положительные значения z были вверху. угол - поле зрения. аспект - это соотношение сторон окна.

Я некоторое время работал в красках. Я опубликую, что я сделал в краске: 2 сферы с идеальным углом и сфера из двух других вместе взятых


person Anixias    schedule 05.01.2016    source источник
comment
Совершенно неясно, что делает этот код, для чего он предназначен, совпадают ли эти два кода, какие переменные представляют декартовы координаты вектора, что должен вычислять point_direction(...), является ли ваш выбор аргументов для point_direction() правильно, почему вы используете dcos при вычислении тангажа, но не рысканья, что делает dcos и почему ваш аргумент использует одиннадцать аргументов плюс два вызова окна плюс сложный глобальная переменная. Этот код бесполезен; удовлетворит ли вас простая математическая формула?   -  person Beta    schedule 05.01.2016
comment
Все, что я ищу, это преобразование 3D-вектора в 2 угла, шаг и рыскание.   -  person Anixias    schedule 05.01.2016
comment
Трехмерный вектор не может быть описан двумя скалярными значениями. Единичный вектор может быть (с r:=1). В любом случае вы, вероятно, захотите начать с уравнений декартово-сферическое, не какой-то случайный код, который вы взяли из Интернета.   -  person MooseBoys    schedule 05.01.2016
comment
Кажется, я единственный, кто понимает, чего я пытаюсь достичь. Забудь мой сценарий. Как преобразовать трехмерный вектор, определенный 6 (или 3) точками, в 2 угла (технически 3, но мне не нужен крен, только рыскание и тангаж)? Что делает мой код, так это создает трехмерный вектор, например, от (0,0,0) до (1,0,0,4) на основе координат мыши. У меня есть математика, чтобы преобразовать это в 2 угла, хотя 1 из этих углов неверен. Рыскание (угол в плоскости xy) – это направление от 0,0 до 1,0. Поле, где я застрял. Прочтите ссылку вверху. Я пытаюсь сделать это в обратном порядке, начиная с конца.   -  person Anixias    schedule 05.01.2016


Ответы (1)


yaw = atan(y/x)
pitch = atan(z/sqrt(x^2+y^2))

То есть используется одно соглашение для определения x, y, z, шага и рыскания, и, конечно же, оно превращает 3 координаты в два угла. Если это не сработает для вас — а, вероятно, не сработает, — тогда вам придется приложить больше усилий, чтобы понять задействованную математику и определить, что вы пытаетесь сделать.

EDIT: Чтобы использовать соглашение другого вопроса, который вы цитируете,

alpha = atan(z/x)
beta = atan(y/z)
person Beta    schedule 05.01.2016