Eu tenho um sprite que tem Velocity
e Position
, ou armazenado como Vector2
. A cada Update
ciclo, a velocidade é adicionada à posição.
Eu gostaria de dar ao sprite um terceiro vetor Target
,. Novos destinos podem ser dados a qualquer iteração. Gostaria que o sprite se movesse essencialmente em um padrão de caminhada aleatória, no entanto, dois parâmetros devem ser expostos:
- Uma caminhada aleatória típica tem a mesma probabilidade de aumentar ou diminuir a distância a qualquer ponto
Target
(mais a pequena chance de movimento tangencial). Devo ser capaz de influenciar minha caminhada aleatória de modo que, embora ainda seja aleatória, a direção na qual o sprite "decida" tenha maior probabilidade de aproximá-loTarget
. - A caminhada aleatória deve ser "suave" - o sprite não deve mudar rapidamente de direção, pois isso parecerá "tremer" ou "tremer" para o jogador. Ele deve se virar gradualmente de uma maneira ou de outra, movendo-se aleatoriamente, enquanto se aproxima lentamente quando a média é calculada.
Qual é uma maneira boa e simples de fazer isso? Se possível, dê a resposta como um Vector2 RandomWalk(Vector2 target)
método.
Eu já tenho um NextGaussian(mean, stdev)
método disponível, se isso for útil.
xna
c#
random
linear-algebra
Superbest
fonte
fonte
Respostas:
Eu pegaria o comportamento de direção "vagar" (o código-fonte pode ser encontrado aqui ) e o ajustaria de uma maneira que os números aleatórios fossem tendenciosos em direção ao seu alvo.
fonte
Para obter uma caminhada aleatória suave, você pode usar splines Catmull-Rom . Esse tipo de spline pega uma sequência de pontos e gera curvas suaves que passam por cada ponto. Assim, você pode gerar pontos de referência aleatórios para o sprite percorrer e animá-lo ao longo de um spline Catmull-Rom através dos pontos de referência. Para que o spline funcione, você precisará de um total de quatro waypoints: os dois anteriores e os próximos. Quando o sprite alcançar um waypoint, jogue fora o mais antigo do seu conjunto de quatro e gere um novo, depois continue animando ao longo do spline.
Quanto a seguir em direção ao alvo, uma idéia seria compensar a distribuição da caminhada aleatória em direção ao alvo. Por exemplo, se você normalmente escolher um waypoint aleatório usando uma distribuição gaussiana centralizada na posição atual do seu sprite, poderá deslocar o centro do gaussiano por alguma distância predefinida em direção ao alvo. Os tamanhos relativos do deslocamento e o desvio padrão do Gaussian determinariam quão tendencioso é o movimento.
fonte
Aqui está uma coisa que preparei em cerca de 20 minutos. Tomamos a direção do caminhante até o alvo, escolhemos uma direção dentro de uma certa quantidade de graus dessa direção (uma quantidade que diminui à medida que o caminhante se aproxima do alvo). Esse algoritmo também é responsável pela distância do alvo, para que ele não passe do alvo. Para encurtar a história, basicamente oscila para a esquerda e para a direita uma pequena quantidade aleatória e se aproxima do alvo à medida que ele se aproxima.
Para testar esse algoritmo, coloquei o andador em (10, 0, 10) e o alvo em (0, 0, 0). Na primeira vez que o algoritmo foi executado, ele escolheu aleatoriamente uma posição para o caminhante caminhar até (3,73f, 0, 6,71f). Depois que o caminhante alcançou essa posição, ele escolheu (2.11f, 0, 3.23), depois (0.96f, 0, 1.68f), depois (0.50f, 0, 0.79f), depois caminhou direto para o alvo, porque estava dentro uma distância mínima de tolerância.
Representado graficamente da vista aérea, o caminho se pareceria com os pontos da imagem abaixo, começando em 'W' (andador) e terminando em 'T' (alvo). Se você deseja um movimento mais natural, pré-calcularia alguns pontos antes do tempo e criaria um spline, oferecendo muitos outros pontos para que o caminhante o siga. Estimei como seria esse caminho depois de ser transformado em um spline e isso é representado pela linha na imagem.
E aqui está o código de exemplo:
Com base no seu jogo específico, você pode ajustar distâncias, FOV, aleatoriedade e frequência em que isso é executado, até que atenda às suas necessidades. Tenho certeza de que o algoritmo pode ser limpo e otimizado, não gastei muito tempo com isso, só queria que fosse fácil de ler.
fonte