Mouvement Sous-marin[Résolu]

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Répondre
doliprane
Messages : 4
Inscription : 31 Mars 2010 22:46

Mouvement Sous-marin[Résolu]

Message par doliprane » 31 Mars 2010 22:55

Bonjour,

Voilà je suis en train de réaliser les mouvements d'un petit sous marin.
J'ai réussi à simuler les réactions d'un objets sous l'eau, mon sous marin se déplace etc.
Désormais je voudrais limiter la rotation de ce dernier sur l'axe x (car un sous marin ne peut pas plonger en piquet ou autre).

Concernant mes objets, je dispose d'une caméra mise derrière le sous-marin( qu'on pourra déplacer, vue intérieur etc), et donc d'un sous-marin (simuler par un cube faute de modèle :p). Les deux étant reliés par un Fixed joint.
Les directions du sous marins sont prise en compte via la souris (donc si on vise sur la gauche, le sous marin tourne le nez vers la gauche etc).

Voici un bout de code, j'ai récupérer des élements un peu partout et réussis à bouiner quelque chose qui fonctionne:

Code : Tout sélectionner

      //Déclararion de Variable et autre ...
       rotation.z = Mathf.SmoothDampAngle(rotation.z, -horizontal * rollMax, ref velocity, rollSmooth);
       transform.Rotate(Vector3.up, horizontal*(rotation.z % 90) / 90 * vertical, Space.World);
       Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
       Vector3 targetPoint = ray.GetPoint(hitdist);
       Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
      transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, sensibiliteSouris*Time.deltaTime);
     //On applique les forces, on effectue les mouvements...

Après avoir essayé plusieurs manière ( avec des conditions if, avec un configurable joint etc), rien n'y fait!
Quelqu'un aurait une idée pour limiter la rotation en x de n degrés ?

Amicalement,
Doli


EDIT: J'ai finalement trouvais une solution à mon problème sur le projet Penelope (le script RotationConstraint).
Dernière édition par doliprane le 03 Avr 2010 13:56, édité 1 fois.

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

Re: Mouvement Sous-marin

Message par giyomuSan » 01 Avr 2010 02:49

Dans ta derniere ligne

Code : Tout sélectionner

transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, sensibiliteSouris*Time.deltaTime);
tu utilise transform.rotation et targetRotation et les deux n'ont aucun element definissant une quelconque limitation sur l axe X, c'est de ce cote qu'il faudrais chercher

ou alors tu peux aussi limiter la sensibilite de la souris sur l axe vertical en lui donnant un rapport moindre

si tu veux limite sur un certain nb de degre tu peux utiliser
http://unity3d.com/support/documentatio ... Angle.html

pour trouver l angle limit (que tu aura defini au prealable) et limiter sur x.

donc peut etre ajouter un regle concernant rotation.x.

doliprane
Messages : 4
Inscription : 31 Mars 2010 22:46

Re: Mouvement Sous-marin

Message par doliprane » 01 Avr 2010 11:54

Merci de ta réponse giyomusan.
En gros je dois utiliser autre chose que transform.rotation et targetRotation ?
Sinon j'ai essayé Quaternion.Angle, malheureusement je ne vois pas comment l'utiliser sur mon projet :s. Sa me retourne un angle entre deux Quaternions, après je ne vois pas comment m'en servir concrètement.

Sinon "limiter la sensibilite de la souris sur l axe vertical en lui donnant un rapport moindre ", j'ai testé mais mon sous marin peut toujours monter à la verticale :(.



Amicalement,

Doli

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

Re: Mouvement Sous-marin

Message par ZJP » 01 Avr 2010 17:16

...car un sous marin ne peut pas plonger en piquet ou autre...
Erreur. pour une remontée ou une plongée en urgence il peut "chasser" aux ballasts avants ou arrières. L'aérodynamique ca compte aussi pour un sous-marin :D
Et même sans cela, l'orientation de tes barres de plongées le font piquer du nez ou remonter. Donc, il y a une inclinaison par rapport à ton axe X. Il peut même rouler sur Z.
En fait, le seul moment ou il restera à plat c'est en équilibrant les ballasts ( soit en remplissage ou vidage) et en gardant les barres a l'horizontale. Avec une assiette à zéro on ne monte (ou descend) pas très vite. :D

Tout cela pour dire, que si tu fais un jeu sur les SMs ce serait dommage de louper la partie déplacement en occultant les possibilités offertes par l'emploi des ballasts.
JP
L'intégrale de DiMercurio et Clancy. Les U-boot de la 2eme mondiale aussi :lol:
Dernière édition par ZJP le 02 Avr 2010 01:30, édité 1 fois.

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

Re: Mouvement Sous-marin

Message par giyomuSan » 01 Avr 2010 19:17

