What you are doing sounds like it should work. I have attached
a modified AppearanceMixed that uses setModelTransform(). It isn't
doing what you need it to do, but it gives you an example of
using it.
Doug Twilleager
Sun Microsystems
>MIME-Version: 1.0
>Subject: Re: [JAVA3D] Range ordering of transparent objects
>Comments: To: Doug Twilleager <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>
>Doug,
>
>I appreciate your help. I've spent the morning doing some rearranging
>and setting up for this. It's not quite working for me yet, but I'm
>pretty sure I know why.
>
>I have the transform from each Shape to virtual world coordinates. But
>I think I may be missing the part of the transform to go from virtual
>world to eye coordinates. Can you give me what you consider to be the
>set of steps to do this?
>
>For example:
>
> VW
> |
> Locale
> |
> ------------
> BG1 BG2
> | |
> G1 TG3
> | |
> TG1 ViewPlatform
> |
> TG2
> |
> S3D
>
>Let's say I want to draw the shape S3D in immediate mode after hacking
>it off under G1. I compute the transform3D (xform1) for the shape that
>includes TG1 and TG2, and I also get the transform from G1 to virtual
>world coordinates.
>
>Right now, my code looks something like:
>
> G1.getLocalToVworld(parentXform); // G1 to virtual world
> tempxform.mul(parentXform, xform1); // make S3D to virtual world
> gc.setAppearance( S3D.getAppearance() );
> gc.setModelTransform( tempxform );
> gc.draw( shape );
>
>I use TG3 to move the view around in the scene. Am I missing TG3 in my
>code? Actually, I guess I'm asking exactly how the argument to
>"setModelTransform" should be created.
>
>I swear if I get this going I'll put it in the FAQ... ;)
>
>-Lee
>
>> -----Original Message-----
>> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> Sent: Monday, April 23, 2001 11:18 PM
>> To: [EMAIL PROTECTED]
>> Subject: Re: [JAVA3D] Range ordering of transparent objects
>>
>>
>> Well, it looks like you have found a performance trap in detach/attach
>> of OrderedGroup. Let's try this a different way. If we examine the
>> order of operations in the Renderer thread, it looks like this:
>>
>> Canvas3D.preRender();
>> Render opaque objects
>> Render OrderedGroup objects
>> Canvas3D.renderField();
>> Rendertransparent objects
>> Canvas3D.postRender();
>> Swap buffers
>> Canvas3D.postSwap();
>>
>> Since you are trying to render a collection of objects in a specific
>> order, and they fall into the OrderedGroup catagory, an alternative
>> approach is to render your ordered objects using the GraphicsContext3D
>> in the Canvas3D.renderField() callback. This is pretty much the same
>> place that OrderedGroup would have rendered them. And since you have
>> references to all the objects, and are sorting them, it would be easy
>> to render them there. As long as the geometry was pretty
>> much a one to
>> one relationship with OrderedGroup children, you won't loose any
>> performance from state sorting. This technique should work well.
>>
>> Doug Twilleager
>> Sun Microsystems
>>
>> >To: "'Doug Twilleager'" <[EMAIL PROTECTED]>
>> >Cc: "JAVA3D-INTEREST (E-mail)" <[EMAIL PROTECTED]>
>> >Subject: RE: [JAVA3D] Range ordering of transparent objects
>> >MIME-Version: 1.0
>> >
>> >Doug,
>> >I turned off compiling of my scene and placed a BranchGroup above my
>> >OrderedGroup. Next, I changed all my child nodes to plain
>> Group nodes.
>> >Still was very slow. Then I turned off all reordering and
>> left *just*
>> >the detach/attach of my OrderedGroup. Still slow. Finally,
>> I did some
>> >profiling....
>> >
>> >long time1 = System.currentTimeMillis();
>> >for(i = 0; i < 5; i++)
>> >{
>> > myBranch.detach();
>> > myParent.addChild( myBranch );
>> >}
>> >long time2 = System.currentTimeMillis();
>> >System.out.println(" AVG TIME = " + ((float)(time2-time1) * 0.2f) );
>> >
>> >AVG TIME = 46.0
>> >AVG TIME = 70.200005
>> >AVG TIME = 50.0
>> >AVG TIME = 74.200005
>> >AVG TIME = 146.2
>> >AVG TIME = 84.200005
>> >AVG TIME = 66.200005
>> >AVG TIME = 90.0
>> >AVG TIME = 66.200005
>> >AVG TIME = 264.4
>> >AVG TIME = 76.200005
>> >AVG TIME = 108.200005
>> >AVG TIME = 86.0
>> >
>> >These times are in milliseconds. Actually, I even changed it to do a
>> >single attach/detach timing:
>> >
>> >AVG TIME = 70.0
>> >AVG TIME = 90.0
>> >AVG TIME = 60.0
>> >AVG TIME = 90.0
>> >AVG TIME = 841.0
>> >AVG TIME = 90.0
>> >AVG TIME = 151.0
>> >AVG TIME = 90.0
>> >AVG TIME = 140.0
>> >AVG TIME = 90.0
>> >AVG TIME = 80.0
>> >AVG TIME = 120.0
>> >
>> >I know that Win2k timing is only good for 10ms, but there's a couple
>> >pretty big ones in there. What can I do about this? If
>> there is no way
>> >around this, then how can I *ever* do range-ordering?? If the new
>> >capability in 1.3 won't be available until later this year,
>> how about an
>> >interim release that just allows for *quick* reordering of
>> OrderedGroup
>> >nodes as a workaround? At least the problem would then be workable.
>> >
>> >Thx
>> >-Lee
>> >
>> >> -----Original Message-----
>> >> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> >> Sent: Monday, April 23, 2001 3:17 PM
>> >> To: [EMAIL PROTECTED]
>> >> Subject: Re: [JAVA3D] Range ordering of transparent objects
>> >>
>> >>
>> >> The only way to get the compile out of the way is to compile the
>> >> scene without your OrderedGroup's, and then add them in after
>> >> the compile. Other than that, I don't see any other ways
>> >> to do this in 1.2.*.
>> >>
>> >> Doug Twilleager
>> >> Sun Microsystems
>> >>
>> >>
>> >> >To: "'Doug Twilleager'" <[EMAIL PROTECTED]>,
>> >> [EMAIL PROTECTED]
>> >> >Subject: RE: [JAVA3D] Range ordering of transparent objects
>> >> >MIME-Version: 1.0
>> >> >
>> >> >Doug,
>> >> >The only way to rearrange the children of the
>> OrderedGroup is to do
>> >> >attaches and reattaches of BranchGroups since I get an
>> >> exception if I do
>> >> >a "setChild(Node, index)" without the child being a
>> >> BranchGroup. This
>> >> >is from the Group.setChild() Javadoc:
>> >> >
>> >> >"RestrictedAccessException - if this group node is part of live or
>> >> >compiled scene graph and the child node being set is not a
>> >> BranchGroup
>> >> >node"
>> >> >
>> >> >Since they are BranchGroups, I still get the overhead of doing
>> >> >attach/detach with each child. My code for swapping
>> >> children looks like
>> >> >this:
>> >> >
>> >> > in constructor...
>> >> > {
>> >> > ...
>> >> > empty = new BranchGroup();
>> >> > empty.setCapability(BranchGroup.ALLOW_DETACH);
>> >> > ...
>> >> > }
>> >> >
>> >> > private void doReordering()
>> >> > {
>> >> > myBranch.detach(); // detach OrderedGroup from scene
>> >> >
>> >> > // Call "swapBranches" as necessary
>> >> >
>> >> > myParent.addChild( myBranch );
>> >> > }
>> >> >
>> >> > private void swapBranches(int a, int b)
>> >> > {
>> >> >
>> >> > BranchGroup b1 = (BranchGroup)myOrderedGroup.getChild( a );
>> >> > BranchGroup b2 = (BranchGroup)myOrderedGroup.getChild( b );
>> >> > myOrderedGroup.setChild( empty, a ); // I think this calls
>> >> >b1.detach()
>> >> > myOrderedGroup.setChild( b1, b );
>> >> > myOrderedGroup.setChild( b2, a );
>> >> > }
>> >> >
>> >> >What do you think I can do? Is there a way to prevent my
>> >> OrderedGroup
>> >> >from being compiled so I don't have to use BranchGroups for the
>> >> >children??
>> >> >
>> >> >Thx
>> >> >-Lee
>> >> >
>> >> >> -----Original Message-----
>> >> >> From: Doug Twilleager [mailto:[EMAIL PROTECTED]]
>> >> >> Sent: Monday, April 23, 2001 1:23 PM
>> >> >> To: [EMAIL PROTECTED]
>> >> >> Subject: Re: [JAVA3D] Range ordering of transparent objects
>> >> >
>> >> ><snip...>
>> >> >
>> >> >> If you detach the branch graph which contains the
>> >> >> OrderedGroup, rearrange
>> >> >> the OrderedGroup, then reattach again, you will get better
>> >> performance
>> >> >> that attaching and reattaching the children of the
>> >> >> OrderedGroup individually.
>> >> >>
>> >> >> Doug Twilleager
>> >> >> Sun Microsystems
>> >> >>
>> >>
>> >> ==============================================================
>> >> =============
>> >> To unsubscribe, send email to [EMAIL PROTECTED] and
>> >> include in the body
>> >> of the message "signoff JAVA3D-INTEREST". For general help,
>> >> send email to
>> >> [EMAIL PROTECTED] and include in the body of the
>> message "help".
>> >>
>>
>> ==============================================================
>> =============
>> To unsubscribe, send email to [EMAIL PROTECTED] and
>> include in the body
>> of the message "signoff JAVA3D-INTEREST". For general help,
>> send email to
>> [EMAIL PROTECTED] and include in the body of the message "help".
>>
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST". For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".
/*
* @(#)AppearanceMixed.java 1.20 01/01/11 07:30:42
*
* Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
* modify and redistribute this software in source and binary code form,
* provided that i) this copyright notice and license appear on all copies of
* the software; and ii) Licensee does not utilize the software in a manner
* which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind. ALL
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control of
* aircraft, air traffic, aircraft navigation or aircraft communications; or in
* the design, construction, operation or maintenance of any nuclear
* facility. Licensee represents and warrants that it will not use or
* redistribute the Software for such purposes.
*/
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.geometry.ColorCube;
import javax.media.j3d.*;
import javax.vecmath.*;
public class AppearanceMixed extends Applet {
private java.net.URL bgImage;
private java.net.URL texImage;
private SimpleUniverse u = null;
static class MyCanvas3D extends Canvas3D {
private GraphicsContext3D gc;
private static final int vertIndices[] = { 0, 1, 2, 0, 2, 3 };
private static final int normalIndices[] = { 0, 0, 0, 1, 1, 1 };
private IndexedTriangleArray tri =
new IndexedTriangleArray(4, IndexedTriangleArray.COORDINATES |
IndexedTriangleArray.NORMALS, 6);
private Transform3D cmt = new Transform3D();
private Transform3D tz = new Transform3D();
private Alpha rotAlpha = new Alpha(-1, 6000);
private Vector3f trans = new Vector3f(0.7f, 0.0f, 0.0f);
private Point3f vert[] = {
new Point3f(-0.12f, -0.12f, 0.0f),
new Point3f( 0.12f, -0.12f, 0.0f),
new Point3f( 0.12f, 0.12f, 0.0f),
new Point3f(-0.12f, 0.12f, 0.0f),
};
private Point3f min[] = {
new Point3f(-0.24f, -0.24f, -0.20f),
new Point3f( 0.04f, -0.28f, -0.24f),
new Point3f( 0.00f, 0.00f, -0.24f),
new Point3f(-0.32f, 0.08f, -0.20f),
};
private Point3f max[] = {
new Point3f(-0.04f, -0.04f, 0.12f),
new Point3f( 0.32f, -0.04f, 0.16f),
new Point3f( 0.36f, 0.28f, 0.20f),
new Point3f(-0.04f, 0.24f, 0.16f),
};
private Point3f delta[] = {
new Point3f(-0.0021f, -0.0017f, 0.0014f),
new Point3f( 0.0025f, -0.0013f, -0.0018f),
new Point3f( 0.0021f, 0.0017f, 0.0018f),
new Point3f(-0.0025f, 0.0013f, -0.0014f),
};
private Vector3f normals[];
private Vector3f v01 = new Vector3f();
private Vector3f v02 = new Vector3f();
private Vector3f v03 = new Vector3f();
public void renderField(int fieldDesc) {
computeVert();
computeNormals();
double angle = rotAlpha.value() * 2.0*Math.PI;
cmt.rotY(angle);
cmt.setTranslation(trans);
gc.setModelTransform(cmt);
gc.draw(tri);
}
private void computeVert() {
for (int i = 0; i < 4; i++) {
vert[i].add(delta[i]);
if (vert[i].x > max[i].x) {
vert[i].x = max[i].x;
delta[i].x *= -1.0f;
}
if (vert[i].x < min[i].x) {
vert[i].x = min[i].x;
delta[i].x *= -1.0f;
}
if (vert[i].y > max[i].y) {
vert[i].y = max[i].y;
delta[i].y *= -1.0f;
}
if (vert[i].y < min[i].y) {
vert[i].y = min[i].y;
delta[i].y *= -1.0f;
}
if (vert[i].z > max[i].z) {
vert[i].z = max[i].z;
delta[i].z *= -1.0f;
}
if (vert[i].z < min[i].z) {
vert[i].z = min[i].z;
delta[i].z *= -1.0f;
}
}
tri.setCoordinates(0, vert);
}
private void computeNormals() {
v01.sub(vert[1], vert[0]);
v02.sub(vert[2], vert[0]);
v03.sub(vert[3], vert[0]);
normals[0].cross(v01, v02);
normals[0].normalize();
normals[1].cross(v02, v03);
normals[1].normalize();
tri.setNormals(0, normals);
}
public MyCanvas3D(GraphicsConfiguration gcfg) {
super(gcfg);
// Allocate memory for normals
normals = new Vector3f[2];
normals[0] = new Vector3f();
normals[1] = new Vector3f();
// Set up the indices
tri.setCoordinateIndices(0, vertIndices);
tri.setNormalIndices(0, normalIndices);
// Set up the graphics context
gc = getGraphicsContext3D();
// Create the appearance for the triangle fan
Appearance app = new Appearance();
Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
Color3f objColor = new Color3f(0.0f, 0.0f, 0.8f);
app.setMaterial(new Material(objColor, black, objColor,
white, 80.0f));
gc.setAppearance(app);
// Set up the global lights
Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
gc.addLight(new AmbientLight(alColor));
gc.addLight(new DirectionalLight(lColor1, lDir1));
}
}
private BranchGroup createSceneGraph() {
// Create the root of the branch graph
BranchGroup objRoot = new BranchGroup();
// Create a bounds for the background and lights
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
// Set up the background
TextureLoader bgTexture = new TextureLoader(bgImage, this);
Background bg = new Background(bgTexture.getImage());
bg.setApplicationBounds(bounds);
objRoot.addChild(bg);
// Set up the global lights
Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f);
Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f);
AmbientLight aLgt = new AmbientLight(alColor);
aLgt.setInfluencingBounds(bounds);
DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
lgt1.setInfluencingBounds(bounds);
objRoot.addChild(aLgt);
objRoot.addChild(lgt1);
// Create a bunch of objects with a behavior and add them
// into the scene graph.
int row, col;
Appearance[][] app = new Appearance[3][3];
for (row = 0; row < 3; row++)
for (col = 0; col < 3; col++)
app[row][col] = createAppearance(row * 3 + col);
for (int i = 0; i < 3; i++) {
double ypos = (double)(i - 1) * 0.6;
for (int j = 0; j < 3; j++) {
double xpos = (double)(j - 1) * 0.6;
objRoot.addChild(createObject(app[i][j], 0.12, xpos, ypos));
}
}
// Let Java 3D perform optimizations on this scene graph.
objRoot.compile();
return objRoot;
}
private Appearance createAppearance(int idx) {
Appearance app = new Appearance();
// Globally used colors
Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
Color3f white = new Color3f(1.0f, 1.0f, 1.0f);
switch (idx) {
// Unlit solid
case 0:
{
// Set up the coloring properties
Color3f objColor = new Color3f(1.0f, 0.2f, 0.4f);
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(objColor);
app.setColoringAttributes(ca);
break;
}
// Unlit wire frame
case 1:
{
// Set up the coloring properties
Color3f objColor = new Color3f(0.5f, 0.0f, 0.2f);
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(objColor);
app.setColoringAttributes(ca);
// Set up the polygon attributes
PolygonAttributes pa = new PolygonAttributes();
pa.setPolygonMode(pa.POLYGON_LINE);
pa.setCullFace(pa.CULL_NONE);
app.setPolygonAttributes(pa);
break;
}
// Unlit points
case 2:
{
// Set up the coloring properties
Color3f objColor = new Color3f(0.2f, 0.2f, 1.0f);
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(objColor);
app.setColoringAttributes(ca);
// Set up the polygon attributes
PolygonAttributes pa = new PolygonAttributes();
pa.setPolygonMode(pa.POLYGON_POINT);
pa.setCullFace(pa.CULL_NONE);
app.setPolygonAttributes(pa);
// Set up point attributes
PointAttributes pta = new PointAttributes();
pta.setPointSize(5.0f);
app.setPointAttributes(pta);
break;
}
// Lit solid
case 3:
{
// Set up the material properties
Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
app.setMaterial(new Material(objColor, black, objColor,
white, 80.0f));
break;
}
// Texture mapped, lit solid
case 4:
{
// Set up the texture map
TextureLoader tex = new TextureLoader(texImage, this);
app.setTexture(tex.getTexture());
TextureAttributes texAttr = new TextureAttributes();
texAttr.setTextureMode(TextureAttributes.MODULATE);
app.setTextureAttributes(texAttr);
// Set up the material properties
app.setMaterial(new Material(white, black, white, black, 1.0f));
break;
}
// Transparent, lit solid
case 5:
{
// Set up the transparency properties
TransparencyAttributes ta = new TransparencyAttributes();
ta.setTransparencyMode(ta.BLENDED);
ta.setTransparency(0.6f);
app.setTransparencyAttributes(ta);
// Set up the polygon attributes
PolygonAttributes pa = new PolygonAttributes();
pa.setCullFace(pa.CULL_NONE);
app.setPolygonAttributes(pa);
// Set up the material properties
Color3f objColor = new Color3f(0.7f, 0.8f, 1.0f);
app.setMaterial(new Material(objColor, black, objColor,
black, 1.0f));
break;
}
// Lit solid, no specular
case 6:
{
// Set up the material properties
Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
app.setMaterial(new Material(objColor, black, objColor,
black, 80.0f));
break;
}
// Lit solid, specular only
case 7:
{
// Set up the material properties
Color3f objColor = new Color3f(0.8f, 0.0f, 0.0f);
app.setMaterial(new Material(black, black, black,
white, 80.0f));
break;
}
// Another lit solid with a different color
case 8:
{
// Set up the material properties
Color3f objColor = new Color3f(0.8f, 0.8f, 0.0f);
app.setMaterial(new Material(objColor, black, objColor,
white, 80.0f));
break;
}
default:
{
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(new Color3f(0.0f, 1.0f, 0.0f));
app.setColoringAttributes(ca);
}
}
return app;
}
private Group createObject(Appearance app, double scale,
double xpos, double ypos) {
// Create a transform group node to scale and position the object.
Transform3D t = new Transform3D();
t.set(scale, new Vector3d(xpos, ypos, 0.0));
TransformGroup objTrans = new TransformGroup(t);
// Create a second transform group node and initialize it to the
// identity. Enable the TRANSFORM_WRITE capability so that
// our behavior code can modify it at runtime.
TransformGroup spinTg = new TransformGroup();
spinTg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
// Create a simple shape leaf node and set the appearance
Shape3D shape = new Tetrahedron();
shape.setAppearance(app);
// add it to the scene graph.
spinTg.addChild(shape);
// Create a new Behavior object that will perform the desired
// operation on the specified transform object and add it into
// the scene graph.
Transform3D yAxis = new Transform3D();
Alpha rotationAlpha = new Alpha(-1, Alpha.INCREASING_ENABLE,
0, 0,
5000, 0, 0,
0, 0, 0);
RotationInterpolator rotator =
new RotationInterpolator(rotationAlpha, spinTg, yAxis,
0.0f, (float) Math.PI*2.0f);
BoundingSphere bounds =
new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
rotator.setSchedulingBounds(bounds);
// Add the behavior and the transform group to the object
objTrans.addChild(rotator);
objTrans.addChild(spinTg);
return objTrans;
}
public AppearanceMixed() {
}
public AppearanceMixed(java.net.URL bgurl, java.net.URL texurl) {
bgImage = bgurl;
texImage = texurl;
}
public void init() {
if (bgImage == null) {
// the path to the image for an applet
try {
bgImage = new java.net.URL(getCodeBase().toString() +
"bg.jpg");
}
catch (java.net.MalformedURLException ex) {
System.out.println(ex.getMessage());
System.exit(1);
}
}
if (texImage == null) {
// the path to the image for an applet
try {
texImage = new java.net.URL(getCodeBase().toString() +
"apimage.jpg");
}
catch (java.net.MalformedURLException ex) {
System.out.println(ex.getMessage());
System.exit(1);
}
}
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
MyCanvas3D c = new MyCanvas3D(config);
add("Center", c);
// Create a simple scene and attach it to the virtual universe
BranchGroup scene = createSceneGraph();
u = new SimpleUniverse(c);
// This will move the ViewPlatform back a bit so the
// objects in the scene can be viewed.
u.getViewingPlatform().setNominalViewingTransform();
u.addBranchGraph(scene);
}
public void destroy() {
u.removeAllLocales();
}
//
// The following allows AppearanceMixed to be run as an application
// as well as an applet
//
public static void main(String[] args) {
// the path to the image file for an application
java.net.URL bgurl = null;
java.net.URL texurl = null;
try {
bgurl = new java.net.URL("file:bg.jpg");
texurl = new java.net.URL("file:apimage.jpg");
}
catch (java.net.MalformedURLException ex) {
System.out.println(ex.getMessage());
System.exit(1);
}
new MainFrame(new AppearanceMixed(bgurl, texurl), 700, 700);
}
}