2014-05-16 11 views
5

Vorrei ruotare un oggetto per affrontare un punto con cui ho un po 'di problemi.Ruota l'oggetto sul punto di fronte

Quindi sto iniziando con un oggetto che ha una base a zero ed è allineato sull'asse y.

enter image description here

desidero ruotarlo in modo che la parte superiore dell'oggetto sta affrontando la destinazione

enter image description here

mio processo finora è quello di: Dato all'asse A

  1. trovare la distanza tra la mia posizione e la mia posizione di sguardo: D
  2. creare un vettore di direzione: V = D.normalize()
  3. il giusto vettore: R = Una traversa D
  4. trovare il vettore per: U = D trasversale R
  5. trovare l'angolo tra la direzione e : angolo = acos (U (dot D)/(U.length * D.Length))
  6. ruotare di un angolo scalata per direzione su ciascun asse

qui è la rappresentazione codice di questo. Non sono sicuro di cosa sia esattamente sbagliato in questo ho lavorato su carta e, a mia conoscenza, questo approccio dovrebbe funzionare, ma i risultati sono completamente sbagliati quando vengono disegnati. Se qualcuno vede qualche difetto e potrebbe indicarmi la giusta direzione, sarebbe fantastico.

Vector3 distance = new Vector3(from.x, from.y, from.z).sub(to.x, to.y, to.z); 
    final Vector3 axis = new Vector3(0, 1, 0); 
    final Vector3 direction = distance.clone().normalize(); 

    final Vector3 right = (axis.clone().cross(direction)); 
    final Vector3 up = (distance.clone().cross(right)); 

    float angle = (float) Math.acos((up.dot(direction)/ (up.length() * direction.length()))); 
    bondObject.rotateLocal(angle, direction.x , direction.y, direction.z); 
+0

Penso che ci sia un problema con i tuoi calcoli. Nel passo 5 trovi l'angolo tra il vettore "su" e il vettore di direzione, ma questo angolo sarà sempre di 90 gradi. U = D incrocio R, quindi per definizione U è perpendicolare sia a D che a R, e il punto U del prodotto a punti D sarà sempre zero. Se puoi essere più specifico su ciò che stai cercando di ottenere, allora posso trovarti una formula migliore. – mikebolt

+0

Grazie per la risposta, sto provando a ruotare l'oggetto per affrontare un punto, quindi se il mio oggetto è a (0,0,0) e il punto è a (0,0,1) Voglio che il cilindro sia rivolto verso il basso l'asse z (il tubo che incapsula l'asse z). Ho provato a fornire un'immagine sopra, ma le mie abilità pittoriche sono carenti ^^ –

risposta

10

L'idea di base è la seguente.

  • Determinare in che modo l'oggetto sia rivolto: directionA
  • Determinare in che modo l'oggetto deve essere rivolto: directionB
  • determinare l'angolo tra le direzioni: rotationAngle
  • Determinare l'asse di rotazione: rotationAxis

Ecco il codice modificato.

Vector3 distance = new Vector3(from.x, from.y, from.z).sub(to.x, to.y, to.z); 

if (distance.length() < DISTANCE_EPSILON) 
{ 
    //exit - don't do any rotation 
    //distance is too small for rotation to be numerically stable 
} 

//Don't actually need to call normalize for directionA - just doing it to indicate 
//that this vector must be normalized. 
final Vector3 directionA = new Vector3(0, 1, 0).normalize(); 
final Vector3 directionB = distance.clone().normalize(); 

float rotationAngle = (float)Math.acos(directionA.dot(directionB)); 

if (Math.abs(rotationAngle) < ANGLE_EPSILON) 
{ 
    //exit - don't do any rotation 
    //angle is too small for rotation to be numerically stable 
} 

final Vector3 rotationAxis = directionA.clone().cross(directionB).normalize(); 

//rotate object about rotationAxis by rotationAngle 
+0

Grazie mille che ha funzionato perfettamente, prima prova! Non ho 15 rappresentanti, quindi non posso ancora votare la tua risposta, ma lo farò quando sarò in grado. –