Equação para gráfico de rejeição?


7

Eu basicamente quero que minha câmera em 3D se mova automaticamente. Atualmente, tenho um movimento linear que é bastante burro, então eu gostaria de fazer um movimento de salto.

No entanto, o que é uma boa equação para saltar? Quero dizer, para um círculo que você pode fazer y = sqrt(1 - x^2), mas se eu tivesse um gráfico de salto, qual seria a fórmula correspondente? Eu acho que é algo com abs, pois tem que 'saltar'. Algo como (eu inventei isso com o Paint): gráfico saltitante

O que é uma boa equação que resulta em um gráfico desse tipo? As transformações que eu posso fazer, acho, mas só estou procurando pelo tipo de equação.


3
Talvez você poderia usar algo ao longo das linhas de: y = abs (cos (x * 5) * max (1-x, 0))
Kromster

6
Usar uma equação gráfica não ajudará a aplicar acelerações de aparência natural ao sistema. Você pode se surpreender ao descobrir como seria fácil simplesmente usar equações newtonianas básicas aqui. Dê ao objeto um pouco de massa e momento e deixe a força da gravidade e Newton lidar com as acelerações e mudanças de posição. É muito mais fácil do que você imagina.
27711 Steve

11
@ SteveH Você deve colocar isso para responder.
Notabene 28/03

@notabene sim, eu estava sentado em cima do muro com isso e você me empurrou para esse lado. Obrigado. Hesitei porque não queria gastar os 15 minutos para fornecer uma solução de pseudo-código.
27711 Steve

@Krom: Obrigado, eu tenho atualmente: y = abs(cos((x+18)/6.2)/((x+18)/6.2))*149. @SteveH: Você poderia dizer os termos-chave das soluções newtonianas? Parece que estou usando os errados, pois não consigo realmente encontrar um bom exemplo de como implementá-lo.
Pimvdb 28/03

Respostas:


8

O uso de uma equação gráfica não ajudará a aplicar acelerações de aparência natural ao sistema. Você pode se surpreender ao descobrir como seria fácil simplesmente usar equações newtonianas básicas aqui. Dê ao objeto um pouco de massa e momento e deixe a força da gravidade e Newton lidar com as acelerações e mudanças de posição. É muito mais fácil do que você imagina


Exemplo do referido equação em sua resposta seria ótimo :)
Kromster


2
aqui está o exemplo: xna.multigan.com/pastebin/?page=view&id=1301401080 eu o escrevi em XNA, mas acho que pode ser lido como código pseudo bem
Steve H

Muito obrigado! Você definitivamente merecem a resposta como sendo a única aceite :)
pimvdb

11
Foi isso que acabei com (JavaScript): jsfiddle.net/Cf9H4 .
Pimvdb

4

Em vez de fornecer uma resposta direta, quero indicá-lo na direção certa. Se você pesquisar no Google por IA para mover entidades, encontrará algoritmos usando variáveis ​​como velocidade, massa, velocidade e aceleração. Se você adicionar a força gravitacional à equação, deverá obter um comportamento realista.

Como afirmado em um dos comentários às suas perguntas, não é tão complicado.

Eu recomendo a programação do jogo AI pelo exemplo que achei muito útil.

Eu também encontrei este link explicando as forças envolvidas em uma bola quicando.


2

Se o seu movimento parecer muito com o gráfico, você poderá usar uma equação de suavização de rejeição como esta ( fonte ):

// BOUNCE EASING: exponentially decaying parabolic bounce
easeOutBounce = function (t, b, c, d) {
    if ((t/=d) < (1/2.75)) {
        return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
        return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
        return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
        return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
};

easeInBounce = function (t, b, c, d) {
    return c - Math.easeOutBounce (d-t, 0, c, d) + b;
};

O movimento ficaria neste gráfico (easeIn): saltar facilidade em


Devo dizer que isso funciona muito bem. Aparentemente, não é apenas um gráfico, mas uma combinação de x^2variantes. Se eu usar easeOutBounce(50, 0, 50, 50), obtenho o efeito de salto com 50 etapas, no intervalo de 0 a 50. Obrigado!
Pimvdb

1

Se você quiser pular, verifique o Coeficiente de Restituição . É um valor entre 0 e 1 que representa a "graça" da câmera. Um valor 0 significa que nenhum salto ocorrerá quando o objeto colidir com o solo e 1 significa que a câmera retornará à sua altura original após colidir com o solo (neste cenário, de qualquer maneira).

A maneira mais fácil de implementá-lo é fornecer à sua câmera um vetor de velocidade inicial (chame-o de u) e você deseja encontrar o vetor de velocidade final depois que a câmera colidir (vamos chamar de v). Vamos chamar o CR e.

e = v / u

Então, tudo o que você precisa fazer é multiplicar sua velocidade inicial pelo coeficiente, negar essa velocidade (para que ela viaje na direção oposta) e pronto, você tem sua velocidade final e, se continuar fazendo isso sempre que colidir, terá seu movimento saltitante. Isso pressupõe que você tenha um plano plano com o qual deseja pular, se tiver uma malha complexa contra a qual está colidindo e, em vez de negar o vetor, basta multiplicá-lo pelo normal do polígono com o qual colide (o que é essencialmente que negação faz em um plano).

Use algum tipo de função de atualização de posição (Euler, Verlet ou mesmo RK4 - veja este link ) e isso facilitará muito a tarefa.

Espero que ajude (e espero que minha matemática não esteja muito longe: P)


1

Se você estiver procurando por uma equação de perto, mas descrevendo aproximadamente uma rejeição, tente:

y=(e^-x)*abs(4cos(5x))

Onde

  • "4" é o coeficiente da altura da queda e dos saltos subsequentes,
  • "5" é a frequência dos saltos e
  • a parte "abs" é dar uma trajetória acentuada para a parte inferior do salto.

Agradável. Por que isso não é mais votado?
JohannesA
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.