>Delivered-To: [EMAIL PROTECTED] >MIME-Version: 1.0 >Date: Fri, 30 Nov 2001 14:59:29 -0800 >From: Kelvin Chung <[EMAIL PROTECTED]> >Subject: Re: [JAVA3D] Images not stable >Comments: To: [EMAIL PROTECTED] >To: [EMAIL PROTECTED] > >Hi Guang, > > There is bug in the test program >(1) In renderRight() > gc.clear(); > gc.setBufferOverride(true); > gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT); > > clear() will only clear STEREO_LEFT buffer since > it is set before. We should put this after > gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT); > Best of all, setting GraphicsContext3D.STEREO_BOTH > will only invoke clear() once instead of twice. >(2) There is no need to invoke swap() two times > - one for each buffer. Instead swap() will swap > both left/right buffer. >(3) No need to invoke > gc.setBufferOverride(true); > every frame, only one at the beginning is good > enough. >(4) There is no distingiush between left and right > GraphicsContext3D. > gc = canvas.getGraphicsContext3D(); > ... > gcLeft = canvas.getGraphicsContext3D(); > They are the same. > >I've modify your program (see attachment) >and it seems to run fine. >
I attach the wrong file without setBufferOverride(true) Here it is again. - Kelvin
import java.applet.Applet; import java.awt.BorderLayout; import java.awt.GraphicsConfiguration; import java.awt.event.*; import com.sun.j3d.utils.applet.MainFrame; import com.sun.j3d.utils.geometry.ColorCube; import com.sun.j3d.utils.universe.*; import javax.media.j3d.*; import javax.vecmath.*; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import javax.media.j3d.PhysicalBody; import java.awt.Graphics; import java.awt.Color; import javax.swing.JPanel; public class BrTestGratings extends Applet implements Runnable { View view, viewleft; private Canvas3D canvas; private GraphicsContext3D gc = null, gcLeft=null, gcAnu=null; private Geometry grt0, grt1, grt2, grt3; private Transform3D cmt = new Transform3D(); private Transform3D cmtleft=new Transform3D(); Transform3D temp=new Transform3D(); RotateGrating grat1=new RotateGrating(); RotateGrating grat2=new RotateGrating(); RotateGrating grat3=new RotateGrating(); private Alpha rotAlpha = new Alpha(-1, 20000); Appearance appear=new Appearance(); Shape3D shape=new Shape3D(); Graphics grp; private SimpleUniverse u = null; static Dimension screenSize =java.awt. Toolkit. getDefaultToolkit(). getScreenSize(); Color3f green = new Color3f(0.0f, 1.0f, 0.0f); Color3f blue = new Color3f(0.0f, 0.0f, 1.0f); Color3f red = new Color3f(1.0f, 0.0f, 0.0f); Color3f black = new Color3f(0.0f, 0.0f, 0.0f); int numOfArray = 200; double height=1.7, radius=1.2, step=1.0; double angle; public void renderLeft() { cmtleft.rotZ(Math.PI/2); cmtleft.mul(cmt); gc.setModelTransform(cmtleft); gc.setStereoMode(GraphicsContext3D.STEREO_LEFT); gc.draw(grt1); // gc.draw(grt3); } public void renderRight() { gc.setModelTransform(cmt); gc.setStereoMode(GraphicsContext3D.STEREO_RIGHT); gc.draw(grt2); // gc.draw(grt3); } public void run() { grat3.setParameter(numOfArray, height, radius, step, red); grt3=grat3.getRotate(); gc = canvas.getGraphicsContext3D(); gc.setBufferOverride(true); view = canvas.getView(); grat2.setParameter(numOfArray, height, radius, step, green); grt2=grat2.getRotate(); grat1.setParameter(numOfArray, height, radius, step, red); grt1 =grat1.getRotate(); while (true) { gc.setStereoMode(GraphicsContext3D.STEREO_BOTH); gc.clear(); angle = rotAlpha.value() * 2.0*Math.PI; cmt.rotY(-angle); renderLeft(); renderRight(); canvas.swap(); } } public BrTestGratings() { } public void init() { setLayout(new BorderLayout()); GraphicsConfigTemplate3D g3d = new GraphicsConfigTemplate3D(); g3d.setStereo(GraphicsConfigTemplate3D.REQUIRED); GraphicsConfiguration config = GraphicsEnvironment. getLocalGraphicsEnvironment(). getDefaultScreenDevice(). getBestConfiguration(g3d); canvas = new Canvas3D(config); canvas.stopRenderer(); canvas.setStereoEnable(true); canvas.setDoubleBufferEnable(true); add("Center", canvas); u = new SimpleUniverse(canvas); u.getViewingPlatform().setNominalViewingTransform(); new Thread(this).start(); } public void destroy() { u.removeAllLocales(); } public static void main(String[] args) { new MainFrame(new BrTestGratings(), screenSize.width, screenSize.height); } }