ah bah voila merci ZJP probleme solutionner >> garde le piquet :mrgreen:

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

Re: Mouvement Sous-marin

Message par ZJP » 02 Avr 2010 01:28

8-)

doliprane
Messages : 4
Inscription : 31 Mars 2010 22:46

Re: Mouvement Sous-marin

Message par doliprane » 03 Avr 2010 12:30

Bonjour,

Ah je me doutais d'un cas d'urgence comme celui-là, mais bon, je préfère l'enlever.
Sinon le sous marin peut faire des roulements sur l'axe Z.

Voilà, si quelqu'un a une solution à mon problème!

Ps: Je suis débutant sous unity (comme bcp de monde ici x) ), donc quaternion et rotation ne me sont pas ou peu familié !


Doli

EDIT: J'ai finalement trouvais une solution à mon problème sur le projet Penelope (le script RotationConstraint).

Avatar de l’utilisateur
Anterius
Messages : 13
Inscription : 07 Avr 2010 16:58
Localisation : PACA
Contact :

Re: Mouvement Sous-marin[Résolu]

Message par Anterius » 07 Avr 2010 17:16

Hello,

Doliprane, serait-ce possible que tu nous fasse partager le reste du code ?
le problème est aussi ds un autre poste, avec code et exemple...

viewtopic.php?f=7&t=395&p=1395#p1395

doliprane
Messages : 4
Inscription : 31 Mars 2010 22:46

Re: Mouvement Sous-marin[Résolu]

Message par doliprane » 20 Avr 2010 11:01

Bonjour Anterius, désolé de cette réponse tardive.
Voici le script que j'ai trouvais sur le projet "penelope" (dispo sur le site officiel d'unity) :


Code : Tout sélectionner

//////////////////////////////////////////////////////////////
// RotationConstraint.js
// Penelope iPhone Tutorial
//
// RotationConstraint constrains the relative rotation of a 
// Transform. You select the constraint axis in the editor and 
// specify a min and max amount of rotation that is allowed 
// from the default rotation
//////////////////////////////////////////////////////////////

enum ConstraintAxis
{
	X = 0,
	Y,
	Z
}

public var axis : ConstraintAxis; 			// Rotation around this axis is constrained
public var min : float;						// Relative value in degrees
public var max : float;						// Relative value in degrees
private var thisTransform : Transform;
private var rotateAround : Vector3;
private var minQuaternion : Quaternion;
private var maxQuaternion : Quaternion;
private var range : float;

function Start()
{
	thisTransform = transform;
	
	// Set the axis that we will rotate around
	switch ( axis )
	{
		case ConstraintAxis.X:
			rotateAround = Vector3.right;
			break;
			
		case ConstraintAxis.Y:
			rotateAround = Vector3.up;
			break;
			
		case ConstraintAxis.Z:
			rotateAround = Vector3.forward;
			break;
	}
	
	// Set the min and max rotations in quaternion space
	minQuaternion = thisTransform.localRotation * Quaternion.AngleAxis( min, rotateAround );
	maxQuaternion = thisTransform.localRotation * Quaternion.AngleAxis( max, rotateAround );
	range = max - min;
}

// We use LateUpdate to grab the rotation from the Transform after all Updates from
// other scripts have occured
function LateUpdate() 
{
	// We use quaternions here, so we don't have to adjust for euler angle range [ 0, 360 ]
	var localRotation = thisTransform.localRotation;
	var axisRotation = Quaternion.AngleAxis( localRotation.eulerAngles[ axis ], rotateAround );
	var angleFromMin = Quaternion.Angle( axisRotation, minQuaternion );
	var angleFromMax = Quaternion.Angle( axisRotation, maxQuaternion );
		
	if ( angleFromMin <= range && angleFromMax <= range )
		return; // within range
	else
	{		
		// Let's keep the current rotations around other axes and only
		// correct the axis that has fallen out of range.
		var euler = localRotation.eulerAngles;			
		if ( angleFromMin > angleFromMax )
			euler[ axis ] = maxQuaternion.eulerAngles[ axis ];
		else
			euler[ axis ] = minQuaternion.eulerAngles[ axis ];

		thisTransform.localEulerAngles = euler;		
	}
}

Avatar de l’utilisateur
Anterius
Messages : 13
Inscription : 07 Avr 2010 16:58
Localisation : PACA
Contact :

Re: Mouvement Sous-marin[Résolu]

Message par Anterius » 20 Avr 2010 17:53

merci Doliprane,

je l'avais deja celui-la et il ne marche pas avec mon script du sous-marin piloté a la souris...
en fait je parlais de ton code de départ, qui m'a l'air interressant, notamment l'application des forces, la suite quoi !
si tu peux bien entendu...

@++

Répondre

Revenir vers « Scripting »