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.

- Kelvin


>Delivered-To: [EMAIL PROTECTED]
>X-Originating-IP: [152.98.198.234]
>Mime-Version: 1.0
>X-OriginalArrivalTime: 14 Nov 2001 05:51:58.0856 (UTC)
FILETIME=[79623080:01C16CD0]
>Date: Wed, 14 Nov 2001 15:51:58 +1000
>From: Guang Bin Liu <[EMAIL PROTECTED]>
>Subject: [JAVA3D] Images not stable
>To: [EMAIL PROTECTED]
>
>Hi Friends:
>
>The attached are files for rendering two images to left/right eyes
>separately.  I tested this program on two PCs with Window2000 and Geforce II
>200/400 cards. When I run it on the PC with GeForce II 400, the images
>appear / disappear intermittently (but the left eye can only view the left
>image and the right eye only view right image).
>
>When I tested it on another PC with GeForce II 200, the images appear
>continuously.  But this time each eye will view two interchanging images
>intermittently (e.g., the left eye views the left image then righ image then
>left image again ...).  Can you please help me diagnise the reason of this
>problem?  Whether this is due to my Graphic Card configuration or due to
>bugs in Java3D?
>
>Thank you!
>
>Guang Bin Liu
>
>
>_________________________________________________________________
>Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp

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

import javax.media.j3d.*;
import javax.vecmath.*;

public class RotateGrating
{
    int N;// = 600;
    Color3f colour;

    double a=0, width, step;
    int v;
    double height, radius; //height=8.0, radius=4;
    double shift=1.0;

    QuadArray twistStrip;// = new QuadArray(N,
                         //QuadArray.COORDINATES  | QuadArray.COLOR_3);

  public void RotateGrating()
  {
    for(v = 0; v < N; v+=4, a=v*step*Math.PI/(N/2))
    {
      twistStrip.setCoordinate(v, new Point3d(radius*Math.cos(a),
                                  height,radius*Math.sin(a)));
      twistStrip.setCoordinate(v+1, new Point3d(radius*Math.cos(a),
                                  -height,radius*Math.sin(a)));
      twistStrip.setCoordinate(v+2, new Point3d(radius*Math.cos(a+width),
                                  -height, radius*Math.sin(a+width)));
      twistStrip.setCoordinate(v+3, new Point3d(radius*Math.cos(a+width),
                                   height, radius*Math.sin(a+width)));

      twistStrip.setColor(v, colour);
      twistStrip.setColor(v+1, colour);
      twistStrip.setColor(v+2, colour);
      twistStrip.setColor(v+3, colour);
   }
  }

      public  Geometry getRotate()
      {
         return twistStrip;
      }

      public void setParameter(int numberOfArrayIn,
                               double heightIn,
                               double radiusIn,
                               double widthIn,
                               Color3f clr)
      {
        height=heightIn;
        radius=radiusIn;
        N=numberOfArrayIn;
        step=widthIn;
        width=step*Math.PI/(N/4);
        twistStrip = new QuadArray(N,
                     QuadArray.COORDINATES  | QuadArray.COLOR_3);
        colour=clr;
        RotateGrating();
      }
}

Reply via email to