我正在开发一个 3D 国际象棋游戏,我需要能够以该轨迹描述抛物线(用于棋子动画)的方式计算轨迹的 X、Y、Z 位置。
因此,对于给定的等距点 p1=(x1,y1,z1)、p2=(x2,y2,z2) 和 p3(x3,y3,z3),我需要以下公式(或通式):
x=f(y,z)=???
y=f(x,z)=???
z=f(x,y)=???
我正在开发一个 3D 国际象棋游戏,我需要能够以该轨迹描述抛物线(用于棋子动画)的方式计算轨迹的 X、Y、Z 位置。
因此,对于给定的等距点 p1=(x1,y1,z1)、p2=(x2,y2,z2) 和 p3(x3,y3,z3),我需要以下公式(或通式):
x=f(y,z)=???
y=f(x,z)=???
z=f(x,y)=???
对于每个分量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=x1
,t=0.5
那时x=x2
,t=1
那时x=x2
。_ 同样对于y(t)
和z(t)
。
如果开始和结束 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)];
}