samedi 30 mai 2015
Cylinder anhand eines Vektors ausrichten (Java3d)
Posted on 05:53 by verona
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...
Vielen Dank für Hinweise! Tom
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:
-
-
//Returns rotation axis and rotation angle
-
public AxisAngle4d getRotation(Vector3d start, Vector3d target)
-
{
-
//Get rotation axis
-
Vector3d cross=new Vector3d();
-
// TODO: Catch small angles (ignore cross product)
-
cross.cross(start,target);
-
-
//Get rotation angle between start and target
-
double angle=start.angle(target);
-
-
//Create AxisAngle4f with rotation axis and angle parameters
-
AxisAngle4d rot = new AxisAngle4d(cross,angle);
-
-
//Test
-
-
//return rotation parameters
-
return rot;
-
}
-
-
//Rotates arrow to target vector
-
public void rotate(TransformGroup object,Vector3d startVector,Vector3d targetVector)
-
{
-
//TODO: Always reset rotation to 0?
-
//new Transform3D containing rotation information
-
Transform3D rotator = new Transform3D();
-
//Set rotation so it will rotate to targetVector
-
rotator.setRotation(getRotation(startVector,targetVector));
-
//get previous rotation and copy into temp
-
Transform3D temp3d = new Transform3D();
-
object.getTransform(temp3d);
-
//combine two rotations
-
temp3d.mul(rotator);
-
//Set Transform to new rotation
-
object.setTransform(temp3d);
-
-
}
-
-
//perform Rotations after update
-
public void updateRotation()
-
{
-
//call rotator for each arrow
-
rotate(axisArrowX,this.temp_satOrientationX,this.satOrientationX);
-
rotate(axisArrowY,this.temp_satOrientationY,this.satOrientationY);
-
rotate(axisArrowZ,this.temp_satOrientationZ,this.satOrientationZ);
-
}
Vielen Dank für Hinweise! Tom
Cylinder anhand eines Vektors ausrichten (Java3d)
Inscription à :
Publier les commentaires (Atom)
0 commentaires:
Enregistrer un commentaire