Camera - Une camera fluide ?

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Alcor
Messages : 16
Inscription : 19 Mai 2010 10:56

Camera - Une camera fluide ?

Message par Alcor » 31 Mai 2010 09:57

Bonjour à tous,

Alors voilà mon problème. Je vais essayer d'être le plus clair possible.
Tout d'abord, je suis infographiste, donc le javascript est pour moi, .... quelques choses de nouveaux et dont la prise à main me prendra du temps.
J'ai parcouru plusieurs posts ou tutos concernant mon problème mais aucuns ne répond vraiment à mes questions et surtout, chacuns procèdent de manière différentes. C'est assez dur de bien comprendre.

Donc mon problème:
J'essaie de bidouiller sur un jeu en side-scrolling.
Pour le moment je travaille qu'avec des objets de Unity pour justement tester les scripts. Ici c'est pour la camera.
Actuellement ma camera suit sa target (le perso) sur un axe (axe X). J'ai volontairement décalé la camera pour décentrer la target (x+2 et y+2).
Je n'ai malheureusement pas mon code avec moi mais il est fait de 3 lignes.

Ce que je souhaite (on y arrive enfin), c'est que la camera suive la target mais de manière plus douce.
Dans le tuto 2d-game-tutorial du site officiel, la camera réagit exactement comme je le souhaiterais. Seul problème, c'est le code. J'ai encore beaucoup de mal à le comprendre. Quelles fonctions me serais utile ? Lesquels ne le seront pas ?
Aussi, comme dit précédement, en fonction du tuto trouvé, le code est différent pour un résultat relativement proche. C'est donc assez dur de faire le tris dans tout ça pour ne garder que l'essentiel de ce que l'on souhaite.

Si vous auriez une idée plus précise à m'indiquer pour que je puisse trouver mon bonheur, je serais très content. ;)

Merci d'avance et bonne journée !

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Camera - Une camera fluide ?

Message par giyomuSan » 31 Mai 2010 10:38

malheureusement en code il n y a pas de "facon de faire ou de Standart", la seule facon qui compte c celle qui te permet d'arriver a ce que tu souhaite :mrgreen: ..c'est pour ca que Mr Coder X te dira qu il faut faire ca et Que Mr coder Y te dira non faut faire comme ca . qui a raison ou tort hehe , personne en fait.

Pourquoi ne reutilise pas tout simplement le code de la camera pour ton side scroller.

Si tu veux comprendre le code de cette cam il te faut comprendre les maths autour de fonction utiliser , si tu veux un mouvement fluide il faut du Damping , retarder le recalage de la cam sur ta target , et souvent tu verra uen fonction math "Lerp" ds les script pour ca ou Slerp pour les rotations.

Perso si tu veux avancer dans un premier temps te prends pas la tete utilise un script deja fais de cam qui te convient , il propose generalement suffisamment d elements pour que tu puisse arranger un peu.

Sinon amuse toi avec les fonction d unity qui concerne ces fameux Lerp / Slerp histoire de te faire une idee de ce que ca donne , utilise les bout de code de la doc c suffisant ds un premier temps poru jouer avec et comprendre un peu comment ca marche ;)

Alcor
Messages : 16
Inscription : 19 Mai 2010 10:56

Re: Camera - Une camera fluide ?

Message par Alcor » 31 Mai 2010 10:53

On va directement prendre le code complet du tutos et enlever les parties inutiles au fur et à mesure alors. ;)

Je sais que lorsque je l'ai vu, ça m'avait quelques peu refroidit. ^^ On va le nettoyer ligne par ligne alors, histoire d'avoir une version épurée qd même.
Merci des infos sur le damping, slerp et lerp. ;)

Alcor
Messages : 16
Inscription : 19 Mai 2010 10:56

Re: Camera - Une camera fluide ?

Message par Alcor » 01 Juin 2010 13:47

Je fais un petit up de mon post.

Donc toujours le même soucis de la camera.
J'essaies en prenant le script du tutorial officiel, malheureusement, y a pas mal de trucs qui marche pas.
Bon évidement, faut adapter les variables, supprimer les trucs en trop, etc.. etc.. mais au final, après avoir modifier tout ce que me provoquait une erreur, la camera ne bougeait plus du tout.

Voici le script actuel, propre et fonctionnel:

Code : Tout sélectionner

var target:GameObject;


function Update () {
	
	transform.position.x=target.transform.position.x+2.5;
	
	transform.position.y=target.transform.position.y+2;
}
Avec ça, ma camera suit ma target avec un léger décentrement.
Que puis-je utilisé comme function/variable pour rajouter du smooth ?

