Exception in thread "Thread-2" javax.media.j3d.CapabilityNotSetException: Shape3D: no capability to get appearance
at javax.media.j3d.Shape3D.getAppearance(Shape3D.java:487)
at com.sun.j3d.utils.geometry.Text2D.setString(Text2D.java:115)
at main.KeyNavigatorExample.run(KeyNavigatorExample.java:81)
at java.lang.Thread.run(Unknown Source)
Illuvatar hat gesagt.:Capabilities:
Ein wichtiges Konzept in Java3d sind die Capabilities. Bevor ein SceneGraph live, also auf dem Bildschirm, ist können Capabilities gesetzt werden, die später bestimmte Veränderungen zulassen.
Sie können über die Methode SceneGraphObject(Node ist aus dieser Klasse abgeleitet)#setCapability bzw clearCapability gesetzt werden. |-Verknüpfungen funktionieren nicht, jedes Capability-Bit muss einzeln gesetzt werden.
Wenn bestimmte Capabilities nicht gesetzt sind, kann Java3d Optimierungen vornehmen (z.B. mehrere Groups zu einer zusammenfassen).
public void run(){
StringBuffer text=new StringBuffer("Koordinaten");
Text2D t2d=new Text2D(text.toString(), new Color3f(1.0f, 0.0f, 0.0f), "Dialog", 18, Font.BOLD);
t2d.setCapability(Shape3D.ALLOW_APPEARANCE_READ);
BranchGroup bg=new BranchGroup();
TransformGroup tg=new TransformGroup();
tg.addChild(t2d);
bg.addChild(tg);
u.addBranchGraph(bg);
while(true){
Transform3D t3d=new Transform3D();
u.getViewingPlatform().getViewPlatformTransform().getTransform(t3d);
Vector3d v=new Vector3d();
t3d.get(v);
StringBuffer coords=new StringBuffer("Koordinaten: ");
coords.append(v.x);
coords.append("/");
coords.append(v.y);
coords.append("/");
coords.append(v.z);
t2d.setAppearance(createApp());
t2d.setString(coords.toString());
}
}
public Appearance createApp(){
Appearance app=new Appearance();
ColoringAttributes c=new ColoringAttributes();
c.setColor(1.0f, 0.0f, 0.0f);
app.setColoringAttributes(c);
return app;
}