Это именно то, что я хочу: 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 были вверху. угол - поле зрения. аспект - это соотношение сторон окна.
Я некоторое время работал в красках. Я опубликую, что я сделал в краске:
point_direction(...)
, является ли ваш выбор аргументов дляpoint_direction()
правильно, почему вы используетеdcos
при вычислении тангажа, но не рысканья, что делаетdcos
и почему ваш аргумент использует одиннадцать аргументов плюс два вызова окна плюс сложный глобальная переменная. Этот код бесполезен; удовлетворит ли вас простая математическая формула? - person Beta   schedule 05.01.2016