我有一个剧本,是的,有11个论点。它将屏幕上的鼠标坐标转换为用于3D鼠标坐标的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;
}我要做的是逆转这个脚本,这样就有14个论点。与这个相同的11,但还有3表示向量的x,y,z。
我知道这不是一种编码语言,很多人都能真正理解。您可能已经习惯了C、Java、Lua、Python或类似的东西。这可不一样。语法有很大的不同。3D中的mouse_x和mouse_y表示游戏窗口中鼠标的x和y。
不管怎么说,我已经想了很久了。有人能帮我扭转这个脚本,从结尾开始,然后返回一个由两个索引组成的数组x和y吗?它可能不会那么容易工作,但我正在尝试将一个3D点转换为一个涉及相机的2D点。
下面列出了原始脚本的参数:
(xfrom,yfrom,zto,xto,yto,zto,xup,yup,zup,角度,方面)
x,y,z表示相机的x,y,z。xto、yto和zto表示相机正在寻找的坐标。xup、yup和zup是摄像机认为“向上”的矢量。在我的例子中,0,0,1用于将正z值表示为向上,负z值表示为向下。角度是摄像机的水平角。方面是窗口的宽度除以窗口的高度。
发布于 2016-03-09 22:44:00
奇怪的是,您正在使用的脚本的作者(在程序的官方论坛上使用用户名“you”)也编写了一个相反的脚本。事实上,它们通常都是一起分发的,我对您偶然发现一个示例/post/教程中只有一个这样的例子感到有点惊讶。
无论如何,有基于这些脚本的一个很受欢迎的例子,它将共享代码组合到第三个脚本中,然后提供两个修改变量的脚本。
或者,这里有一个我清理过的单一脚本版本。它返回点是否可见,因为点也可以在有效的XY,但在相机后面。
/// c3d(xfrom, yfrom, zfrom, xto, yto, zto, xup, yup, zup, fov, aspect, px, py, pz)
var xfrom, yfrom, zfrom, xto, yto, zto, ux, uy, uz, fov, aspect, px, py, pz;
xfrom = argument0; yfrom = argument1; zfrom = argument2;
xto = argument3; yto = argument4; zto = argument5;
ux = argument6; uy = argument7; uz = argument8;
fov = argument9; aspect = argument10;
px = argument11; py = argument12; pz = argument13;
// delta:
var dn, dx, dy, n;
dx = xto - xfrom;
dy = yto - yfrom;
dz = zto - zfrom;
n = sqrt(dx * dx + dy * dy + dz * dz);
dx /= n; dy /= n; dz /= n; // (normalization)
// up-vector:
n = ux * dx + uy * dy + uz * dz;
ux -= n * dx; uy -= n * dy; uz -= n * dz;
// up-vector normalization:
n = sqrt(ux * ux + uy * uy + uz * uz);
ux /= n; uy /= n; uz /= n;
// field-of-view:
var tfov; tfov = tan(fov * pi / 360);
ux *= tfov; uy *= tfov; uz *= tfov;
// vxyz = uxyz * dxyz:
var vx, vy, vz;
vx = uy * dz - dy * uz;
vy = uz * dx - dz * ux;
vz = ux * dy - dx * uy;
// aspect:
afov = aspect;
vx *= afov; vy *= afov; vz *= afov;
// target coordinates:
px -= xfrom; py -= yfrom; pz -= zfrom;
// compute screen Z to ensure that the point is visible
// (is in front rather than behind the camera):
n = (px * dx + py * dy + pz * dz);
if (n <= 0) {
global.c3d_x = 0;
global.c3d_y = -1;
return false;
}
// compute and store screen XY (0..1):
px /= n; py /= n; pz /= n;
n = (px * vx + py * vy + pz * vz) / sqr(aspect * tan(pi / 8));
global.c3d_x = (n + 1) / 2;
n = (px * ux + py * uy + pz * uz) / sqr(tan(pi / 8));
global.c3d_y = (1 - n) / 2;
//
return true;https://stackoverflow.com/questions/34700148
复制相似问题