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 ). 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 ). 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:
//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
System.out.println("Rot: "+rot);
//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