【发布时间】:2016-01-05 05:02:45
【问题描述】:
这正是我想要的: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、角度、方面
from 值是相机坐标。 to values 是相机正在寻找的坐标。 up 值表示 3D 空间中“up”的 3D 矢量。在我的例子中,我使用 0,0,1,因此正 z 值向上。角度是视野。 aspect 是窗口的纵横比。
【问题讨论】:
-
完全不清楚这段代码做什么,你打算做什么,这两个是否相同,哪些变量代表向量的笛卡尔坐标,
point_direction(...)应该是什么计算一下,您为point_direction()选择的参数是否正确,为什么在计算俯仰而不是偏航时使用dcos,dcos做了什么,以及为什么您的参数使用11 个参数加上对窗口的 两次 调用以及一个复杂的全局变量。此代码没有帮助;一个简单的数学公式会让你满意吗? -
我正在寻找的只是将 3D 矢量转换为 2 个角度,俯仰和偏航。
-
一个 3D 矢量不能用两个标量值来描述。 unit 向量可以是(使用 r:=1)。在任何情况下,您可能都希望从 cartesian-to-spherical 方程开始,而不是从网络上提取的一些随机代码。
-
我似乎是唯一一个了解我想要完成的事情的人。忘记我的剧本。如何将由 6 个(或 3 个)点定义的 3D 矢量转换为 2 个角度(技术上是 3 个,但我不需要滚动,只需要偏航和俯仰)?我的代码所做的是根据鼠标坐标制作一个 3D 矢量,例如 (0,0,0) 到 (1,0,0.4)。我有数学将其转换为 2 个角度,尽管其中 1 个角度是错误的。偏航(xy 平面上的角度)是从 0,0 到 1,0 的方向。球场是我卡住的地方。阅读顶部的链接。我正在尝试反向,就像从头开始一样。