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
Post a Comment