Hallo!
Ich versuche eine Kugel mit PickMouseBehavior und PositionInterpolator durch die Scene zu bewegen. Wenn ich mit der Maus auf die Kugel klicke, dann soll sie sich per Animation (PositionInterpolator) bewegen. Ich habe den PositionInterpolator mit den dazu gehörigen Details (Alpha, Transform3D und TransformGroup) erstellt. Für sich alleine funktioniert er auch gut. Stelle ich die Startzeit von Alpha auf 0 und lasse das ganze laufen, so bewegt sich die Kugel schön weich durch die Szene.
Übergebe ich das Alpha Objekt nun meinem PickMouseBehavior, und setze die Startzeit per setStartTime auf den Zeitpunkt, wo der Mausklick auf die Kugel erfolgte, so bewegt sich die Kugel zwar, es ruckelt aber fürchterlich.
Ich kann mir das absolut nicht erklären. habt ihr eine Idee? Hier ist mal der Source Code:
Gruß
Maik
Ich versuche eine Kugel mit PickMouseBehavior und PositionInterpolator durch die Scene zu bewegen. Wenn ich mit der Maus auf die Kugel klicke, dann soll sie sich per Animation (PositionInterpolator) bewegen. Ich habe den PositionInterpolator mit den dazu gehörigen Details (Alpha, Transform3D und TransformGroup) erstellt. Für sich alleine funktioniert er auch gut. Stelle ich die Startzeit von Alpha auf 0 und lasse das ganze laufen, so bewegt sich die Kugel schön weich durch die Szene.
Übergebe ich das Alpha Objekt nun meinem PickMouseBehavior, und setze die Startzeit per setStartTime auf den Zeitpunkt, wo der Mausklick auf die Kugel erfolgte, so bewegt sich die Kugel zwar, es ruckelt aber fürchterlich.
Ich kann mir das absolut nicht erklären. habt ihr eine Idee? Hier ist mal der Source Code:
Code:
import javax.media.j3d.Alpha;
import javax.media.j3d.AmbientLight;
import javax.media.j3d.Appearance;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.DirectionalLight;
import javax.media.j3d.Material;
import javax.media.j3d.PositionInterpolator;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class PickTestMain extends JFrame
{
//Der Canvas, auf den gezeichnet wird.
public Canvas3D myCanvas3D;
public PickTestMain()
{
//Mechanismus zum Schliessen des Fensters und beenden des Programms
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Standardeinstellung fuer das Betrachteruniversum
myCanvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
//Aufbau des SimpleUniverse:
//Zuerst Erzeugen zusammen mit dem Canvas
SimpleUniverse simpUniv = new SimpleUniverse(myCanvas3D);
//Standardpositionierung des Betrachters
simpUniv.getViewingPlatform().setNominalViewingTransform();
//Die Szene wird in dieser Methode erzeugt.
createSceneGraph(simpUniv);
//Hinzufuegen von Licht
addLight(simpUniv);
//Hierdurch kann man mit der Maus den Betrachterstandpunkt veraendern
OrbitBehavior ob = new OrbitBehavior(myCanvas3D);
ob.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE));
simpUniv.getViewingPlatform().setViewPlatformBehavior(ob);
//Darstellung des Canvas/Fensters:
setTitle("PickTest");
setSize(700,700);
getContentPane().add("Center", myCanvas3D);
setVisible(true);
}
// In dieser Methode werden die Objekte der Szene aufgebaut und dem
//SimpleUniverse su hinzugefuegt.
public void createSceneGraph(SimpleUniverse su)
{
// Bounding Sphere angeben
BoundingSphere bs = new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE);
// Erzeugen Kugel und ihrer Transformationsgruppe
Color3f ambientColourBSphere = new Color3f(0.0f,0.0f,0.0f);
Color3f emissiveColourBSphere = new Color3f(0.1f,0.1f,0.1f);
Color3f diffuseColourBSphere = new Color3f(0.1f,0.1f,0.1f);
Color3f specularColourBSphere = new Color3f(0.1f,0.1f,0.1f);
float shininessBSphere = 2.0f;
Appearance app = new Appearance();
app.setMaterial(new Material(ambientColourBSphere,emissiveColourBSphere,
diffuseColourBSphere,specularColourBSphere,shininessBSphere));
Sphere ball = new Sphere(0.2f,app);
ball.setUserData("ball");
// Transformationsgruppe für die Kugel
Transform3D tfBall = new Transform3D();
tfBall.setTranslation(new Vector3d(0.0, 0.0, -10.0));
TransformGroup tgBall = new TransformGroup(tfBall);
tgBall.addChild(ball);
// Erzeugen der Animation der Kugel
Transform3D ballAxisAnimation = new Transform3D();
Transform3D rotationBall = new Transform3D();
rotationBall.rotX(Math.PI/2);
ballAxisAnimation.mul(rotationBall);
TransformGroup ballOnFlyingAxis = new TransformGroup(ballAxisAnimation);
ballOnFlyingAxis.addChild(tgBall);
int startTime_ball = Integer.MAX_VALUE;
int v_ball = 90000;
int a_ball = 10;
Alpha aPos = new Alpha(1,
Alpha.INCREASING_ENABLE + Alpha.DECREASING_ENABLE,
startTime_ball,
0,
v_ball,
a_ball,
0,
0,
0,
0);
PositionInterpolator pi = new PositionInterpolator(aPos, ballOnFlyingAxis, ballAxisAnimation, -5.0f, 5.0f);
pi.setSchedulingBounds(bs);
ballOnFlyingAxis.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
ballOnFlyingAxis.addChild(pi);
// Erzeuge den Szenengraphen
BranchGroup theScene = new BranchGroup();
// Definiere das PickingBehaviour, das verwendet werden soll, und fuege es zur Szene.
myPickMouseBehavior mpmb = new myPickMouseBehavior(myCanvas3D, theScene, bs, aPos);
theScene.addChild(mpmb);
theScene.addChild(ballOnFlyingAxis);
theScene.compile();
//Hinzufuegen der Szene
su.addBranchGraph(theScene);
}
//Hier wird etwas Licht zu der Szene hinzugefuegt.
public void addLight(SimpleUniverse su)
{
BranchGroup bgLight = new BranchGroup();
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE);
//Direktionales Licht
Color3f lightColour1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lightDir1 = new Vector3f(-1.0f,0.0f,-0.5f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds);
bgLight.addChild(light1);
//Streulicht
Color3f lightColourAmb = new Color3f(0.5f, 0.5f, 0.5f);
AmbientLight lightAmb = new AmbientLight(lightColourAmb);
lightAmb.setInfluencingBounds(bounds);
bgLight.addChild(lightAmb);
su.addBranchGraph(bgLight);
}
public static void main(String[] args)
{
PickTestMain ptm = new PickTestMain();
}
}
Code:
import javax.media.j3d.Alpha;
import javax.media.j3d.Bounds;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import com.sun.j3d.utils.geometry.Primitive;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.picking.behaviors.PickMouseBehavior;
public class myPickMouseBehavior extends PickMouseBehavior
{
public Alpha alpha;
public myPickMouseBehavior(Canvas3D pCanvas, BranchGroup root, Bounds pBounds, Alpha a)
{
super(pCanvas,root,pBounds);
setSchedulingBounds(pBounds);
alpha = a;
}
//Definition der Reaktion, wenn etwas ausgewaehlt wurde.
public void updateScene(int xpos, int ypos)
{
Primitive pickedShape = null;
pickCanvas.setShapeLocation(xpos,ypos);
PickResult pResult = pickCanvas.pickClosest();
if (pResult != null)
{
pickedShape = (Primitive) pResult.getNode(PickResult.PRIMITIVE);
}
if (pickedShape != null && pickedShape.getUserData()=="ball")
{
alpha.setStartTime(System.currentTimeMillis()-alpha.getTriggerTime()+1000);
}
}
}
Gruß
Maik