mauvaise somme de vecteurs:pourquoi?

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Kaloverian
Messages : 121
Inscription : 10 Août 2016 03:03

mauvaise somme de vecteurs:pourquoi?

Message par Kaloverian » 18 Mars 2020 15:20

bonjour,

Dans ce script C# en dessous, je crée une liste de vecteurs.A chaque fois que j'appuie sur la touche I, je rajoute dans cette liste le vecteur (2,0,2).
Cette liste contient en premier vecteur nul.
Le second de cette liste (0,0,2) est généré au lancement du jeu, avant d'appuyer sur la touche I
problème:
au second appui,le second objet généré prend la position (10,0,6) au lieu de
vecteur nul+(0,0,2)+(2,0,2)=(2,0,4):la somme dans cette liste n'est pas respectée.

Code : Tout sélectionner



using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class somme_position : MonoBehaviour
{
        int p = 0;
	
	public Mesh[] myMesh = new Mesh[10];
	public GameObject Objet1;
	Vector3 VSum = Vector3.zero;


	List<GameObject> ObjectList;
	
	List<Vector3> ListVecteurs;


	
	void Start()
	{
		
		ObjectList = new List<GameObject>();
		ObjectList.Add(Objet1);
		
		ListVecteurs = new List<Vector3>();

		ListVecteurs.Add(VSum);



		Vector3 V1 = new Vector3(0,0,,2);
		ListVecteurs.Add(V1);

		ObjectList[0].transform.position = ListVecteurs[1];



		
	}

	void Update()
	{

		



		if (Input.GetKeyDown(KeyCode.I))
		{
		    p++;
		
			ObjectList.Add(Objet1);
			ObjectList[p] = new GameObject("toto" + p);

			ListVecteurs.Add(new Vector3(2, 0, 2));

		[b]	foreach (Vector3 v in ListVecteurs)
			{
				VSum += v;
			}
[/b]
			ObjectList[p].transform.position = VSum;[b]//pas bonne valeur
[/b]
		

			ObjectList[p].AddComponent<MeshRenderer>();
			ObjectList[p].AddComponent<MeshFilter>().mesh = myMesh[p - 1];

		


		
		}
	}

}



D'où vient le problème?


merci de votre aide
Dernière édition par Kaloverian le 18 Mars 2020 15:44, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5292
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: mauvaise somme de vecteurs:pourquoi?

Message par boubouk50 » 18 Mars 2020 15:41

Salut,
Je vois déjà un problème de programmation au delà de l'algorithme:

Code : Tout sélectionner

Vector3 V1 = new Vector3(0,0,,2);
Tu dois avoir une erreur ici. 2 virgules à la suite.

Ensuite niveau algo, ben ton calcul est faux. VSum est dans ta liste donc il s'additionne chaque fois lui-même.
Tu n'auras pas
vecteur nul+(0,0,2)+(2,0,2)=(4,0,2) (qui devrait donner (2, 0, 4) d'ailleurs..)
mais une suite d'addition de VSum avec lui même:
VSum = VSum +(2, 0, 2) = (2, 0, 2)
VSum = VSum + (0, 0, 2) = (2, 0, 4)
VSum = VSum + VSum = (4, 0, 8)
Je ne tombe pas sur le même résultat, cela doit dépendre de l'ordre dans lequel est effectuée l'addition. Mais dans l'idée ce calcul est forcément faux.

Pourquoi additionner les Vecteurs? Tu peux simplement prendre le précédent (p-1) et lui ajouter le vecteur souhaité.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Kaloverian
Messages : 121
Inscription : 10 Août 2016 03:03

Re: mauvaise somme de vecteurs:pourquoi?

Message par Kaloverian » 18 Mars 2020 15:52

je ne saisis pas trop:
Y a-t-il moyen de modifier dans le code cette somme vectorielle pour avoir le bon résultat demandé?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5292
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: mauvaise somme de vecteurs:pourquoi?

Message par boubouk50 » 18 Mars 2020 16:37

Oui, sortir VSum de la liste (en plus au départ il vaut Vector3.zero donc il ne sert à rien).
Oui, ajouter le vecteur précédent au vecteur en cours plutôt que de boucler.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Kaloverian
Messages : 121
Inscription : 10 Août 2016 03:03

Re: mauvaise somme de vecteurs:pourquoi?

Message par Kaloverian » 18 Mars 2020 17:17

petit code?
(je n'y arrive pas !)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5292
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: mauvaise somme de vecteurs:pourquoi?

Message par boubouk50 » 18 Mars 2020 17:42

Désolé, mais ce n'est quand même pas difficile d'écrire une addition.
Si tu bloques dessus, je pense que tu devrais aller apprendre les bases de la programmation C# pour Unity. Il y a des cours sur OpenClassRoom ou les tutos officiels d'Unity Technologies (anglais).

Ce n'est pas pour te jeter la pierre, mais développer un jeu demande de réelles compétences en programmation, et tout apprentissage doit commencer avec les bases pas par de la bidouille. Unity est un moteur comme celui d'une voiture. Une personne formée sera plus efficace et apte qu'une bricoleur du dimanche ;)

Sinon, au delà de l'algorithme, il faut aussi apprendre à concevoir son programme, l'architecturer correctement. Là je te propose une correction mais pas forcément une bonne façon de faire.

Plus je lis ton code, moins je comprends la logique derrière, donc si tu veux que je t'aide à scripter tout ça, explique moi CLAIREMENT (je le mets en gros parce que j'ai l'habitude d'avoir des explications pas claires) ce que tu cherches à faire. As-tu besoin de récupérer ListVecteurs? (parce que tous les vecteurs sont identiques, donc pas utiles) Qu'est-ce qui est nécessaire dans ton code.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Kaloverian
Messages : 121
Inscription : 10 Août 2016 03:03

Re: mauvaise somme de vecteurs:pourquoi?

Message par Kaloverian » 18 Mars 2020 18:13

j'ai trouvé l'erreur(j'aurai du y penser)
Il fallait que je réinitialise Vsum à vecteur nul après le if


Code : Tout sélectionner



using System.Collections;
using System.Collections.Generic;
using UnityEngine;



public class somme_position : MonoBehaviour
{
        int p = 0;
	
	public Mesh[] myMesh = new Mesh[10];
	public GameObject Objet1;
	Vector3 VSum = Vector3.zero;


	List<GameObject> ObjectList;
	
	List<Vector3> ListVecteurs;


	
	void Start()
	{
		
		ObjectList = new List<GameObject>();
		ObjectList.Add(Objet1);
		
		ListVecteurs = new List<Vector3>();

		ListVecteurs.Add(VSum);



		Vector3 V1 = new Vector3(0,0,,2);
		ListVecteurs.Add(V1);

		ObjectList[0].transform.position = ListVecteurs[1];



		
	}

	void Update()
	{

		



		if (Input.GetKeyDown(KeyCode.I))
		{
		   
		        p++;
		       Vector3 VSum = Vector3.zero;
			ObjectList.Add(Objet1);
			ObjectList[p] = new GameObject("toto" + p);

			ListVecteurs.Add(new Vector3(2, 0, 2));

			foreach (Vector3 v in ListVecteurs)
			{
				VSum += v;
			}

			ObjectList[p].transform.position = VSum; //bonne valeur maintenant

		

			ObjectList[p].AddComponent<MeshRenderer>();
			ObjectList[p].AddComponent<MeshFilter>().mesh = myMesh[p - 1];

		


		
		}
	}

}




Répondre

Revenir vers « (C#) CSharp »