>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);
}
}