mein ziel ist es, an ein objekt einer szene ranzuzoomen....
habe mir das wie folgt gedacht....
das objekt in der scene(nicht mittig^^) wird angeklickt und ich zoom an dieses ran...
ich dachte mir...ich schalte 3 PositionInterpolatoren hintereinander und die sollen gleichzeitig(jeder hat das selbe alpha- und somit zeitliche definition) in x, y und z richtung hinzoomen...
nur leider klappt das nicht ... es geht nur in horizontaler richtung(wenn nur der interpolator an ist) wenn ich die anderen (auch wenn ich die einzeln an mache) an mach... dann geh ich(mein sichtpunkt) komischerweise nah ran ..so das ich manchmal nur was flackern sehe...
im prinzip geht das so...
ich richte den würfel (nicht zentriert) aus - damit was passiert...
dann klick ich auf "fly" ... dann wähl ich per klick den würfel aus...
koordinaten das würfels werden ausgelesen
koordinaten des view´s werden ausgelesen
dann werden die werte als start bzw endpunkt der interpolatoren angegeben...
auch wenn ich absolute werte für die interpolatoren per hand angebe... "zoomt der rein""
ich zeig euch mal den code
habe mir das wie folgt gedacht....
das objekt in der scene(nicht mittig^^) wird angeklickt und ich zoom an dieses ran...
ich dachte mir...ich schalte 3 PositionInterpolatoren hintereinander und die sollen gleichzeitig(jeder hat das selbe alpha- und somit zeitliche definition) in x, y und z richtung hinzoomen...
nur leider klappt das nicht ... es geht nur in horizontaler richtung(wenn nur der interpolator an ist) wenn ich die anderen (auch wenn ich die einzeln an mache) an mach... dann geh ich(mein sichtpunkt) komischerweise nah ran ..so das ich manchmal nur was flackern sehe...
im prinzip geht das so...
ich richte den würfel (nicht zentriert) aus - damit was passiert...
dann klick ich auf "fly" ... dann wähl ich per klick den würfel aus...
koordinaten das würfels werden ausgelesen
koordinaten des view´s werden ausgelesen
dann werden die werte als start bzw endpunkt der interpolatoren angegeben...
auch wenn ich absolute werte für die interpolatoren per hand angebe... "zoomt der rein""
ich zeig euch mal den code
Java:
package testPackage;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.GraphicsConfiguration;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
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.Node;
import javax.media.j3d.PointLight;
import javax.media.j3d.PositionInterpolator;
import javax.media.j3d.SpotLight;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.View;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Point3f;
import javax.vecmath.Vector3f;
import com.eigeneImports.PickTranslateBehavior;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.behaviors.picking.PickZoomBehavior;
import com.sun.j3d.utils.behaviors.picking.PickingCallback;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Box;
import com.sun.j3d.utils.picking.PickCanvas;
import com.sun.j3d.utils.picking.PickResult;
import com.sun.j3d.utils.universe.SimpleUniverse;
public class jumpTo extends Applet implements MouseListener {
BoundingSphere BigBounds = new BoundingSphere(new Point3d(),100000);
Canvas3D c;
GraphicsConfiguration config;
SimpleUniverse u ;
BranchGroup sceneBG,rootBG,boxBG;
TransformGroup mTG, boxTG;
PickCanvas pickC;
TransformGroup vpTG;
Transform3D vpT3D;
TextField modeTF;
MouseTranslate mt;
MouseRotate mr;
MouseZoom mz;
BranchGroup navBG;
PickTranslateBehavior pickT;
PickZoomBehavior pickZ;
Boolean foo = false;
public void init(){
System.out.println("init");
setLayout(new BorderLayout());
config = SimpleUniverse.getPreferredConfiguration();
c= new Canvas3D(config);
add("Center", c);
u = new SimpleUniverse(c);
// verschiebe ViewingPlatform:
vpT3D = new Transform3D();
vpTG = u.getViewingPlatform().getViewPlatformTransform();
vpT3D.set(new Vector3f(0.0f, 0.0f, 10.0f));
vpTG.setTransform(vpT3D);
Vector3f vec = new Vector3f();
vpT3D.get(vec);
// Einstellung für die Größe des SimpleUniverse
View v = u.getViewer().getView();
v.setFrontClipDistance(0.01);
v.setBackClipDistance(1000000); // backDistance = 1000000;z.B
v.getPhysicalBody().setNominalEyeOffsetFromNominalScreen(0.0);
Gui();
u.addBranchGraph(createSceneGraph());
}
private void Gui() {
// TODO Auto-generated method stub
Panel panel = new Panel();
Button neu = new Button ("neu");
neu.setName("neu");
neu.addMouseListener(this);
panel.add(neu);
Button fly = new Button ("fly");
fly.setName("fly");
fly.addMouseListener(this);
panel.add(fly);
add("South", panel);
}
private BranchGroup createSceneGraph() {
sceneBG = new BranchGroup();
rootBG = new BranchGroup();
rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
rootBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
// rootBG.setCapability(BranchGroup.ALLOW_DETACH);
mTG = new TransformGroup();
mTG.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
mTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
mTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
rootBG.addChild(mTG);
sceneBG.addChild(rootBG);
licht();
pickC = new PickCanvas(c, rootBG);
pickC.setTolerance((float) 10.0);
c.addMouseListener(this);
PickingCallback myCallback = new MyCallbackClass();
pickT = new PickTranslateBehavior(rootBG, c, BigBounds);
pickZ = new PickZoomBehavior(rootBG, c, BigBounds);
pickT.setupCallback(myCallback);
pickZ.setupCallback(myCallback);
pick();
sceneBG.compile();
return sceneBG;
}
private void fly(Point3d pt){
//Koordinaten vom gepicktenObjekt
float boxX = (float)pt.x;
float boxY = (float)pt.y;
float boxZ = (float)pt.z;
//Koordinaten vom PoV
Vector3f vec = new Vector3f();
vpT3D.get(vec);
float povX = (float) vec.x;
float povY = (float) vec.y;
float povZ = (float) vec.z;
System.out.println("Koordinaten vom Objekt:");
System.out.println("x: " + boxX);
System.out.println("y: " + boxY);
System.out.println("z: " + boxZ);
System.out.println("Koordinaten vom PoV:");
System.out.println("x: " + povX);
System.out.println("y: " + povY);
System.out.println("z: " + povZ);
BranchGroup flyBG = new BranchGroup();
TransformGroup vpTrans = u.getViewingPlatform().getViewPlatformTransform();
Transform3D axisOfTranslation = new Transform3D();
Alpha transAlpha = new Alpha( -1,
Alpha.INCREASING_ENABLE,
0, 0,
5000, 0, 0,
5000, 0, 0);
//Flug in die Tiefe(Richtung X)
axisOfTranslation.rotX(-Math.PI/2.0);
PositionInterpolator translatorX = new PositionInterpolator( transAlpha,
vpTrans,
axisOfTranslation,
povX, boxX);
translatorX.setSchedulingBounds(BigBounds);
// flyBG.addChild(translatorX);
//Flug in die Tiefe(Richtung Y)
axisOfTranslation.rotZ(-Math.PI/2.0);
PositionInterpolator translatorY = new PositionInterpolator( transAlpha,
vpTrans,
axisOfTranslation,
0f, -1f);
translatorY.setSchedulingBounds(BigBounds);
flyBG.addChild(translatorY);
//Flug in die Tiefe(Richtung Z)
axisOfTranslation.rotY(-Math.PI/2.0);
PositionInterpolator translatorZ = new PositionInterpolator( transAlpha,
vpTrans,
axisOfTranslation,
0, -1);
translatorZ.setSchedulingBounds(BigBounds);
// flyBG.addChild(translatorZ);
mTG.addChild(flyBG);
// OrbitBehavior ob = new OrbitBehavior(c);
// ob.setSchedulingBounds(new BoundingSphere(new Point3d(0.0,0.0,0.0),Double.MAX_VALUE));
// u.getViewingPlatform().setViewPlatformBehavior(ob);
}
private void pick(){
BranchGroup pickBG = new BranchGroup();
pickBG.addChild(pickT);
pickBG.addChild(pickZ);
rootBG.addChild(pickBG);
}
private Appearance boxApp(){
//Box-Settings
Color3f ambientColourBox = new Color3f(0.8f,0.0f,0.0f);
Color3f emissiveColourBox = new Color3f(0.0f,0.0f,0.0f);
Color3f diffuseColourBox = new Color3f(0.8f,0.0f,0.0f);
Color3f specularColourBox = new Color3f(1.0f,0.0f,0.0f);
float shininessBox = 10.0f;
Appearance app = new Appearance();
app.setMaterial(new Material(ambientColourBox,emissiveColourBox,diffuseColourBox,specularColourBox,shininessBox));
return app;
}
private void wuerfel(float x,float y,float z){
boxBG = new BranchGroup();
boxTG = new TransformGroup();
boxTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
boxTG.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
boxBG.addChild(boxTG);
boxTG.setName("boxTG");
Transform3D boxT3D = new Transform3D();
boxT3D.set(new Vector3f(0f,0f,0f));
boxTG.setTransform(boxT3D);
Box box = new Box(0.5f,0.5f,0.5f, boxApp());
boxTG.addChild(box);
mTG.addChild(boxBG);
}
// private void changeView(Point3d pt) {
// // TODO Auto-generated method stub
// vpT3D.set(new Vector3f(pt));
// vpTG.setTransform(vpT3D);
// }
//
private void licht(){
BranchGroup bgLight = new BranchGroup();
bgLight.setName("bgLight");
bgLight.setCapability(BranchGroup.ALLOW_DETACH);
BoundingSphere bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE);
BoundingSphere bounds1 = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE);
//Licht Nr.1: direktionales Licht
Color3f lightColour1 = new Color3f(0.8f, 0.8f, 0.8f);
Vector3f lightDir1 = new Vector3f(-30f, -30f, 30f);
Vector3f lightDir2 = new Vector3f(30f, 30f, -30f);
DirectionalLight light1 = new DirectionalLight(lightColour1, lightDir1);
light1.setInfluencingBounds(bounds1);
// bgLight.addChild(light1);
//Licht Nr.1: direktionales Licht2
DirectionalLight lightN = new DirectionalLight(lightColour1, lightDir2);
lightN.setInfluencingBounds(bounds1);
// bgLight.addChild(lightN);
//Licht Nr.2: Eine punktfoermige Lichtquelle
Color3f lightColour2 = new Color3f(0.3f, 0.3f, 0.3f);
PointLight light2 = new PointLight(lightColour2,
new Point3f(0.505f,0.505f,0.505f),
new Point3f(0.1f,0f,0f));
light2.setInfluencingBounds(bounds);
bgLight.addChild(light2);
//Licht Nr.3: Ein Scheinwerfer
Color3f lightColour3 = new Color3f(0.3f, 0.3f, 0.3f);
SpotLight light3 = new SpotLight(lightColour3,
new Point3f(0.0f,0.0f,1.0f),
new Point3f(0.1f,0.1f,0.01f),
new Vector3f(0.0f,0.0f,-1.0f),
(float) (Math.PI/20),
0.0f);
light3.setInfluencingBounds(bounds);
// bgLight.addChild(light3);
//Licht Nr.4: Streulicht
Color3f lightColour4 = new Color3f(0.5f, 0.5f, 0.5f);
AmbientLight light4 = new AmbientLight(lightColour4);
light4.setInfluencingBounds(bounds);
bgLight.addChild(light4);
sceneBG.addChild(bgLight);
}
private void navigate(){
mr = new MouseRotate();
mr.setTransformGroup(mTG);
mr.setSchedulingBounds(BigBounds);
mt = new MouseTranslate();
mt.setTransformGroup(mTG);
mt.setSchedulingBounds(BigBounds);
mz = new MouseZoom();
mz.setTransformGroup(mTG);
mz.setSchedulingBounds(BigBounds);
navBG = new BranchGroup();
navBG.setCapability(BranchGroup.ALLOW_DETACH);
navBG.addChild(mr);
navBG.addChild(mt);
navBG.addChild(mz);
rootBG.addChild(navBG);
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getComponent().getName().equals("neu")){
wuerfel(0f,0f,0f);
}
if (e.getComponent().getName().equals("fly")){
System.out.println("fly");
foo=true;
}
else{
pickC.setShapeLocation(e);
pickC.setTolerance((float) 0.0);
PickResult result = pickC.pickClosest();
//kein Objekt getroffen
if (result == null) {
System.out.println("Nothing picked");
}
else{
//es wurde ein Würfel getroffen
Node picktPrimitive = result.getNode(PickResult.PRIMITIVE);
if (picktPrimitive != null) {
System.out.println(picktPrimitive.getName());
if(picktPrimitive.getParent().getParent().getBounds() instanceof BoundingSphere){
BoundingSphere sphere = (BoundingSphere)picktPrimitive.getParent().getParent().getBounds(); //Bounds von der BG
Point3d pt = new Point3d();
sphere.getCenter(pt);
System.out.println(pt);
if (foo){
fly(pt);
}
}
}
}
}
}
public class MyCallbackClass extends Object implements PickingCallback{
public void transformChanged(int type, TransformGroup tg) {
System.out.println("df");
//System.out.println(tg.getParent().getBounds());
//System.out.println("vergleich " + tg.getParent());
// if(tg!=null){
// if (tg.getParent().getName() != null){
// String compBox = new String(tg.getParent().getName());
// System.out.println("compBox " + compBox);
// line.updateCheck(compBox);
// pt = new Point3d();
// BoundingSphere sphere = (BoundingSphere)tg.getParent().getBounds();
// sphere.getCenter(pt); }
}
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}