问题描述
我正在使用 JOGL 并试图弄清楚。我做了几个立方体,但我需要让 z 轴上的旋转像 x 和 y 轴上的旋转一样工作,我还需要帮助使它围绕中心立方体的中心旋转,而不是原点。我怎样才能做到这两点?
import com.jogamp.opengl.*;
import com.jogamp.opengl.awt.*;
import com.jogamp.opengl.glu.*;
import com.jogamp.opengl.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
public class test4 implements KeyListener,GLEventListener{
public static displayMode dm,dm_old;
private glu glu = new glu();
private float angle1 = 0f;
private float angle2 = 0f;
private float angle3 = 0f;
private boolean right = false;
private boolean left = false;
private boolean up = false;
private boolean down = false;
private boolean zup = false;
private boolean zdown = false;
public void cube(GL2 gl,float x,float y,float z){
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
gl.glEnable(GL2.GL_norMALIZE);
float[] diffuseLight = {1f,1f,0f};
float[] position = {10f,10f,1f};
gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_DIFFUSE,diffuseLight,0);
gl.glLightfv(GL2.GL_LIGHT0,GL2.GL_POSITION,position,0);
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT1);
gl.glEnable(GL2.GL_norMALIZE);
gl.glEnable(GL2.GL_COLOR_MATERIAL);
float[] position1 = {-10f,-10f,1f};
gl.glLightfv(GL2.GL_LIGHT1,0);
gl.glLightfv(GL2.GL_LIGHT1,position1,0);
gl.glLoadIdentity();
gl.glTranslatef(x,y,z - 5.0f);
gl.glrotatef(angle2,0f,0f);
gl.glrotatef(angle1,0f);
gl.glrotatef(angle3,1.0f);
gl.glTranslatef(0f,-5f);
gl.glBegin(GL2.GL_QUADS);
gl.glColor3f(0f,1f);
gl.glVertex3f(0.5f,0.5f,0.5f);
gl.glVertex3f(.5f,.5f,-0.5f);
gl.glVertex3f(.5f,-.5f,-.5f);
gl.glVertex3f(.5f,.5f);
gl.glColor3f(1f,0f);
gl.glVertex3f(.5f,.5f);
gl.glVertex3f(-.5f,.5f);
gl.glVertex3f(.5f,-.5f);
gl.glColor3f(0f,0f);
gl.glVertex3f(-.5f,-.5f);
gl.glVertex3f(-.5f,1f);
gl.glVertex3f(-.5f,-.5f);
gl.glColor3f(1f,-.5f);
gl.glEnd();
gl.glFlush();
}
@Override
public void display( GLAutoDrawable drawable ) {
final GL2 gl = drawable.getGL().getGL2();
gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT );
gl.glLoadIdentity();
if(up)
angle2 -= 0.5f;
if(down)
angle2 += 0.5f;
if(left)
angle1 -= 0.5f;
if(right)
angle1 += 0.5f;
if(zup)
angle3 -= 0.5f;
if(zdown)
angle3 += 0.5f;
cube(gl,0f);
cube(gl,1.5f,1.5f);
cube(gl,-1.5f);
cube(gl,-1.5f,-1.5f);
}
@Override
public void dispose( GLAutoDrawable drawable ) {
}
@Override
public void init( GLAutoDrawable drawable ) {
final GL2 gl = drawable.getGL().getGL2();
gl.glShadeModel( GL2.GL_SMOOTH );
gl.glClearColor( 0f,0f );
gl.glClearDepth( 1.0f );
gl.glEnable( GL2.GL_DEPTH_TEST );
gl.glDepthFunc( GL2.GL_LEQUAL );
gl.glHint( GL2.GL_PERSPECTIVE_CORRECTION_HINT,GL2.GL_NICEST );
}
@Override
public void reshape( GLAutoDrawable drawable,int x,int y,int width,int height ) {
final GL2 gl = drawable.getGL().getGL2();
if( height <=0 )
height =1;
final float h = ( float ) width / ( float ) height;
gl.glViewport( 0,width,height );
gl.glMatrixMode( GL2.GL_PROJECTION );
gl.glLoadIdentity();
glu.gluPerspective( 45f,h,1,20.0 );
gl.glMatrixMode( GL2.GL_MODELVIEW );
gl.glLoadIdentity();
}
public static void main( String[] args ) {
final GLProfile profile = GLProfile.get( GLProfile.GL2 );
GLCapabilities capabilities = new GLCapabilities( profile );
// The canvas
final GLCanvas glcanvas = new GLCanvas( capabilities );
test4 cube = new test4();
glcanvas.addGLEventListener( cube );
glcanvas.setSize( 800,800 );
final JFrame frame = new JFrame ("Arrow keys cubed");
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add( glcanvas );
frame.setSize( frame.getContentPane().getPreferredSize() );
frame.setFocusable(true);
frame.addKeyListener(cube);
glcanvas.setFocusable(false);
frame.setVisible( true );
final FPSAnimator animator = new FPSAnimator( glcanvas,300,true );
animator.start();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keypressed(KeyEvent e) {
int x = e.getKeyCode();
switch (x) {
case 37:
left = true;
break;
case 39:
right = true;
break;
case 38:
up = true;
break;
case 40:
down = true;
break;
case 96:
zup = true;
break;
case 110:
zdown = true;
break;
case 81:
System.exit(0);
}
}
@Override
public void keyreleased(KeyEvent e) {
int x = e.getKeyCode();
switch (x) {
case 37:
left = false;
break;
case 39:
right = false;
break;
case 38:
up = false;
break;
case 40:
down = false;
break;
case 96:
zup = false;
break;
case 110:
zdown = false;
break;
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)