Vector 将三维矢量转换为2个角度

Vector 将三维矢量转换为2个角度,vector,3d,gml,Vector,3d,Gml,这正是我想要的: 除了反面 我想从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

这正是我想要的: 除了反面

我想从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使用弧度。 -点_方向返回两个坐标(x1、y1、x2、y2)之间的方向 -sqrt返回值的平方根 -这是一个使用11个参数的脚本。这些论点依次为:

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

from值是摄影机坐标。to值是摄影机正在查看的位置的坐标。向上值表示三维空间中“向上”的三维矢量。在我的例子中,我使用0,0,1,这样正的z值向上。角度是视野。aspect是窗口的纵横比

我在油漆厂工作过一段时间。我将发布我在绘画中所做的:

这就是使用一种约定来定义x、y、z、俯仰和偏航,并且可以肯定的是,它将3个坐标转换为两个角度。如果它对你不起作用——而且可能不会——那么你必须花更多的精力去理解所涉及的数学知识,并定义你要做的事情

编辑: 使用你提到的另一个问题的惯例

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

这段代码做什么,你打算做什么,这两个变量是否相同,哪些变量表示向量的笛卡尔坐标,
点方向(…)
应该计算什么,你选择的
点方向()
的参数是否正确,为什么在计算俯仰而不是偏航时使用
dcos
dcos
的功能,以及为什么您的参数使用11个参数加上两个对窗口的调用加上一个复杂的全局变量。这个代码没有帮助;一个简单的数学公式能让你满意吗?我要找的就是把一个3D向量转换成两个角度,俯仰和偏航。一个3D向量不能用两个标量值来描述。单位向量可以是(r:=1)。在任何情况下,你可能想从方程开始,而不是从网络上随机抽取的代码。我似乎是唯一一个理解我想要完成什么的人。忘了我的剧本吧。如何将由6个(或3个)点定义的3D向量转换为2个角度(技术上是3个,但我不需要滚动,只需要偏航和俯仰)?我的代码所做的是基于鼠标坐标生成一个3D向量,例如,(0,0,0)到(1,0,0.4)。我有数学把它转换成两个角度,尽管其中一个角度是错误的。偏航(xy平面上的角度)是从0,0到1,0的方向。球场就是我被卡住的地方。阅读顶部的链接。我试着反过来做,就像从结尾开始一样。
alpha = atan(z/x)
beta = atan(y/z)