Usando um valor de epsilon para determinar se uma bola em um jogo não está se movendo?

votos
2

Eu tenho bolas saltando ao redor e cada vez que colidem seu vetor velocidade é reduzida pelo coeficiente de restituição.

Agora minhas bolas CR para minhas bolas é 0,80. Então, depois de muitos saltos minhas bolas têm parou rolling porque sua velocidade tem se tornando alguns ridiculamente pequeno número.

Em que fase é apropriado para verificar se um valor de velocidade é pequena o suficiente para simplesmente chamá-lo de zero (para que eu não tenho o jittering louco das bolas reagindo ao seu micro-velocidades). Eu li em alguns fóruns antes que as pessoas, às vezes, usar uma constante epsilon, alguns pequeno número e verificar contra isso.

Devo definir uma constante epsilon e fazer algo como:

if Math.abs(velocity.x) < epsilon then velocity.x = 0

Cada vez que eu atualizar a velocidade bolas e posição? É isso que geralmente é feito? Seria razoável para colocar isso em minhas aulas Vector setters para x e y? Ou devo fazê-lo fora da minha classe vector quando estou calculando a velocidade.

Além disso, o que seria um valor epsilon razoável se eu estava usando carros alegóricos para o meu vector velocidade?

Publicado 10/12/2008 em 01:02
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Em vez de um epsilon para uma função IsStillMoving, talvez você poderia usar uma função UpdatePosition, prevista numa base objeto a objeto com base em sua velocidade.

Eu faria algo assim (em meu próprio make-it-up-as-you-go pseudocódigo):

void UpdatePosition(Ball b) {

   TimeStamp now = Clock.GetTime();
   float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds;

   Point3D oldPosition = b.Position;
   Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval);
   b.MoveTo(newPosition);

   float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel
   float pixelDistance = Camera.PixelDistance(oldPosition, newPosition);
   float fps = System.CurrentFramesPerSecond;
   float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate) / fps;
   float nextUpdateInterval = secondsToMoveOnePixel / epsilonOfAccuracy;

   b.SetNextUpdateAt(now + nextUpdateInterval);
}

Bolas em movimento muito rapidamente iria ficar atualizado em cada quadro. Bolas movendo mais lentamente pode atualizar a cada cinco ou dez quadros. E bolas que pararam (ou quase parado) iria atualizar apenas muito raramente.

Respondeu 10/12/2008 em 01:43
fonte usuário

votos
1

Um valor razoável para epsilon vai depender das limitações de seu sistema. Se você está representando a bola graficamente, então o seu epsilon pode corresponder a, por exemplo, uma velocidade de .1 pixels por segundo (garantindo que a sua noção de parada corresponde a experiência do usuário dos objetos de tela de parada). Se você estiver fazendo uma simulação de física, você vai querer ajustá-lo à precisão ao qual você está tentando medir o seu sistema.

Quanto à forma como muitas vezes você verificar - que depende também. Se você está simulando algo em tempo real, a verificação extra pode ser caro, e você vai querer verificar cada 10 atualizações ou uma vez por segundo ou algo assim. Ou desempenho pode não ser um problema, e você pode conferir a cada atualização.

Respondeu 10/12/2008 em 01:23
fonte usuário

votos
0

Epsilon, por natureza, é o menor incremento possível. Infelizmente, os computadores têm diferentes "mínimas" incrementos de seu próprio dependendo da representação de ponto flutuante. Eu seria muito cuidadoso (e pode até ir mais alto do que eu calcularia apenas para segurança) brincar com isso, especialmente se eu quero um código para ser portátil.

Você pode querer escrever uma função que descobre o incremento mínimo sobre os seus carros alegóricos, em vez de usar um valor mágico.

Respondeu 10/12/2008 em 01:49
fonte usuário

votos
0

IMO sua abordagem epsilon está bem. Gostaria apenas de experimentar para ver o que parece ou se sente natural para a animação no jogo.

Respondeu 10/12/2008 em 01:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more