2

この軌道が放物線を描くように、軌道の位置 X、Y、Z を計算できるようにする必要がある 3D チェス ゲームを開発しています (ピース アニメーションの場合)。

したがって、与えられた等距離点 p1=(x1,y1,z1)、p2=(x2,y2,z2) および p3(x3,y3,z3) に対して以下の式 (または一般式) が必要です。

x=f(y,z)=???  
y=f(x,z)=???   
z=f(x,y)=???
4

2 に答える 2

4

各コンポーネントについてx、によって定義される個別の放物線yを検討します。z

x(t) = x1 - t*(3*x1-4*x2+x3) + 2*t^2*(x1-2*x2+x3)     //t=0..1
y(t) = y1 - t*(3*y1-4*y2+y3) + 2*t^2*(y1-2*y2+y3)     //t=0..1
z(t) = z1 - t*(3*z1-4*z2+z3) + 2*t^2*(z1-2*z2+z3)     //t=0..1

その時、t=0そのx=x1t=0.5、そしてそのx=x2時。と についても同様です。t=1x=x2y(t)z(t)

于 2012-05-17T19:23:38.763 に答える
3

開始y値と終了y値が同じである場合、いくつかのステップで導出できるパラメトリック方程式を使用して放物線を記述することができます。

与えられたstartingHeightとapexHeight、

y(t) = A(t^2) + B(t) + C
y(0) = startingHeight
y(0.5) = apexHeight
y(1) = startingHeight

y(0) = startingHeight = A*0 + B*0 + C
C = startingHeight
y(t) = A(t^2) + B(t) + startingHeight

y(1) = startingHeight = A + B + startingHeight
0 = A+B
A = -B
y(t) = -B(t^2) + B(t) + startingHeight

y(0.5) = apexHeight = -B(0.25) + B(0.5) + startingHeight
apexHeight = B(0.5 - 0.25) + startingHeight
apexHeight - startingHeight = B(0.25)
B = (apexHeight - startingHeight)/4.0

A、B、およびCがわかったので、yのメソッドを記述できます。

function y(startingHeight, apexHeight, t){
    B = (apexHeight - startingHeight) / 4;
    A = -B;
    C = startingHeight;
    return A*t*t + B*t + C;
}

xとzは、最初から最後まで直線的に増加するため、簡単です。

x(t) = At + B
x(0) = startX
x(1) = endX

x(0) = startX = A*0 + B
B = startX
x(t) = At + startX

x(1) = endX = A*1 + startX
A = endX - startX

x(t) = (endX - startX) * t + startX

(zにはxと同じ式があります-すべてのxをzに置き換えるだけです)

function x(start, end, t){
    A = (end - start);
    B = start;
    return A*t + B;
}

function z(start, end, t){
    A = (end - start);
    B = start;
    return A*t + B;
}

これで、時間tでのチェスの駒の3D位置を見つけることができます。

function parabola(xBegin, xEnd, zBegin, zEnd, yStart, yApex, t){
    return [x(xBegin,xEnd,t), y(yStart,yApex,t), z(zBegin,zEnd,t)];
}
于 2012-05-17T20:20:24.877 に答える