2012-05-17 4 views
2

Я разрабатываю 3D-шахматную игру, в которой мне нужно уметь вычислять позиции траектории 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)=??? 
+0

p1, p2 и p3 лежат на параболе и р2 апекс? – Ani

+0

exacly !! p1 - ​​начало, p2 - вершина, а p3 - конец. – Andrade

+0

Проблема чрезмерно ограничена, если 'p2' является точно вершиной. Вам нужно рассмотреть их всего три точки в пространстве, принадлежащих параболе. – ja72

ответ

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=x1, в t=0.5 затем x=x2 и в t=1, затем x=x2. Аналогично для y(t) и z(t).

+0

Прошло много времени с моего последнего урока геометрии, но ... Я подозреваю (но не могу доказать), что использование полинома для x (t) и z (t) будет слегка искажать параболу как видно со стороны. Я думаю, вам нужны линейные функции для x и z для получения фактической параболы. Тем не менее, ваши уравнения, я думаю, по-прежнему будут иметь хорошую изогнутую форму, которая в любом случае может удовлетворить потребности OP. – Kevin

+0

Большое вам спасибо, он отлично поработал. Это очень просто и понятно. Это даже лучше, чем я ожидал, потому что я могу остановить анимацию только путем тестирования t вместо текущей точки X, Y, Z. – Andrade

3

Если начальные и конечные значения 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, вы можете написать метод для нахождения у:

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

х и г являются более простыми, так как они просто увеличивайте линейно от начала до конца:

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 на Заболоцкого)

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; 
} 

Теперь вы можете найти 3d позицию шахматной фигуры в момент времени т:

function parabola(xBegin, xEnd, zBegin, zEnd, yStart, yApex, t){ 
    return [x(xBegin,xEnd,t), y(yStart,yApex,t), z(zBegin,zEnd,t)]; 
}