J'ai jeté un oeil sur le damping, le smooth, le mathflerp... mais j'ai du mal à comprendre le bazard actuellement.
Bon, vu que je souhaite pas avoir un code tout fait, mais des pistes, qqun à des idées ? :)


Merci d'avance j'espère. ;)

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Camera - Une camera fluide ?

Message par giyomuSan » 01 Juin 2010 13:57

il va te falloir plsu de 2 ligne de code pour avoir quelques chose de "solide" pour la cam, il n y a aucun prob a avoir un code de 10 ligne ou plus si si c necessaire a l execution du script.

aussi tes valeur rajouter en "Dur" poru tes offset , c pas tres recommande car ca limite completement la flexibilite de ton code par la suite si il s avere que poru une raison quelquonque tu es besoin de changer en cours de jeu.

heliuse
Messages : 3
Inscription : 06 Sep 2010 20:22

Re: Camera - Une camera fluide ?

Message par heliuse » 07 Sep 2010 11:30

bonjour ,

j'ai également remarqué la non fluidité de la plupart des exemples en unity 3d . je cherche aussi comment avoir un rendu fluide calé à la syncro de l'écran .Comme le permettent la plupart des logiciel de programmation comme A8 ou autre .
J'espère bien qu' unity n'a pas reprit la même politique d'affichage que flash genre compatible avec tout mais non fluide sur tout :roll:

je teste encore

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Camera - Une camera fluide ?

Message par giyomuSan » 07 Sep 2010 16:29

qu'appelle tu la non fluiditee,

de plus le calage avec l ecran n'as pas vraiment un rapport avec le cote fluide ,ce qui maintient le smooth c un fps constant , integer ( car les fos a 55.6 bof ...XD ) ton ecran rafraichis a 60 frame seconde , bah un fs de 120 constant sera top speed et fljuide de meme que celui a 60.


maintenant que unity est du mal a conserver un fps "constant " en interne ouais la ca peu jouer des tour c sur :)

heliuse
Messages : 3
Inscription : 06 Sep 2010 20:22

Re: Camera - Une camera fluide ?

Message par heliuse » 07 Sep 2010 17:40

Bonjour ,
Ancien programmeur amateur de différents langage comme Pure , blitz , Glbasic, MMF2 ,a8 .., je découvre le moteur Unity 3d qui semble est très prometteur .
Mes premiers test sont avidement la qualité possible de rendu , non par forcement la capacité de gérer les schaders ,mais simplement s'il permet un affichage fluide .( chose impossible en "Flash" par exemple )
un affichage fluide est en général obtenu avec un framerate calé avec la syncro de l'écran .
Ce qui permet un srcolling fluide et lisse en 2D ou un rendu lisse du même genre en se déplacent latéralement de gauche à droite dans un jeu 3D style FPS .
Le jeux comme "Super Mario" sur Wii montre bien ce qu'est un rendu fluide .
Dans le cas du moteur unity 3D mes test me permettent de constater qu'il semble possible d'obtenir ce type de rendu lisse avec un exe en plein écran en activant la syncro . "2D Gameplay Tutorial" en est l'exemple .
Par contre c'est le seul exemple qui m'a permis de reproduire cette fluidité .
Tout les autres ont un déplacement de la camera saccadé .
J'en conclu donc que le moteur "unity" permet ce rendu lisse mais quel sont les paramètres de la camera qui permettent de configurer cela ?

Merci.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Camera - Une camera fluide ?

Message par ZJP » 09 Sep 2010 17:56

Salut,

Quelque soit ta vitesse d'affichage, si tes déplacements d'objets (caméra ou autre) n'incluent pas le "DeltaTime", tu n'auras pas de fluidité (j'entends par là, un mouvement "coulé", sans saccade )
A 20 ou 400fps, le problème est le même pour tout les moteurs ;)
http://unity3d.com/support/documentatio ... aTime.html

JP

Edit :
En ce moment je teste ça. Il y a du DeltaTime partout, est c'est super fluide. Un des meilleurs scripts trouvé jusqu'à présent sur le "contrôle aérien" ;)

Code : Tout sélectionner

/* This is identical to the Flight Sim script, I just optimized it for realistic space flight
In space there is no gravity or lift, and no need to bank into a turn.
*/

var flyer : GameObject;

