Page 1 sur 1

problème mathématique

Publié : 19 Mai 2021 01:35
par Kaloverian
bonjour,

Avec ce script basique,j'exerce un mouvement circulaire sur un objet.

Code : Tout sélectionner

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

//ça saute dès changement de vitesse(le mouvement circulaire n'est pas continu)!

public class essai : MonoBehaviour {

	public GameObject obj;
	public Text speedText;
	public float rayonl,acceleration1;
	float TimeCounter,vitesse;
	
	public KeyCode accel1;



	public KeyCode decel1;

	// Use this for initializationTimeCounter);
	void Start () {
		
		vitesse=0;
	
	}

	// Update is called once per frame
	void Update () {

		print ("vitesse" + vitesse);

		speedText.text ="vitesse: "+vitesse.ToString("N")+ " km/h";

		TimeCounter+=Time.deltaTime;


		if (Input.GetKeyDown(accel1))
		{ vitesse += acceleration1; }

	
		if (Input.GetKeyDown(decel1))
		{ vitesse-= acceleration1; }

	
		float x = rayon * Mathf.Sin (vitesse * TimeCounter);//l'argument de Mathf.Sin est  en radians
		float y = 0;
		float z = rayon * Mathf.Cos (vitesse * TimeCounter);//l'argument de Mathf.Cos est en radians

               obj.transform.position=new Vector3(x,y,z);
	

	}
}



par appui d'une touche,j'incrémente ou décrémente la vitesse angulaire de rotation.

problème mathématique:
A chaque incrémentation,l'objet saute(change de position brutalement sur sa même orbite circulaire) au cours de son mouvement:le mouvement n'est pas continu bien que circulaire.
Bien que mathématicien,je n'arrive à résoudre ce problème(ça ne doit plus sauter!)

Quelqu'un peut-il le résoudre?


merci de votre aide

Re: problème mathématique

Publié : 19 Mai 2021 08:33
par Max
bonjour,
Kaloverian a écrit :
19 Mai 2021 01:35
problème mathématique:
A chaque incrémentation,l'objet saute(change de position brutalement sur sa même orbite circulaire) au cours de son mouvement:le mouvement n'est pas continu bien que circulaire.
Bien que mathématicien,je n'arrive à résoudre ce problème(ça ne doit plus sauter!)
c'est tout à fait normal.
A chaque appui tu augmentes (ou diminues) la valeur de vitesse du facteur TimeCounter (qui augmente d'ailleurs de façon démesuré au fil des secondes vu que l'incrémentation se fait dans l'Update), et comme tu fais un calcul de position absolue dans l'espace word, forcément qu'au moment du prochain calcul de x et z tu auras une position assez aléatoire sur le cercle trigo lié à la nouvelle valeur de vitesse * TimeCounter.

PS: sinon tu peux regarder du coté de Transform.RotateAround, qui fait ce que tu cherche à faire.

Re: problème mathématique

Publié : 19 Mai 2021 17:12
par Kaloverian
oui mais admettons dans le cas général que la représentation paramétrique ne soit pas un cercle (par exemple,une ellipse)?
A mon avis,c'est un problème de déphasage
Je dois introduire dans l'argument de Mathf.Cos et Mathf.Sin une phase qui dépend de quelque chose mais quelle doit être l'expression précise de ce quelque chose pour que ça ne "saute" pas?

Re: problème mathématique

Publié : 19 Mai 2021 17:34
par Max
Pour que ton objet parcourt sa trajectoire, l'angle doit changer lors de chaque frame pour obtenir un changement de position cohérent (x et z).
si tu veux que la vitesse varie, il faut jouer sur une augmention (ou de diminution) de cette valeur angulaire par frame, mais dans les bonnes proportions. Quand tu joues sur l'incrémentation avec pour facteur TimeCounter+=Time.deltaTime;, il va gonfler toute les secondes, résultat la valeur en radians pour les Sin/Cos ( vitesse * TimeCounter ) va prendre des valeurs qui n'ont plus de sens sur le plan angulaire.

A la limite, tu pourrais écrire quelque chose comme:

Code : Tout sélectionner

        if (Input.GetKeyDown(accel1))
        {
            speed += Time.deltaTime;
        }
        if (Input.GetKeyDown(decel1))
        {
            speed -= Time.deltaTime;
        }
        // speed de 1 à 10 max, après tester pour les bonnes bornes
        angle += Time.deltaTime * speed;

        float x = rayon * Mathf.Sin(angle);
        float y = 0;
        float z = rayon * Mathf.Cos(angle);

        transform.position = new Vector3(x, y, z);
        

Re: problème mathématique

Publié : 19 Mai 2021 23:59
par Kaloverian
merci bien !