Caméra / écran réaliste suite à une explosion

36

Je voudrais secouer un peu l'appareil photo pendant une explosion, et j'ai essayé différentes fonctions pour le faire bouger, et rien ne semble vraiment donner un tel «waouh, quel bang! tapez le sentiment que je cherche. J'ai essayé des modèles arbitraires d'onde sinusoïdale de fréquence relativement élevée avec un peu d'atténuation linéaire, ainsi qu'un modèle de type d'onde carrée. J'ai essayé de ne déplacer qu'un axe, deux et les trois (bien que l'effet de dolly était à peine perceptible dans ce cas).

Est-ce que quelqu'un connaît un bon modèle de caméra tremblante?

falstro
la source
2
Essayez de trouver des séquences de film montrant les tremblements de la caméra après des explosions et regardez-les au ralenti pour voir comment la caméra tremble et basez votre code sur cela.
Skizz
J'ai exactement le même problème - le vacillement a l'air trop lisse
Iain
Le plus gros problème auquel je suis confronté lors de la mise en place d'un tremblement de la caméra est qu'il semble que le personnage du joueur (sur lequel la caméra se concentre) bouge à la place de la caméra. Ce qui est étrange, c’est que c’est la caméra qui bouge, si vous regardez l’environnement que vous remarquez, mais puisque vous êtes tellement concentré sur le personnage du joueur, votre perception est déformée. J'essaie toujours de résoudre ce problème - probablement en modifiant le champ de vision lorsque la caméra s'éloigne / vers le joueur.
Kaj

Réponses:

35

J'ai un tremblement de caméra correct en appliquant du bruit Perlin à l'orientation de la caméra. Il vous donne une grosse secousse décente avec une agitation de fréquence plus élevée intégrée, et peut être vraiment beau.

http://mrl.nyu.edu/~perlin/doc/oscar.html a plus de détails et un exemple de code pour générer du bruit.

James Sutherland
la source
3
Oh, le bruit, pourquoi n'y ai-je pas pensé ... Après tout, j'ai eu une brève explosion de bruit, n'est-ce pas ... Excellente idée!
falstro
bonne idée, y at-il quelque chose que vous ne pouvez pas utiliser le bruit de Perlin pour résoudre? : P
Cubed2D
1
Le bruit est certainement la voie à suivre. Si vous visualisez même l’effet de votre après, ses courts changements de mouvement aléatoire dans différentes directions. Mais ce ne peut pas être un spasme, vous avez donc besoin de brèves sections d'uniformité. Cela semble être une utilisation parfaite du bruit Perlin.
Deceleratedcaviar
17

Si vous vous référez à ce tremblement d’écran tremblant provoqué par une explosion, j’ai essayé de l’implémenter dans mon prototype de jeu (c’est 2d mais devrait se traduire très bien en 3D, je l’espère). Regardez la vidéo sur youtube et voyez si c'est ce que vous cherchez - le tremblement de l'écran démarre environ à 1:35

Quoi qu’il en soit, j’ai réussi à créer une fenêtre pour l’écran et à stocker le point central ( centre).

Quand une explosion se déclenche, je crée un radiuséchantillon aléatoire de ~ 30 pixels. Je décale ensuite la fenêtre de centrece nombre de pixels dans une direction aléatoire.

