Problème de spline cubique linéaire
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Problème de spline cubique linéaire



  1. #1
    acropole

    Problème de spline cubique linéaire


    ------

    Bonjour,

    Dans l’algorithme qui suit (en C#) je calcule une spline cubique afin de déterminer la position d'un objet au cours du temps en fonction de 4 vecteurs. Ces vecteurs sont calculés sur un serveur qui envoi le résultat au client.
    Tout fonctionne a merveille sauf quand l'objet se déplace sur une ligne. Dans ce cas là le serveur n'envoi plus les nouvelles positions puisse que le chemin est une droite a vitesse constante. Mais du coup l'objet ralentit.

    Code PHP:
    // List of vectors used to calculate curve
        
    private List<Vector3m_Positions = new List<Vector3>() { Vector3.zeroVector3.zeroVector3.zero };
        public List<
    Vector3Positions
        
    {
            
    get
            
    {
                return 
    m_Positions;
            }
            
    set
            
    {
                
    m_Positions value;
            }
        }
    // Times when a new vector is received. Each one is the time for the above corresponding vector.
        
    private List<floatm_LocalTime = new List<float>() { 0.0f0.0f0.0f0.0f };
        public List<
    floatLocalTime
        
    {
            
    get
            
    {
                return 
    m_LocalTime;
            }
            
    set
            
    {
                
    m_LocalTime value;
            }
        }
    // Curve constants
        
    float[,] = new float[3,4]{
                        { 
    0.0f0.0f0.0f0.0f }, // X
                        
    0.0f0.0f0.0f0.0f }, // Y
                        
    0.0f0.0f0.0f0.0f }  // Z
                    
    };
    // Calculating new curve constants every times a new position is recieved
        
    public void SetPolynomial(Vector3 v0Vector3 v1Vector3 v2Vector3 v3)
        {
             for (
    int i 03i++)
            {
                
    P[i0] = v3[i] - 3.0f v2[i] + 3.0f v1[i] - v0[i]; // a
                
    P[i1] = 3.0f v2[i] - 6.0f v1[i] + 3.0f v0[i]; // b
                
    P[i2] = 3.0f v1[i] - 3.0f v0[i]; // c
                
    P[i3] = v0[i]; // d
            
    }

        }
    // get one position's float (x, y or z)
        
    private float GetPosition(float timeint axis)
        {
            return
                
    P[axis0] * Mathf.Pow(time3)
                + 
    P[axis1] * Mathf.Pow(time2)
                + 
    P[axis2] * time
                
    P[axis3];
        }
    // get position vector
        
    public Vector3 GetPosition(float delaTime)
        {
            
    Vector3 position = new Vector3();
     
            
    position.GetPosition(delaTime0);
            
    position.GetPosition(delaTime1);
            
    position.GetPosition(delaTime2);
     
            return 
    position;
        }
     
    // get position vector with time set to current delta time from first vector
        
    public Vector3 GetPosition()
        {
            
    float delaTime Time.time LocalTime[0];
            return 
    GetPosition(delaTime);
        }
     
    // add a new position and recalculate the spline
        
    public void Add(Vector3 position)
        {
            
    float
                time 
    Time.time,
                
    deltaTime time LocalTime[1];
     
            
    SetPolynomial(Positions[0], Positions[1], Positions[2], position);
            
    Positions.RemoveAt(0);
            
    Positions.Add(position);
     
            
    LocalTime.RemoveAt(0);
            
    LocalTime.Add(time);
     
            return;
    }
     
    // Apply position in Update
    transform.localPosition Path.GetPosition(); 
    Code PHP:
    // Server update. Only send updates when velocity changes
        
    public void FixedUpdate()
        {
            if (
    uLink.Network.isServer)
            {
                
    LastUpdate++;
                if (
    LastUpdate >= Path.UpdateRate// don't send all the time, save bandwidth
                
    {
                    
    // Only send required data
                    
    bool
                        accelerate 
    rigidbody.velocity != CurrentSpeed,
                        
    rotate rigidbody.angularVelocity != AngularVelocity;
     
                    if (
    accelerate && rotate)
                        
    NetworkView.RPC("ServerSendPhysics"uLink.RPCMode.Otherstransform.localPositiontransform.localRotation);
                    else if (
    accelerate)
                        
    NetworkView.RPC("ServerSendPosition"uLink.RPCMode.Otherstransform.localPosition);
                    else if (
    rotate)
                    {
                        if (
    Pawn.Controller.PlayerInput.MouseDelta != Vector2.zero)
                            
    NetworkView.RPC("ServerSendRotation"uLink.RPCMode.Otherstransform.localRotation);
                        else 
    NetworkView.RPC("ServerStopRotation"uLink.RPCMode.Otherstransform.localRotation);
                    }
                    
    LastUpdate 0;
                    
    CurrentSpeed rigidbody.velocity;
                    
    AngularVelocity rigidbody.angularVelocity;
                }
            } 

    -----
    Dernière modification par acropole ; 21/07/2013 à 08h15.

  2. #2
    Dlzlogic

    Re : Problème de spline cubique linéaire

    Bonjour,
    C'est le code, pas l'algorithme, que vous avez envoyé.
    C'est la première fois que je vois du C#, c'est assez inattendu.
    Si j'ai bien compris, si seul un de vecteurs correspondant au déplacement n'est pas nul, alors, le résultat n'est pas celui que l'on attend.
    J'avoue que je n'ai pas lu votre code, mais je me demande si ce phénomène n'est pas dû à une comparaison à 0.0.
    Il faut se rappeler que la comparaison de deux réels avec "==" ou "!=" est à éviter à tout prix. il faut faire une comparaison avec une valeur très petite.

  3. #3
    acropole

    Re : Problème de spline cubique linéaire

    Ce que je ne comprend pas avec ces spline cubiques c'est que si j'avance d'un mètre en une seconde j'avance de moins d'un demi mètre en une demi seconde.

  4. #4
    acropole

    Re : Problème de spline cubique linéaire

    J'ai compris. En fait ma courbe est une courbe 100% spatiale. Peu importe que deux position soient reçues a 1 seconde ou 1 minute d’intervalle, la courbe reste la même.

  5. A voir en vidéo sur Futura
  6. #5
    Dlzlogic

    Re : Problème de spline cubique linéaire

    Bonjour,
    Si vous voulez que j'essaye de vous aider, il faut me donner un peu plus de détails.
    Sauf erreur, une spline est une ligne représentative d'une fonction, du 3è degré dans votre cas, qui satisfait la position de 4 points dans votre cas.
    Or vous parlez de vitesse, donc de distance entre 2 positions successives. Est-ce une distance "la plus courte" ou suivant la courbe ?
    Manifestement vous travaillez en trois dimensions, ça complique un peu plus les choses.

Discussions similaires

  1. Interpolation Polynomiale et spline quadratique
    Par justind1989 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 22/04/2013, 09h48
  2. Réponses: 2
    Dernier message: 29/11/2012, 13h25
  3. Matlab : spline
    Par invite7f58f807 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 31/01/2011, 00h16
  4. Interpolation de valeurs expérimentales (spline?)
    Par inviteb54da63f dans le forum Mathématiques du supérieur
    Réponses: 8
    Dernier message: 27/04/2010, 10h36
  5. Spline
    Par invite769a1844 dans le forum Mathématiques du supérieur
    Réponses: 7
    Dernier message: 10/01/2008, 13h28