bonjour ,
je suis entrain de réaliser une application en java 3D tout en chargeant des avatar en x3d en utilisant l API xj3d le probleme c'est que j'ai un avatar en trois 3D dans ma scene je lui rajoute un item (box ) de petite taille je peux utilisé plusieur box si je veux dans le corp de l avatar mainteant je veux que lorsque j insert la box elle doit savoir sur quelle point 3D elle est mise et elle reste toujours en parallele avec le corp dans le point mentionner
voici la classe dans la quelle j ai le prob (ItemCube) :
package Manequin.x3DTools;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.picking.*;
import com.sun.j3d.loaders.Scene;
import org.ietf.uri.ContentHandlerFactory;
import org.ietf.uri.FileNameMap;
import org.ietf.uri.URI;
import javax.media.j3d.*;
import javax.vecmath.*;
import org.web3d.j3d.loaders.X3DLoader;
import org.web3d.vrml.renderer.j3d.browser.*;
import java.net.*;
import java.io.* ;
import java.util.* ;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.image.TextureLoader;
import javax.media.j3d.*;
import javax.vecmath.*;
import javax.media.j3d.GeometryArray;
public class ItemCube extends Item{
private Appearance at;
private TransformGroup objPos;
private float rayon = 0.015F;
private Point3d p;
private Material m;
private Box b;
private Color3f cS = new Color3f(1.0F,1.0F,0.0F);
private Color3f cU = new Color3f(0.0F,1.0F,1.0F);
private Transform3D tr;
private CanvasX3D c;
private Scene scene;
public ItemCube(){
at =new Appearance();
m = new Material();
m.setDiffuseColor(new Color3f(0.0F,1.0F,1.0F));
m.setCapability(Material.ALLOW_COMPONENT_READ);
m.setCapability(Material.ALLOW_COMPONENT_WRITE);
at.setMaterial(m);
Transform3D tr = new Transform3D();
objPos = new TransformGroup(tr);
objPos.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objPos.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objPos.setTransform(tr);
objPos.addChild(b);
TextureLoader loader = new TextureLoader("c:\\img0095.jpg","", new Container());
Texture texture = loader.getTexture();
at.setTexture(texture);
TextureAttributes texAttr = new TextureAttributes();
at.setTextureAttributes(texAttr);
Box b=new Box(0.03f,0.03f,0.03f,Box.GENERATE_TEXTURE_COORDS,at);
objPos.addChild(b);
setCapability(BranchGroup.ALLOW_DETACH);
addChild(objPos);
}
public void setSelected() {
m.setDiffuseColor(cS);
}
public void setUnselected() {
m.setDiffuseColor(cU);
}
public Point3d getPosition() {
return(new Point3d(p));
}
public void setPosition(Point3d p) {
this.p = new Point3d(p);
Transform3D tr = new Transform3D();
tr.setTranslation(new Vector3d(p.x,p.y,p.z));
objPos.setTransform(tr);
}
public void saveToX3DFile(X3DFile file) {
file.ecrireDebutTagTranslation(p);
file.ecrireDebutTagGroup();
file.ecrireDebutTagShape();
file.ecrireDebutTagAppearance();
file.ecrireTagMaterial(0.2F,
new Color3f(0.0F,0.0F,0.0F),
cU,
new Color3f(1.0F,1.0F,1.0F),
0.5,
0.0);
file.ecrireFinTagAppearance();
file.ecrireTagSphere(rayon);
file.ecrireFinTagShape();
file.ecrireFinTagGroup();
file.ecrireFinTagTranslation();
}
}
**********************************************************
voici la classe item :
public abstract class Item extends BranchGroup {
public abstract void setSelected();
public abstract void setUnselected();
public abstract Point3d getPosition();
public abstract void setPosition(Point3d p);
public abstract void saveToX3DFile(X3DFile f);
}
**********************************************************
voici la classe CanvasX3D
public class CanvasX3D extends Canvas3D
implements MouseListener,
MouseMotionListener,
ActionListener {
private MouseMyTranslate mT;
private View view;
private SimpleUniverse u;
private BranchGroup mnq;
private GraphicsConfiguration config;
private PickCanvas pickCanvas;
private TransformGroup objTrans;
private Scene scene;
private Hashtable htn;
private Node body;
private MenuItem mai;
private MenuItem msi;
private Point3d p2;
private Node n;
private boolean onMove = false;
public Vector items;
private Class item;
public CanvasX3D(String filename,Class item) {
super(SimpleUniverse.getPreferredConfiguration());
this.item = item;
config = SimpleUniverse.getPreferredConfiguration();
u = new SimpleUniverse(this);
u.getViewingPlatform().setNominalViewingTransform();
view = u.getViewer().getView();
view.setProjectionPolicy(View.PARALLEL_PROJECTION);
view.setBackClipDistance(100.0);
view.setFrontClipDistance(0.1);
u.addBranchGraph(mnq = createSceneGraph(filename,u));
addMouseListener(this);
addMouseMotionListener(this);
items = new Vector();
pickCanvas = new PickCanvas(this,mnq);
pickCanvas.setMode(PickCanvas.GEOMETRY);
pickCanvas.setTolerance(0.0F);
}
public void loadX3DFile(String filename) {
BranchGroup newMnq = createSceneGraph(filename,u);
u.getLocale().addBranchGraph(newMnq);
u.getLocale().removeBranchGraph(mnq);
mnq = newMnq;
pickCanvas = new PickCanvas(this,mnq);
pickCanvas.setMode(PickCanvas.GEOMETRY);
pickCanvas.setTolerance(0.0F);
}
public BranchGroup loadFile(String file) {
BranchGroup sceneGroup = null;
if ( file == null ) {
sceneGroup = new BranchGroup();
sceneGroup.setCapability(BranchGroup.ALLOW_DETACH);
sceneGroup.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
sceneGroup.compile();
return(sceneGroup); }
X3DLoader loader = new X3DLoader(X3DLoader.LOAD_ALL);
File f = new File(file);
if ( f.exists() && !f.isFile() ) {
System.out.println("Can't load directories specified");
System.exit(1); }
URL url = null;
scene = null;
try {
url = new URL(file); }
catch (MalformedURLException badUrl) { }
try {
if ( url != null )
scene = loader.load(url);
else
scene = loader.load(file); }
catch(Exception e) {
System.out.println("Exception loading URL:" + e);
e.printStackTrace();
System.exit(0); }
if ( scene != null ) {
sceneGroup = scene.getSceneGroup();
sceneGroup.setCapability(BranchGroup.ALLOW_DETACH);
sceneGroup.setCapability(BranchGroup.ALLOW_BOUNDS_READ);
Group geg =(Group) chercheGlobalEffectsGroup(sceneGroup);
geg.removeAllChildren();
htn = scene.getNamedObjects();
body =(Node) htn.get("Body");
sceneGroup.compile(); }
return(sceneGroup);
}
private BranchGroup createSceneGraph(String filename,SimpleUniverse u) {
BranchGroup objRoot = new BranchGroup();
objRoot.setCapability(BranchGroup.ALLOW_DETACH);
objRoot.setCapability(BranchGroup.ENABLE_PICK_REPORTING);
objTrans = new TransformGroup();
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_EXTEND);
objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_WRITE);
objTrans.setCapability(TransformGroup.ALLOW_CHILDREN_READ);
TransformGroup objPos = new TransformGroup();
Transform3D tr = new Transform3D();
tr.setTranslation(new Vector3d(0.0,0.0,0.0));
objPos.setTransform(tr);
objRoot.addChild(objPos);
objPos.addChild(objTrans);
objTrans.addChild(loadFile(filename));
BoundingSphere largeBounds;
largeBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),100.0);
BoundingSphere smallBounds;
smallBounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),0.4);
{ Vector3f ldir = new Vector3f(1.0F,1.0F,-1.0F);
Color3f lcouldl = new Color3f(1.0F,0.5F,0.5F);
DirectionalLight dl = new DirectionalLight(lcouldl,ldir);
dl.setInfluencingBounds(largeBounds);
objRoot.addChild(dl); }
{ Color3f lcoulal = new Color3f(0.5F,0.5F,0.1F);
AmbientLight al = new AmbientLight(lcoulal);
al.setInfluencingBounds(largeBounds);
objRoot.addChild(al); }
{ Point3f lpos = new Point3f(0.5F,0.0F,0.0F);
Point3f laten = new Point3f(1.0F,1.0F,1.0F);
Color3f lcoulpl = new Color3f(0.5F,1.0F,0.5F);
PointLight pl = new PointLight(lcoulpl,lpos,laten);
pl.setInfluencingBounds(largeBounds);
objRoot.addChild(pl); }
BoundingSphere bounds;
bounds = new BoundingSphere(new Point3d(0.0,0.0,0.0),10.0);
{ MouseMyScale behavior = new MouseMyScale(objTrans);
objTrans.addChild(behavior);
behavior.setSchedulingBounds(bounds); }
{ MouseMyTranslate mT = new MouseMyTranslate(objTrans);
mT.setFactor(mT.getXFactor()/3.0);
objTrans.addChild(mT);
mT.setSchedulingBounds(bounds); }
{ MouseMyRotate behavior = new MouseMyRotate(objTrans);
objTrans.addChild(behavior);
behavior.setSchedulingBounds(bounds); }
objRoot.compile();
return(objRoot);
}
private void affichage(Node n,int niveau) {
System.out.println(niveau+" "+n.getClass().getName());
try {
Group r =(Group) n;
int nb = r.numChildren();
for ( int i = 0 ; i < nb ; i++ ) {
affichage(r.getChild(i),niveau+1); } }
catch (Exception e) { }
}
private Light chercheLumiere(Node n) {
try {
Light l =(Light) n;
return(l); }
catch (Exception e) {
try {
Group r =(Group) n;
int nb = r.numChildren();
for ( int i = 0 ; i < nb ; i++ ) {
Object o = chercheLumiere(r.getChild(i));
if ( o != null )
return((Light) o); } }
catch (Exception ee) { } }
return(null);
}
private Node chercheGlobalEffectsGroup(Node n) {
if ( n.getClass().getName().equals("org.web3d.vrml.renderer.j3d.browser.GlobalEffectsGroup") )
return(n);
try {
Group r =(Group) n;
int nb = r.numChildren();
for ( int i = 0 ; i < nb ; i++ ) {
Object o = chercheGlobalEffectsGroup(r.getChild(i));
if ( o != null )
return((Node) o); } }
catch (Exception ee) { }
return(null);
}
public void affichageGrapheDeScene(Node mnq) {
affichage(mnq,0);
Light l = chercheLumiere(mnq);
l.setEnable(false);
}
public void affichageGrapheDeScene() {
affichageGrapheDeScene(mnq);
}
public Point3d calculCoordEcran(PickResult result,int i,Transform3D tt) {
PickIntersection pi = result.getIntersection(i);
Point3d pt = new Point3d(pi.getPointCoordinatesVW());
tt.transform(pt);
return(pt);
}
public Point3d calculCoordReel(PickResult result,int i) {
PickIntersection pi = result.getIntersection(i);
Point3d p2 = new Point3d(pi.getPointCoordinatesVW());
Transform3D t = new Transform3D();
objTrans.getTransform(t);
t.invert();
t.transform(p2);
return(p2);
}
public Point3d getMouseClickedBodyPosition(MouseEvent e) {
return(getMouseClickedBodyPosition(e.getX(),e.getY()));
}
public Point3d getMouseClickedBodyPosition(int x,int y) {
pickCanvas.setShapeLocation(x,y);
PickResult [] result = pickCanvas.pickAll();
Transform3D tt = new Transform3D();
getVworldToImagePlate(tt);
Point3d p2 = null;
if ( result != null ) {
double v = -100000.0;
for ( int j = 0 ; j < result.length ; j++ ) {
PickResult rslt = result[j];
Shape3D s =(Shape3D) rslt.getNode(PickResult.SHAPE3D);
if ( s != null ) {
Node n = s.getParent().getParent();
if ( n == body ) {
for ( int i = 0 ; i < rslt.numIntersections() ; i++ ) {
Point3d pt = calculCoordEcran(rslt,i,tt);
if ( pt.z > v ) {
v = pt.z;
p2 = calculCoordReel(rslt,i); } } } } } }
return(p2);
}
public void mouseClicked(MouseEvent e) {
pickCanvas.setShapeLocation(e);
PickResult result = pickCanvas.pickClosest();
Transform3D tt = new Transform3D();
getVworldToImagePlate(tt);
if ( result != null ) {
p2 = calculCoordReel(result,0);
Point3d pt = calculCoordEcran(result,0,tt);
double v = pt.z;
for ( int i = 1 ; i < result.numIntersections() ; i++ ) {
pt = calculCoordEcran(result,i,tt);
if ( pt.z > v ) {
v = pt.z;
p2 = calculCoordReel(result,i); } }
Primitive p =(Primitive) result.getNode(PickResult.PRIMITIVE);
if ( p != null ) {
if ( e.getButton() == MouseEvent.BUTTON3 ) {
n = p.getParent().getParent();
PopupMenu pm = new PopupMenu();
msi = new MenuItem("Supprimer item");
msi.addActionListener(this);
this.add(pm);
pm.add(msi);
pm.show(this,e.getX(),e.getY());
return; } }
Shape3D s =(Shape3D) result.getNode(PickResult.SHAPE3D);
if ( s != null ) {
n = s.getParent().getParent();
if ( e.getButton() == MouseEvent.BUTTON3 ) {
if ( n == body ) {
PopupMenu pm = new PopupMenu();
mai = new MenuItem("Ajouter item");
mai.addActionListener(this);
this.add(pm);
pm.add(mai);
pm.show(this,e.getX(),e.getY());
return; } } } }
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
pickCanvas = new PickCanvas(this,mnq);
pickCanvas.setMode(PickCanvas.GEOMETRY);
pickCanvas.setTolerance(0.0F);
pickCanvas.setShapeLocation(e);
PickResult result = pickCanvas.pickClosest();
Transform3D tt = new Transform3D();
getVworldToImagePlate(tt);
if ( result != null ) {
p2 = calculCoordReel(result,0);
Point3d pt = calculCoordEcran(result,0,tt);
double v = pt.z;
for ( int i = 1 ; i < result.numIntersections() ; i++ ) {
pt = calculCoordEcran(result,i,tt);
if ( pt.z > v ) {
v = pt.z;
p2 = calculCoordReel(result,i); } }
Primitive p =(Primitive) result.getNode(PickResult.PRIMITIVE);
if ( p != null ) {
if ( e.getButton() == MouseEvent.BUTTON1 ) {
onMove = true;
n = p.getParent().getParent();
((Item) n).setSelected();
return; } } }
}
public void mouseReleased(MouseEvent e) {
if ( ( onMove ) && ( e.getButton() == MouseEvent.BUTTON1 ) ) {
onMove = false;
((Item) n).setUnselected(); }
}
public void mouseDragged(MouseEvent e) {
if ( onMove ) {
Point3d pm = getMouseClickedBodyPosition(e);
if ( pm != null ) {
((Item) n).setPosition(pm); } }
}
public void mouseMoved(MouseEvent e) {
}
private void ajouterItem() {
try {
Item it =(Item) item.newInstance();
it.setPosition(p2);
objTrans.addChild(it);
items.add(it);
}
catch(Exception e) {
System.out.println("Erreur "+e);
}
}
private void supprimerItem() {
BranchGroup bg =(BranchGroup) n;
((Group) bg.getParent()).removeChild(n);
items.remove(bg);
}
public void actionPerformed(ActionEvent e) {
if ( e.getSource() == mai ) {
ajouterItem();
return; }
if ( e.getSource() == msi ) {
supprimerItem();
return; }
}
public void sauverFichierItems(String filename) {
try {
X3DFile file = new X3DFile(filename);
file.ecrireEntete();
file.ecrireDebutTagX3D();
file.ecrireDebutTagScene("Scene");
for ( int i = 0 ; i < items.size() ; i++ )
((Item) items.elementAt(i)).saveToX3DFile(file);
file.ecrireFinTagScene();
file.ecrireFinTagX3D();
file.close();
}
catch(Exception e) {
System.out.println(e); }
}
}