samedi 30 mai 2015

Cylinder anhand eines Vektors ausrichten (Java3d)

Hey Leuts,

ich versuche momentan mit Java3d einen Zylinder anhand eines Vectors auszurichten (also den Vector darzustellen). Letztendlich denke ich dass ich alles richtig gemacht habe, um den Cylinder in die richtige Position zu rotieren. Ich benutze hierfür ein AxisAngle4d um die Rotation zu setzten (Im Code versteht man mein gerede :D ). Da sich der Vector bewegt habe ich immer zwei Vektoren (Vektor vorher und Vektor nachher) bei denen ich durch das Kreuzprodukt die Rotationsachse festlege und mit dem Winkel zwischen ihnen die Rotation bestimme. Die Berechnungen stimmen soweit (habe mir das AxisAngle4d anzeigen lassen), die ausgeführte Rotation hingegen nicht, die Cylinder drehen sich meist viel zu wenig und auch nicht in die richitge Richtung). Anscheinend hab ich einen Denkfehler beim Rotieren gemacht...

Java Code:

  1.  
  2. //Returns rotation axis and rotation angle
  3. public AxisAngle4d getRotation(Vector3d start, Vector3d target)
  4. {
  5. //Get rotation axis
  6. Vector3d cross=new Vector3d();
  7. // TODO: Catch small angles (ignore cross product)
  8. cross.cross(start,target);
  9.  
  10. //Get rotation angle between start and target
  11. double angle=start.angle(target);
  12.  
  13. //Create AxisAngle4f with rotation axis and angle parameters
  14. AxisAngle4d rot = new AxisAngle4d(cross,angle);
  15.  
  16. //Test
  17. System.out.println("Rot: "+rot);
  18.  
  19. //return rotation parameters
  20. return rot;
  21. }
  22.  
  23. //Rotates arrow to target vector
  24. public void rotate(TransformGroup object,Vector3d startVector,Vector3d targetVector)
  25. {
  26. //TODO: Always reset rotation to 0?
  27. //new Transform3D containing rotation information
  28. Transform3D rotator = new Transform3D();
  29. //Set rotation so it will rotate to targetVector
  30. rotator.setRotation(getRotation(startVector,targetVector));
  31. //get previous rotation and copy into temp
  32. Transform3D temp3d = new Transform3D();
  33. object.getTransform(temp3d);
  34. //combine two rotations
  35. temp3d.mul(rotator);
  36. //Set Transform to new rotation
  37. object.setTransform(temp3d);
  38.  
  39. }
  40.  
  41. //perform Rotations after update
  42. public void updateRotation()
  43. {
  44. //call rotator for each arrow
  45. rotate(axisArrowX,this.temp_satOrientationX,this.satOrientationX);
  46. rotate(axisArrowY,this.temp_satOrientationY,this.satOrientationY);
  47. rotate(axisArrowZ,this.temp_satOrientationZ,this.satOrientationZ);
  48. }


Vielen Dank für Hinweise! Tom


Cylinder anhand eines Vektors ausrichten (Java3d)

0 commentaires:

Enregistrer un commentaire