Cylinder anhand eines Vektors ausrichten (Java3d)

Movie85

Mitglied
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...

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
 

Neue Themen


Zurück
Oben