将3D矢量转换为2个角度

时间:2016-01-05 05:02:45

标签: vector 3d gml

这就是我想要的:3D Vector defined by 2 angles 除了反向。

我想从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返回2个坐标(x1,y1,x2,y2)之间的方向 -sqrt返回值的平方根 - 这是一个使用11个参数的脚本。根据顺序,参数是:

  

xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup,angle,aspect

值是摄像机坐标。值是摄像机所在的坐标。 up值表示" up"的3D矢量。在3D空间。在我的例子中,我使用0,0,1,因此正z值上升。角度是视野。 aspect是窗口的Aspect Ratio。

我在油漆工作了一段时间。我将发布我在油漆中所做的事情: 2 perfect angle spheres and a sphere of the other 2 combined

1 个答案:

答案 0 :(得分:2)

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

这是使用一种惯例来定义x,y,z,俯仰和偏航,并且确定它将3个坐标变成两个角度。如果它不适合你 - 它可能不会 - 那么你必须付出更多的努力来理解所涉及的数学并定义你想要做的事情。

修改 要使用您引用的其他问题的惯例,

alpha = atan(z/x)
beta = atan(y/z)