J'essaye de scripter un twist infini entre deux éléments et je me heurt à un problème avec les quaternions. J'ai fait pas mal de recherche sur internet, mais je n'arrive pas à trouver la solution...
J'ai donc un élément de début et de fin qui doivent contrôler tous les intermédiaires en rotation. Tant que la valeur de weight sur la rotation est supérieur à 0.5 je n'ai pas le problème. Mais en dessous, j'ai des flips. Je sais que les quaternions fonctionnent entre -180/180°, mais du coup, je ne sais pas trop comment faire autrement.
J'ai aussi avec un slerp classique et un SlerpUnclamped mais ça ne fonctionne pas. J'ai aussi essayé différent truc, mais sans succés pour le moment.
Si jamais vous avez des solutions, je suis très intéresse
Voila un script de test.
Code : Tout sélectionner
using System.Collections.Generic;
using UnityEngine;
public class QuaternionTest : MonoBehaviour {
[SerializeField]
private int numObject = 10;
[SerializeField]
private float startRotation = 0.0f;
[SerializeField]
private float endRotation = 0.0f;
private GameObject startObject;
private GameObject endObject;
private List<GameObject> inBetweenObject = new List<GameObject>();
void Start()
{
startObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
endObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
endObject.transform.position = new Vector3(numObject, 0.0f, 0.0f);
for (int i = 1; i < numObject; i++)
{
GameObject newCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
newCube.transform.position = new Vector3(1.0f * i, 0.0f, 0.0f);
inBetweenObject.Add(newCube);
}
}
void Update () {
startObject.transform.localRotation = Quaternion.AngleAxis(endRotation, Vector3.right);
endObject.transform.localRotation = Quaternion.AngleAxis(startRotation, Vector3.right);
float weightStep = 1.0f / (inBetweenObject.Count + 1);
for (int i = 0; i < inBetweenObject.Count; i++)
{
float weight = weightStep * (i + 1);
inBetweenObject[i].transform.localRotation = Quaternion.SlerpUnclamped(startObject.transform.localRotation, endObject.transform.localRotation, weight);// startObject.transform.localRotation;
}
}
}