2017-06-04 17 views
0

私はゲームのモッズをやっています。私は三角法ではあまりよくありません。これらの数学トリグ(3Dゲームの世界)操作を「逆転」する

私は3Dワールドの中で、いくつかの角度(z角度)を持ったある位置に車両を持っています。私はまた、そのすぐ隣にオブジェクトがあり、XYZの位置と回転を持っています。オブジェクトを車両に取り付けたいが、それを取り付けるには、実世界の位置ではなく、車両に対するオフセットを指定する必要がある。 これは「車両協調システム」です。 vehicle attachment coords

これは問題ではありません。私はすでにそれをしない、このコードがあります。

new Float:ofx, Float:ofy, Float:ofz, Float:ofangle; 
new Float:attachX, Float:attachY; 
new Float:vehX, Float:vehY, Float:vehZ, Float:vehAngle; 

GetVehiclePos(vehicleid, vehX, vehY, vehZ); // get vehicle XYZ pos 
GetVehicleZAngle(vid, vehAngle); // get vehicle facing angle 
ofx = x-vehX; // x = object's real world XYZ, vehX - vehicle's XYZ. Calculate   real world offset between object and vehicle 
ofy = y-vehY; 
ofz = z-vehZ; 
ofangle = rz-vehAngle; 
// calculate attach offsets relative to vehicle (see image above) 
attachX = ofx*floatcos(vehAngle, degrees) + ofy*floatsin(vehAngle, degrees); 
attachY = -ofx*floatsin(vehAngle, degrees)+ ofy*floatcos(vehAngle, degrees); 

AttachObjectToVehicle(objectid, vehicleid, attachX, attachY, ofz, rx, ry, ofangle); // attach object with calculated X, Y and angle 

を、これは素晴らしい作品が、私は今、やりたい、これを「逆」することです。 私はだから私はこれを持って (それが今とまったく同じ場所にあってもよいが、付属しません)オブジェクトの現実世界の位置を計算したい:

new Float:vehX, Float:vehY, Float:vehZ, Float:vehAngle; 
GetVehiclePos(vehicleid, vehX, vehY, vehZ); 
GetVehicleAngle(vehicleid, vehAngle); 

new Float:objAttachX, Float:objAttachY, Float:objAttachZ, Float:objAttachRotX, Float:objAttachRotY, Float:ObjAttachRotZ); 
GetAttachedObjectOffsets(objectid, objAttachX, objAttachY, objAttachZ); 
GetAttachedObjectRotation(objectid, objAttachRotX, objAttachRotY, objAttachRotZ); 
// now, using current vehicle position and the object's attachment offsets, somehow calculate the objects position in real world. 

誰かが私を助けることができれば、私は喜んでいるだろうこれは本当にシンプルですが、私はそれを理解することはできません。

答えて

0

三角法については忘れてください。 X = x * c + y * s Y = -x * s + y * c に相当する2つの未知数(および2つのパラメータ、cとs)を持つ2つの線形方程式のシステムを解くだけです。 (それぞれsとcを掛ける): s X = scx + s^2 y c Y = -scx + c^2 y。 追加: s X + c Y = s^2 y + c^2 y = y [cos^2 + sin^2 = 1] 同様にxの場合: c X = c^2 x + scy s Y = -s^2 x + scy、 収穫: c X-s Y = c^2 x + s^2 x = x

0

ビークル変換行列を使用すると、 )それはスケール、世界座標と回転を持つようになります。

// example of identity matrix 
mat = [[1,0,0,0], 
     [0,1,0,0], 
     [0,0,1,0], 
     [0,0,0,1]] 

例えばマット私はマトリクスアレイ項目 の名前を変更します理解し、次のを容易にするために、[0,0] XAXとマットになり、[0,1] Xayの

// not code just a representation of named array items 
[ [ xAx,xAy,xAz,0 ] // xA is the x axis x,y,z as scaled vector 
    [ yAx,yAy,yAz,0 ] // yA is the y axis x,y,z as scaled vector 
    [ zAx,zAy,zAz,0 ] // yA is the z axis x,y,z as scaled vector 
    [ ox ,oy , oz,1 ] ] // o is the coordinate of the local origin. 

はtrueこのホールドですすべての4×4行列(最終ビューの投影は別として)

したがって、添付オブジェクトpos x、y、z位置があります。行列がある場合は、位置vecにオブジェクトの行列pos *を掛けて位置を取得します。

localPos = {x : ?, y : ? , z : ?}; // The position of the mounted object 
worldPos = {x : ?, y : ? , z : ?}; // the new calculated position we are after 
// lp for localPos to save typing 
// wp for worldPos 
// Using the matrix named variables 

wp.x = lp.x * xAx + lp.y * yAx + lp.z * zAx + ox; 
wp.y = lp.x * xAy + lp.y * yAy + lp.z * zAy + oy; 
wp.z = lp.x * xAz + lp.y * yAz + lp.z * zAz + oz; 

あなたは世界座標を持っています。

vec3を[0,0,0]、マットを4×4のフラットアレイ[0,0,0 ...、0]として16個の長さのマトリックス配列を使用して行います。

wp[0] = lp[0] * mat[0] + lp[1] * mat[4] + lp[2] * mat[8] + mat[12]; 
wp[1] = lp[0] * mat[1] + lp[1] * mat[5] + lp[2] * mat[9] + mat[13]; 
wp[2] = lp[0] * mat[2] + lp[1] * mat[6] + lp[2] * mat[10] + mat[14]; 

それとも、ベクトルと行列の乗算をオーバーロードしている場合は、そのは

Vector localPos = ? // get the object position in vehicle local space 
Matrix mat = ? // get the local vehicle transform 

Vector worldPos = localPos * mat; 
のと同じくらい簡単です
関連する問題