2014-05-16 23 views
5

Chciałbym obrócić obiekt, aby zmierzyć się z punktem, z którym mam problem.Obróć obiekt do powierzchni punktu

Zaczynam od obiektu, który ma podstawę na zero i jest wyrównany na osi Y.

enter image description here

chciałbym go obrócić tak, aby jego górna obiektu stoi cel

enter image description here

Mój proces jakim jest: danej osi A

  1. znajdź odległość między moją pozycją a moją pozycją w wyglądzie: D
  2. utworzenia wektora kierunku V = D.normalize()
  3. znaleźć odpowiedni wektor: R = przekrój D
  4. znaleźć się wektor U = D przekrój R
  5. znaleźć kąt pomiędzy kierunkiem i : K = acos (dot D (U)/(U.length * D.length))
  6. obracać o kąt skalowane kierunku na każdej osi

tutaj jest reprezentacją, że kod. Nie jestem pewien, co dokładnie jest z tym nie tak, opracowałem to na papierze i według mojej wiedzy to podejście powinno działać, ale wyniki są całkowicie niepoprawne po narysowaniu. Jeśli ktokolwiek zauważy jakieś błędy i wskaże mi właściwy kierunek, będzie świetnie.

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

Myślę, że jest problem z matematyką. W kroku 5 znajduje się kąt pomiędzy wektorem "w górę" a wektorem kierunku, ale ten kąt zawsze będzie wynosił 90 stopni. U = D krzyż R, więc z definicji U jest prostopadła do D i R, a produkt kropki U kropka D zawsze będzie zero. Jeśli możesz dokładniej określić, co próbujesz osiągnąć, znajdę dla Ciebie lepszą formułę. – mikebolt

+0

Dziękuję za odpowiedź, próbuję obrócić obiekt, aby stawić czoła punktowi, więc jeśli mój obiekt jest na (0,0,0), a punkt jest na (0,0,1), chcę, aby walec był zakryty oś Z (rurka otaczająca oś Z). Próbowałem dostarczyć obrazek powyżej, ale moje umiejętności malarskie są zbyt małe ^^ –

Odpowiedz

10

Podstawowy pomysł tutaj jest następujący.

  • określić, które sposobem stoi obiekt: directionA
  • Określić w jaki sposób powinny być skierowane obiektu: directionB
  • określenia kąta pomiędzy tymi kierunkami: rotationAngle
  • wyznaczają oś obrotu: rotationAxis

Oto zmodyfikowany kod.

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

Dziękuję bardzo, że działało idealnie pierwsza próba! Nie mam 15 przedstawicieli, więc nie mogę głosować na twoją odpowiedź, ale będę, kiedy będę mógł. –