java - Java3D JApplet Flickering with Rotation and Translation -


i'm making game using java3d. involves view translating "wasd" keys , rotating mouse. when rotate , translate @ same time, 3d shapes on screen flicker , forth.

i tried researching problem , people need double-buffer java3d automatically double buffers.

how can make program run smooth , flicker free?

here's portion of code including setup , rotation , translation methods:

import java.applet.applet; import java.awt.awtexception; import java.awt.borderlayout; import java.awt.graphicsconfiguration; import java.awt.point; import java.awt.robot; import java.awt.event.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.geometry.colorcube; import com.sun.j3d.utils.universe.simpleuniverse; import com.sun.j3d.utils.universe.viewingplatform;  public class playermechanics extends applet implements keylistener, mouselistener, mousemotionlistener {      runner runner;      simpleuniverse universe;      canvas3d c;      branchgroup maingroup = new branchgroup();      transformgroup charviewgroup = new transformgroup();     viewingplatform charvp;      transformgroup groundgroup;      final static int screenwidth = 900;     final static int screenheight = 540;      final float characterheight = 2.0f;      float mousex = 0.0f;     float mousey = 0.0f;      float speed = 0.0f;     float iteration = 0.0f;     float xinterval = 0.0f;     float zinterval = 0.0f;      float xloc = 0.0f;     float yloc = 0.0f;     float zloc = 0.0f;      float cvrotx = 0.0f;     float cvroty = 0.0f;     float cvrotz = 0.0f;      vector3f loc = new vector3f(xloc, yloc, zloc);      boolean moveforward = false;     boolean moveleft = false;     boolean movebackward = false;     boolean moveright = false;      boolean rotup = false;     boolean rotleft = false;     boolean rotdown = false;     boolean rotright = false;      public playermechanics()     {            setlayout(new borderlayout());          graphicsconfiguration config =                  simpleuniverse.getpreferredconfiguration();         c = new canvas3d(config);         add("center", c);          c.addkeylistener(this);         c.addmouselistener(this);         c.addmousemotionlistener(this);          universe = new simpleuniverse(c);          //position cursor in center of screen         repositioncursor();          //create cubes         for(float = 0.0f; < 0.4; = + 0.1f)         {             float cubesize = 0.5f;              float x = 0.0f;             float y = 0.0f;             float z = -5.0f;              if(a == 0.1f)             {                 x = -5.0f;                 y = 0.0f;                 z = 0.0f;             }             else if(a == 0.2f)             {                 x = 0.0f;                 y = 0.0f;                 z = 5.0f;             }             else if(a == 0.3f)             {                 x = 5.0f;                 y = 0.0f;                 z = 0.0f;             }              transformgroup tg = new transformgroup();             transform3d transform = new transform3d();             colorcube cube = new colorcube(cubesize);             vector3f vector = new vector3f(x, y, z);             transform.settranslation(vector);             tg.settransform(transform);             tg.addchild(cube);             maingroup.addchild(tg);         }          //set viewpoint         charviewgroup.setcapability(transformgroup.allow_transform_write);         charvp = universe.getviewingplatform();         charviewgroup = charvp.getmultitransformgroup().gettransformgroup(0);          resetviewingplatform();          universe.addbranchgraph(maingroup);          runner = new runner();         runner.start();     }      public class runner extends thread     {         public void run()         {             while(true)             {                 try                 {                            charactermovement();                      thread.sleep(50);                 }                 catch(exception e)                 {                     system.out.println("error encountered!  " +                                  e.getmessage() + "!");                 }             }         }     }      @override     public void mousedragged(mouseevent e){}      @override     public void mousemoved(mouseevent e)     {                float xzero = (float)(screenwidth/2);         float yzero = (float)(screenheight/2);          mousex = (float)(e.getx());         mousey = (float)(e.gety());          float newx = xzero - mousex;         float newy = yzero - mousey;          changerotationview(newx, newy);         repositioncursor();     }      @override     public void keypressed(keyevent e)     {                int keycode = e.getkeycode();          switch(keycode)         {             case keyevent.vk_w:                 moveforward = true;                 break;             case keyevent.vk_a:                 moveleft = true;                 break;             case keyevent.vk_s:                 movebackward = true;                 break;             case keyevent.vk_d:                 moveright = true;                 break;              //press esc close program                 case keyevent.vk_escape:                 system.exit(0);                 break;         }     }      @override     public void keyreleased(keyevent e)     {            int keycode = e.getkeycode();          switch(keycode)         {             case keyevent.vk_w:                 moveforward = false;                 break;             case keyevent.vk_a:                 moveleft = false;                 break;             case keyevent.vk_s:                 movebackward = false;                 break;             case keyevent.vk_d:                 moveright = false;                 break;         }     }      @override     public void keytyped(keyevent e){}      @override     public void mouseclicked(mouseevent e){}      @override     public void mouseentered(mouseevent e){}      @override     public void mouseexited(mouseevent e){}      @override     public void mousepressed(mouseevent e){}      @override     public void mousereleased(mouseevent e){}      public void resetviewingplatform()     {            transform3d charviewtrans = new transform3d();         charviewgroup.gettransform(charviewtrans);          //set rotation         transform3d charviewroty = new transform3d();         transform3d charviewrotx = new transform3d();         charviewroty.roty(cvroty);         charviewrotx.rotx(cvrotx);         charviewtrans.mul(charviewroty, charviewrotx);          transform3d charviewthproty = new transform3d();         transform3d charviewthprotx = new transform3d();         charviewthproty.roty(cvroty);         charviewthprotx.rotx(-0.1f);          //set translation         loc = new vector3f(xloc, yloc, zloc);          charviewtrans.settranslation(loc);          charviewgroup.settransform(charviewtrans);     }      public void charactermovement()     {                float angle = cvroty;          float walkspeed = 0.3f;          byte xsign = 1;         byte zsign = 1;          boolean flipflop = false;          //quadrant         if(cvroty < (float)(-math.pi/2) && cvroty > (float)(-math.pi))         {             angle = (float)(-math.pi) - cvroty;              xsign = 1;             zsign = 1;         }         //quadrant ii         if(cvroty < 0 && cvroty > (float)(-math.pi/2))         {             xsign = 1;             zsign = -1;             flipflop = true;         }         //quadrant iii         if(cvroty > 0 && cvroty < (float)(math.pi/2))         {             xsign = -1;             zsign = -1;         }         //quadrant iv         if(cvroty > (float)(math.pi/2) && cvroty < (float)(math.pi))         {             angle = (float)(math.pi) - cvroty;              xsign = -1;             zsign = 1;             flipflop = true;         }          xinterval = walkspeed*(float)(math.sin(angle));         zinterval = walkspeed*(float)(math.cos(angle));          if(moveforward)         {             xloc = xloc + (math.abs(xinterval)*xsign);             zloc = zloc + (math.abs(zinterval)*zsign);         }         if(moveleft)         {             if(!flipflop)             {                 xloc = xloc + (math.abs(zinterval)*xsign);                 zloc = zloc - (math.abs(xinterval)*zsign);             }             else             {                 xloc = xloc + (math.abs(zinterval)*-xsign);                 zloc = zloc - (math.abs(xinterval)*-zsign);             }         }            if(movebackward)         {             xloc = xloc - (math.abs(xinterval)*xsign);             zloc = zloc - (math.abs(zinterval)*zsign);         }         if(moveright)         {             if(!flipflop)             {                 xloc = xloc - (math.abs(zinterval)*xsign);                 zloc = zloc + (math.abs(xinterval)*zsign);             }             else             {                 xloc = xloc - (math.abs(zinterval)*-xsign);                 zloc = zloc + (math.abs(xinterval)*-zsign);             }         }          resetviewingplatform();     }      public void changerotationview(float x, float y)     {         //rotate y-axis         cvroty = cvroty + (x/100)/2;         if(cvroty >= (float)(math.pi))         {             cvroty = cvroty - (float)(2*math.pi);         }         else if(cvroty <= (float)(-math.pi))         {             cvroty = cvroty + (float)(2*math.pi);         }          //rotate x-axis         if(cvrotx <= (float)(math.pi/2) && cvrotx >= (float)(-math.pi/2))         {             cvrotx = cvrotx + (y/100)/2;         }         else         {             if(cvrotx <= (float)(-math.pi/2))             {                     cvrotx = (float)((-math.pi/2)+0.001);             }             if(cvrotx >= (float)(math.pi/2))             {                 cvrotx = (float)((math.pi/2)-0.001);             }          }          resetviewingplatform();     }      public void repositioncursor()     {         try          {             point windowloc = c.getlocationonscreen();              int xcoord = (windowloc.x + (screenwidth/2));             int ycoord = (windowloc.y + (screenheight/2));              robot robot = new robot();             robot.mousemove(xcoord, ycoord);         }         catch(awtexception e){}     }      public static void main(string[] args)     {         playermechanics playermechanics = new playermechanics();          new mainframe(playermechanics, screenwidth, screenheight);     } } 

any appreciated. thanks!


Comments

Popular posts from this blog

php - render data via PDO::FETCH_FUNC vs loop -

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

The canvas has been tainted by cross-origin data in chrome only -