[DB-AL] Rotation avancée

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
Archimage77
Messages : 7
Inscription : 05 Mai 2014 19:37

[DB-AL] Rotation avancée

Message par Archimage77 » 16 Nov 2017 01:10

Bonjour,
j'aurais besoin de votre aide sur un problème de rotation sur un seul axe.
J'ai fais pas mal de jeu sur Unity mais uniquement en 2D et il s'agit la de mon premier jeu 3D.
Le but est de faire tourné une roue (qui est face à la caméra) en faisant un cercle avec un seul doigt (horaire ou anti-horaire).

Voici la roue en question :
Image

J'ai trouvé un post sur le forum officiel d'Unity qui reproduit exactement ce que je veux faire mais c'est pour de la 2D : Voici le post : https://answers.unity.com/questions/952 ... -drag.html.
J'ai donc adapté pour de la 3D et ça marche plutôt pas mal. Il me reste un seul bug que je n'arrive pas à déniché.

Voici mon code :

Code : Tout sélectionner

using Lean.Touch;
using System.Collections.Generic;
using UnityEngine;

public class TestTouch : MonoBehaviour
{
	private float OriginalRotAng = 0;
	private float OriginalTouchAng = 0;

	private void FingerDown(LeanFinger finger)
	{
		float angle = 0;
		Vector3 axis;
		transform.rotation.ToAngleAxis(out angle, out axis);
		OriginalRotAng = angle;
		Vector3 SpinnerScreenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
		SpinnerScreenPoint = (finger.ScreenPosition - (Vector2)SpinnerScreenPoint);
		OriginalTouchAng = Mathf.Atan2(SpinnerScreenPoint.y, SpinnerScreenPoint.x) * Mathf.Rad2Deg - 90;
	}

	private void OnGesture(List<LeanFinger> fingers)
	{
		Vector3 SpinnerScreenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
		SpinnerScreenPoint = (fingers[0].ScreenPosition - (Vector2)SpinnerScreenPoint);
		float newRot = Mathf.Atan2(SpinnerScreenPoint.y, SpinnerScreenPoint.x) * Mathf.Rad2Deg - 90;

		float RotationAngle = OriginalRotAng + newRot - OriginalTouchAng;
		Rotate(RotationAngle);
	}

	private void Rotate(float RotationAngle)
	{
		transform.rotation = Quaternion.AngleAxis(RotationAngle, Vector3.left);
	}
}
(j'utilise le plugin LeanTouch pour géré la gestion souris/touch mais ça ne nous intéresse pas ici)

Le problème est le suivant : lors du "FingerDown" il arrive que dans certain angle de la roue, un saut de la roue ce produit (rotation non désiré), en réalité je vois mon axe X qui passe de positif à négatif ou de négatif à positif.
Je ne comprend pas pourquoi et j'avoue être totalement bloqué.

Si vous auriez une piste de recherche, je suis preneur.
Merci beaucoup par avance

Répondre

Revenir vers « (C#) CSharp »