Pour chaque mise à jour ultérieure (entre les tirages à l'écran), je réduis radiusde 10 à 20% et décale la vue de ce nombre de pixels à centrenouveau. Cependant, au lieu de choisir un angle aléatoire pour ce décalage, je prends l'angle précédent dans la fenêtre d'affichage centreet lui ajoute 180 +/- 60 degrés.

Donc, fondamentalement, chaque mise à jour (ou 10-20ms environ), je décale la fenêtre d'affichage d'un nombre décroissant de pixels à partir centrede l'écran.

Voici quelques pseudocodes:

viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()  

while(true)  //update about every 10-20ms
{ 
    radius *=0.9 //diminish radius each frame
    randomAngle +=(180 +\- rand()%60) //pick new angle 
    offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
    viewport.setCentre(viewportCentre + offset) //set centre of viewport
    draw() //redraw
}

J'arrête habituellement le tremblement de l'écran lorsque le rayon est inférieur à 2,0, point auquel je réinitialise à nouveau la fenêtre d'affichage centre.

Miklatov
la source
4
J'aime beaucoup cette implémentation, fonctionne parfaitement pour les petits jeux 2D. En tant que commentaire, cela revient à randomAngle += (150 + rand()%60)supprimer tous les problèmes +/-.
Krøllebølle
2
Votre vidéo est en panne.
Tara
Quel genre de calcul de "+/-"? Je n'ai jamais vu ce genre de choses.
Yoo Matsuo
4

Faire en sorte que la caméra bouge "se sente" correctement dépend moins de la direction du mouvement que des courbes d'accélération.

Les mouvements de caméra plongent dans le domaine de l'animation et toutes les règles d'action / réaction s'appliquent. Si vous vous déplacez de manière linéaire d'un point à un autre, vous vous sentirez lisse, uniforme et non comme un impact.

Si vous secouez la tête d'avant en arrière, vous remarquerez qu'il se déplace le plus rapidement à mi-chemin entre les changements de direction et ralentit de chaque côté, car vous devez d'abord ralentir puis commencer dans la nouvelle direction.

Voici une liste de diverses fonctions d’atténuation à appliquer à votre motion. Vous voudrez peut-être uniquement EaseOut le premier mouvement pour le rendre un peu plus abrupt, puis EaseInOut le reste pour simuler le mouvement de la tête / de la caméra.

Wkerslake
la source
1
Je pense qu'un assouplissement le rendrait encore trop lisse. Le bruit perlin semble être une bonne idée, ou sinon un simple hasard avec une plage aléatoire diminuant progressivement jusqu'à zéro pour le faire disparaître progressivement en soi, la caméra se sentira comme au printemps, je ne me sens pas bien avec les tremblements de la caméra).
Kaj
3

wkerslake a raison, les tremblements de la caméra semblent plus complexes que vous ne le pensez.

Lorsque vous imitez une caméra tremblante, vous devez réfléchir au type de caméra (opérateur) que vous souhaitez imiter. Le poids de la caméra affecte l'inertie, par exemple. Des caméras plus lourdes adoucissent les petits mouvements «aléatoires». Un cameraman sur un rail ou dans une voiture ajoute un bruit supplémentaire.

Utiliser le bruit Perlin ou Simplex est définitivement une option, alors il faut trouver le bon équilibre entre différents rapports de bruit. Mais j’ai découvert que l’utilisation de l’interpolation entre les valeurs demande moins d’informatique et peut être tout aussi efficace.

Il y a quelque temps, j'ai trouvé un script Maya qui semble bien faire les choses. Vous pouvez jeter un oeil à ce que .

Aussi, vous voudrez peut-être jeter un coup d'œil à Gran Turismo (5) , leur équipe a fait un travail impressionnant en faisant divers types de tremblement de caméra en temps réel lorsque vous regardez une rediffusion dans le match.


la source
2

Si vous avez une physique d'objet dynamique [ce n'est probablement pas le mot qui convient, mais un peu ce que je veux dire], où tous les objets non réparés seraient "soufflés" par l'explosion, la caméra pourrait être affectée comme un objet de ce type.
La seule différence serait simplement de changer la rotation / le pas / le lacet / le roulis de la caméra, et non la position.
Autre que cela, peut-être générer une séquence de nombre aléatoire et convertir ceux-ci en rotation d'une manière ou d'une autre? Pensez que heightmap, les niveaux de gris peuvent être un exemple; ils ne sont pas totalement différents, mais sont aléatoires.

Le canard communiste
la source
Une idée intéressante, je pense que je vais essayer le mouvement du bruit, et quand je le ferai, j'essaierai d'ajouter un effet de dolly plus discret, un peu comme si la caméra était attachée à un ressort et appuyée à l'envers. par le choc.
falstro