Determinando a posição de um objeto ao longo de uma curva ao longo do tempo

8

Eu tenho alguns objetos no meu jogo que são "jogados". No momento, estou tentando implementar isso fazendo com que esses objetos sigam uma curva parabólica. Eu sei o ponto inicial, o ponto final, o vértice e a velocidade do objeto.

  1. Como posso determinar a qualquer momento ou quadro o que são as coordenadas x e y?
  2. Uma curva parabólica é mesmo a curva certa a ser usada?
Ben Williams
fonte
Suas entradas são ambíguas. Suponho que vértice significa a posição de olhar. E ponto final significa a posição final. O que significa velocidade? Quão longe o objeto pode viajar em um segundo? A velocidade é quanto tempo o objeto deve levar para começar do início ao fim?
Deft_code 23/10/10
Desculpas por não estar claro. Vou tentar simplificar - eu gostaria de fazer uma bola se mover de um lado da tela (x = 0) para o outro lado (x = 480), começando em y = 0 e atingindo um máximo de y = 320 (a meio caminho, x = 240). Eu quero fazer isso mais de 2 segundos. A partir dessas informações, posso determinar a partir de uma fórmula minhas coordenadas xey para cada quadro?
Ben Williams

Respostas:

4

O que você está procurando um gráfico paramétrico da função parabólica. É mais fácil fazer com que a função paramétrica use um intervalo de p ∈ [0,1].

A forma canônica de uma parábola paramétrica é

k: = alguma constante
f_x (p) = 2kp
f_y (p) = kp²

Usando esta fórmula e alguma álgebra básica para transformar a função e eu tenho

p ∈ [0,1] → x, y 0,1 [0,1]
ou, em outras palavras, mantenha p entre 0 e 1 e x, y também estará entre 0 e 1.
x = p
y = 4p - 4p²

Portanto, para obter essas funções, os números que você está procurando são produzidos.

float total_time = 2;
float x_min = 0;
float x_max = 480;
float y_min = 0;
float y_max = 320;

float f_x( float time )
{
   float p = time/total_time;
   return x_min + (x_max-x_min)*p;
}

float f_y( float time )
{
   float p = time/total_time;
   return y_min + (y_max-y_min)*(4*p-4*p*p);
}
deft_code
fonte
sua notação é um pouco confusa. você f_xusa f_ya aceleração acomo meia velocidade? Você deve fazer isso x(t) = x0 + vx0*tey(t) = y0 + vy0*t + .5*ay*t*t
Tobias Kienzler 26/10/10
Eu propositalmente não usei as fórmulas de movimento de Euler. ae teram apenas nomes mal escolhidos. Você deve observar que não há um componente de velocidade nas fórmulas. Movimento de Euler e parábolas paramétricas não são a mesma coisa, mas são muito semelhantes, pois o vôo balístico traça um caminho parabólico.
Deft_code 26/10/10
4

Encontrar a equação de uma curva na qual você deseja que seu objeto se mova é uma maneira de realizar o que deseja, mas provavelmente não é o melhor.

Em vez disso, geralmente se registra as propriedades locais de um objeto (velocidade, aceleração) e, em seguida, usa esses valores para atualizar a posição do objeto a cada quadro.

Como você mencionou uma parábola, estou assumindo que você está jogando uma bola em 2D e deseja que ela caia ao longo do eixo y. Portanto, seu objeto tem aceleração constante na direção y (vamos chamá-lo g) e nenhuma aceleração na direção x. Quando o objeto é lançado, é dada alguma velocidade, vamos chamá-lo vxe vy.

Em seguida, em cada quadro do seu aplicativo, você adicionaria a aceleração do objeto à sua velocidade e, em seguida, acrescentaria sua velocidade à sua posição. Algo como:

vy += g;
x += vx;
y += vy;

Faça isso em todos os quadros e sua bola começará a se mover. Há muito mais a saber sobre isso, mas é um começo.

Brandon Williams
fonte
Estou jogando uma bola em 2D, mas a bola tem aceleração na direção x. Eu quero que ele seja jogado de um lado da tela para o outro (veja o comentário na pergunta original). Eu entendo como atualizar com base em vx e vy, mas não sei como atualizar esses valores.
Ben Williams
2
@ Ben Williams Você só precisa definir o vx e o vy no início. E adicione gravidade ao vy de cada quadro. Você também pode ter um atrito multiplicando vx e vy por um número abaixo de 1 (algo como 0,95 pode funcionar dependendo da taxa de quadros). Pesquise no google "bola saltitante YourProgrammingLanguageHere" e você provavelmente obterá alguns tutoriais básicos, mas úteis.
precisa
3
Na verdade, se você souber que seu objeto está seguindo uma trajetória parabólica, é muito, muito melhor implementá-lo como uma função de curva, em vez de etapas físicas discretas. Sim, pode ser 'mais difícil' codificar inicialmente, mas a recompensa é que o movimento do seu objeto se dissocia das preocupações com a taxa de quadros.
Blair Holloway
11
Eu segundo @Blair, a menos que você separe a física de framerate do framerate de vídeo pode causar efeitos horríveis como recorte erros
Tobias KIENZLER
0

Nos jogos de console, geralmente usamos a Interpolação Bicúbica para resolver esse problema. Primeiro, experimente a posição de um objeto em intervalos regulares de tempo t. Para um projétil, adicione aceleração gravitacional [0, dy / dt / dt] à sua velocidade [dx / dt, dy / dt] a cada intervalo. Registre todas as coordenadas [x, y] geradas em uma matriz.

Posteriormente, para reconstruir a posição do objeto [x, y] para um dado t, leia as quatro amostras mais próximas daquele t do buffer que você registrou: [t-1, t, t + 1, t + 2]. Misture as quatro amostras de acordo com os coeficientes no artigo da wikipedia para obter movimento suave no espaço.

Isso não é tão preciso fisicamente quanto a execução de cálculos físicos on-the-fly, mas permite licença artística e economia de escala para ajudar na sua simulação.

bmcnett
fonte