problème mathématique

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
Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

problème mathématique

Message par Kaloverian » 19 Mai 2021 01:35

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

Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

Re: problème mathématique

Message par Max » 19 Mai 2021 08:33

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.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: problème mathématique

Message par Kaloverian » 19 Mai 2021 17:12

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?

Avatar de l’utilisateur
Max
Messages : 8765
Inscription : 30 Juil 2011 13:57
Contact :

Re: problème mathématique

Message par Max » 19 Mai 2021 17:34

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);
        
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: problème mathématique

Message par Kaloverian » 19 Mai 2021 23:59

merci bien !

Répondre

Revenir vers « (C#) CSharp »