はい、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 ですが、ベクトルの x、y、z を表す 3 つが追加されています。
これは、多くの人が本当に理解できるコーディング言語ではないことはわかっています。おそらく、C、Java、Lua、Python などに慣れているでしょう。これは同じではありません。構文は大きく異なります。3D の mouse_x と mouse_y は、ゲーム ウィンドウでのマウスの x と y を表します。
とにかく、私は長い間それを理解しようとしてきました。このスクリプトを最後から逆にして、x と y の 2 つのインデックスの配列を返すのを手伝ってくれる人はいますか? おそらくそれほど簡単には機能しませんが、3D ポイントをカメラを含む 2D ポイントに変換しようとしています。
元のスクリプトの引数のリストは次のとおりです。
(xfrom、yfrom、zfrom、xto、yto、zto、xup、yup、zup、角度、アスペクト)
xfrom、yfrom、zfrom は、カメラの x、y、z を表します。xto、yto、zto は、カメラが見ている座標を表します。xup、yup、zup は、カメラが「上」と認識するベクトルです。私の場合、0,0,1 は、正の z 値を上向き、負の z 値を下向きとして表すために使用されます。angle は、カメラの水平視野です。アスペクトは、ウィンドウの幅をウィンドウの高さで割ったものです。