Bouger des Bones via script

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
CorVuS
Messages : 56
Inscription : 25 Avr 2013 13:49

Bouger des Bones via script

Message par CorVuS » 30 Avr 2013 15:58

Bon alors mon projet a pas mal avancer (en attendant l’électronique) j'ai emmagasiner pas mal d'infos et tester beaucoup beaucoup de chose mais la je bloque... Surement par manque de connaissance des bases du C#. Le but est je le rappelle de bouger un perso en fonction des valeur d'angles que je donne a ses articulations.

Je vais pas tout mettre le code mais juste ce qui est important et décrire le reste.

Pour commencer j'ai déclaré tout mes bones en Transform, la Methodes qui s'appelle MapBones() me rentre les bones déclaré dans un tableau (les lies après en drag and drop avec les bones du perso)

Code : Tout sélectionner

	void Start(){
		// !!!! A faire !!!!: Mapping des articulationsIRL au depart
		bones = new Transform[ARRAYLENGTH];
		initialDirections = new Quaternion[ARRAYLENGTH];
		boneDirections = new Quaternion[ARRAYLENGTH];
		
		MapBones();
		GetInitialDirections();
	}
ensuite viennent différentes methodes

Code : Tout sélectionner

	void GetInitialDirections() {  // Initialise les directions de Bones (voir pour un reset)
		for(int i = 0 ; i < bones.Length ; i++) {
			initialDirections[i] = bones[i].localRotation; // Envoie la position actuel pour initialisation 
			boneDirections[i] = bones[i].localRotation;	// Retient la position actuel
		}
	}
			 
	void UpdateDirections() { // Mets a jours la direction des bones après une rotation
		for(int i = 0; i < bones.Length; i++) {
			boneDirections[i] = bones[i].localRotation;
		}
	}
	
		
	void RotateJoint(int bone, float angle) { // effectue la rotation puis envoi vers la mise a jours de la direction du bones
		if(bones[bone] != null) {
			Quaternion target = Quaternion.Euler(0, 0, angle); // Definie l'angle cible (sur Z)
			bones[bone].localRotation = target * boneDirections[bone]; // Effectue la rotation
			UpdateDirections(); // Envoie vers la mise a jours du Bones
		}
	}
Je teste le tout avec une méthodes Update qui me change la valeur d'angle d'un des bones (en l’occurrence le 2 qui est la nuque) quand je presse un touche suivit d'un print qui me sert parfois pendant les teste.

Code : Tout sélectionner

	void Update(){
		if(Input.GetKey ("a") == true){ //Teste
		RotateJoint(2,50);
		print ("rotation effectué");
		}

	}
Le problème est que ca va pas :roll: j'ai un message d'erreur au lancement:
NullReferenceException: Object reference not set to an instance of an object
Pantin.GetInitialDirections () (at Assets/Scripts/Pantin.cs:127)
Pantin.Start () (at Assets/Scripts/Pantin.cs:53)
qui me cible la méthodes GetInitialDirections () a la ligne "initialDirections = bones.localRotation;"

Si je passe outre et que j'appuie sur la touche A, la nuque pivote bien comme demandé mais une fois seulement après vient une autre erreur qui me cible cette ligne "boneDirections = bones.localRotation;"

Pas sorcier de comprendre qu'il y a un problème dans les tableau qui stock les données quelque part la dedans

Code : Tout sélectionner

	private Transform[] bones; // Tableau de stockage des Bones
	
	 
	private Quaternion[] initialDirections; // Stock les directions initiale des Bones (pour un eventuel reset)
	private Quaternion[] boneDirections; // Stock les directions des Bones
	private int ARRAYLENGTH = 3;
	
	void Start(){
		// !!!! A faire !!!!: Mapping des articulationsIRL au depart
		bones = new Transform[ARRAYLENGTH];
		initialDirections = new Quaternion[ARRAYLENGTH];
		boneDirections = new Quaternion[ARRAYLENGTH];
		
		MapBones();
		GetInitialDirections();
	}
Mais j'ai beau cherche je trouve rien... y aura t il une âme charitable pour me démêler la situation ?

Pour information le code est pas de moi je me suis grandement inspiré de ca http://answers.unity3d.com/questions/43 ... as-in.html

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Bouger des Bones via script

Message par cayou66 » 30 Avr 2013 16:16

Salut,
que fait la fonction "MapBones();" ?
Il semblerait que le tableau bones ne contienne pas de valeur, ou pas assez, même si tu initialises correctement la taille, si le tableau est partiellement remplit, ça ne marchera pas.

CorVuS
Messages : 56
Inscription : 25 Avr 2013 13:49

Re: Bouger des Bones via script

Message par CorVuS » 30 Avr 2013 16:30

MapBones() me sert a remplir le array bones avec les variables Transform représentant tout mes bones et declaré au début (genre: public Transform Head;). Comme ca je drag and drop mes bones de la hiérarchie dans les variables c'est plus simple.

En effet les variables ne sont pas toute déclaré (je voulais juste testé le code avec deux ou trois mouvement), j’espère que c'est ça.

Je teste en remplissant tout ca.

CorVuS
Messages : 56
Inscription : 25 Avr 2013 13:49

Re: Bouger des Bones via script

Message par CorVuS » 30 Avr 2013 23:10

Bon ca marchait mais en signalant des problèmes dans tout les sens, j'ai simplifié au max

J'ai mis de coter le stockage des donner quaternion dans un tableau pour le moment. La fonction de base marche on va partir de la et augmenter les "options" au fur et a mesure.

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Bouger des Bones via script

Message par cayou66 » 01 Mai 2013 02:53

Bon courage à vous !

Répondre

Revenir vers « Scripting »