// Various control variables. These mostly control realism settings, change as you see fit.
var throttleDelta : float=1;			// This defines how fast the throttle value changes
var accelerateConst: float = 10;
var decelerateConst: float = 0;
var smoothRotation : float = 1.5;
var speedConst : int = 250;
var throttleConst = 30;
var maxSpeed : float = 100;
var liftConst : float;					// Another arbitrary constant, change it as you see fit.
var dragConst : float;				// Note that this is NOT the same as the rigidbody drag...
var gravityConst = 9.8;				// An arbitrary gravity constant, there is no particular reason it has to be 9.8...

// Rotation Variables, these change how your plane turns.
var lockedConst : boolean;		// If this is checked, it locks pitch roll and yaw const to the var rotationConst.
var rotationConst : int = 100;
var pitchConst = 80;
var rollConst = 80;
var yawConst = 80;
var pitchDelta : float = 1.05;
var rollDelta : float = 1.05;
var yawDelta : float = 1.05;

// Private variables that dont need to clutter the inspector panel.
private var trueSmooth : float;
private var truePitch : float;
private var trueRoll : float;
private var trueYaw : float;

// Airplane Aerodynamics - don't alter these... Anything that is preceded by "true" is directly plugged into a movement or rotation line.
private var thrust : float;
var trueLift : float=10.0;
private var trueThrust : float;
private var trueDrag : float;
private var trueGrav : float;

// Let the games begin!
function Start ()
{
	flyer.rigidbody.drag = 1;
	if (lockedConst == true)
	{
		pitchConst = rotationConst;
		rollConst = rotationConst;
		yawConst = rotationConst;
		Screen.showCursor = false;
	}
	Screen.lockCursor = true;
}

function Update () 
{
	// * * This section of code handles the plane's rotation.
	var pitch = Input.GetAxis ("Mouse Y") * pitchConst;
	var roll = Input.GetAxis ("Mouse X") * rollConst;
	var yaw = -Input.GetAxis ("Yaw") * yawConst;

	pitch *= pitchDelta * Time.deltaTime;
	roll *= -rollDelta * Time.deltaTime;
	yaw *= yawDelta * Time.deltaTime;
	
	// Smothing Rotations...
	trueSmooth = Mathf.Lerp (trueSmooth, smoothRotation, 5* Time.deltaTime);
	truePitch = Mathf.Lerp (truePitch, pitch, trueSmooth * Time.deltaTime);
	trueRoll = Mathf.Lerp (trueRoll, roll, trueSmooth * Time.deltaTime);
	trueYaw = Mathf.Lerp (trueYaw, yaw, trueSmooth * Time.deltaTime);

	// * * This next block handles the thrust and drag.
	// This block sets the value of the joystick throttle ( float value between 0 and 1)
	var throttle = (-(Input.GetAxis ("Throttle"))+1)/2 * throttleConst;
	throttle *= throttleDelta * Time.deltaTime;
	if ( throttle >= trueThrust)
	{
		trueThrust = Mathf.SmoothStep (trueThrust, throttle, accelerateConst * Time.deltaTime);
	}
	if (throttle < trueThrust)
	{
		trueThrust = Mathf.Lerp (trueThrust, throttle, decelerateConst * Time.deltaTime);
	}	

	// This is a airbrake, this increases drag, lowering your speed
	if (Input.GetButtonDown ("Airbrake"))
	{
		// Do such
	}
	
	// * * Now we are applying lift and gravity to airplane.
	
}	// End function Update( );


// Now we apply what we calculated...	
function FixedUpdate () 
{
	// Seperated addRelativeForce so we have better controll over when we want them to run.
	if (trueThrust <= maxSpeed)
	{
		// Horizontal Force
//		flyer.rigidbody.AddRelativeForce (0,0,trueThrust*speedConst);
		//transform.Translate (0,0,trueThrust);
	}
	
	flyer.rigidbody.AddRelativeForce (0,trueLift*speedConst,0);
	transform.Rotate (truePitch,-trueYaw,trueRoll);
	
	//if(Input.GetMouseButton (0)) Screen.lockCursor = false;
	//if(Input.GetMouseButton (1)) Screen.lockCursor = true;

}// End function FixedUpdateUpdate( );

Le post : http://forum.unity3d.com/viewtopic.php?t=45396

heliuse
Messages : 3
Inscription : 06 Sep 2010 20:22

Re: Camera - Une camera fluide ?

Message par heliuse » 10 Sep 2010 20:13

Merci Zip :)
je regarde cela avec beaucoup d'intérêt

Répondre

Revenir vers « Scripting »