Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.10.2011
Репутация: нет Всего: нет
|
Доброго времени суток. Столкнулся с проблемой отображения полигонной фигуры в OpenGL: | Код | /* This is task of making a house, first try.
by Oleksandr Malyutin
*/ import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.Frame; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.FloatBuffer;
import javax.media.opengl.GL; import javax.media.opengl.GL2; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLEventListener; import javax.media.opengl.awt.GLCanvas; import javax.media.opengl.glu.GLU;
import com.jogamp.opengl.util.FPSAnimator; import com.jogamp.opengl.util.GLBuffers; import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener;
public class MyBox extends Frame implements GLEventListener, KeyListener{ private static final long serialVersionUID = 1L;
//set the size of the window public static final Dimension PREFERRED_FRAME_SIZE= new Dimension (900,600); public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException{ Frame f =new MyBox(); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } public float Ry = 0; public MyBox(){ super("Simple 3D box with OpenGL"); System.out.println("constructor of Lesson1"); GLCapabilities capabilities= new GLCapabilities(null); GLCanvas canvas = new GLCanvas(capabilities); canvas.addGLEventListener(this); add(canvas, BorderLayout.CENTER); //this is for animation FPSAnimator animator = new FPSAnimator(canvas,1); animator.add(canvas); animator.start(); canvas.addKeyListener(this);
} public Dimension getPreferredSize(){ return PREFERRED_FRAME_SIZE; } public void display (GLAutoDrawable drawable){ System.out.println("display()"); GL2 gl = drawable.getGL().getGL2(); final GLU glu = new GLU(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); // capabilities= new GLCapabilities(null); //GLCanvas canvas = new GLCanvas(capabilities); //FPSAnimator animator = new FPSAnimator(canvas,30); //animator.add(canvas); //animator.start(); //canvas.addKeyListener(this); //first three numbers -- XYZ position, where we are //second three numbers -- XYZ position, where we want to look //third three numbers -- normalized vector //glu.gluLookAt(1.0f, 0.8f, 1.9f, 0.0f, 0.3f, 0.0f, 0.0f, 1.0f, 0.0f); glu.gluLookAt(1.0f, 0.8f, 1.9f, 0.0f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f); gl.glTranslatef(0.8f, 0.2f, 1.9f); gl.glPushMatrix(); gl.glRotatef(Ry, 0, 1, 0); drawHouse((GL2)gl,null); gl.glPopMatrix(); //this.drawCube((GL2)gl,null); //drawHouse((GL2) gl, null); } public void displayChanged (GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){ System.out.println("displayChanged()"); } public void init(GLAutoDrawable drawable){ System.out.println("init()"); GL2 gl= (GL2) drawable.getGL().getGL2(); gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); gl.glColor3f(0.0f, 0.0f, 0.0f); gl.glPointSize(4.0f); } public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height){ System.out.println("reshape()"); GL2 gl= drawable.getGL().getGL2(); final GLU glu = new GLU(); gl.glViewport(0, 0, width, height); //gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(45, (width*1.0f)/height, 1, 20); } //the function that draws a cube protected void drawHouse(GL2 gl, Buffer pt){ System.out.println("Draw vertex House"); //the xyz of each point final float pt2[]= new float[]{ 0,0,0, //0 0,1,0, //1 1,0,0, //2 1,1,0, //3 0,0,2, //4 0,1,2, //5 1,0,2, //6 1,1,2, //7 //these points are for door 1,0,1.4f, //8 1,0.6f,1.4f, //9 1,0.6f,0.6f, //10 1,0,0.6f, //11 //these points are for front windows 1,0.4f, 1.8f, //12 1,0.6f, 1.8f, //13 1,0.6f, 1.6f, //14 1, 0.4f, 1.6f, //15 1,0.4f, 0.4f, //16 1,0.6f, 0.4f, //17 1,0.6f, 0.2f, //18 1, 0.4f, 0.2f, //19 //these point are for back windows 0,0.5f, 1.8f, //20 0,0.7f, 1.8f, //21 0,0.7f, 1.1f, //22 0, 0.5f, 1.1f, //23 0,0.5f, 0.9f, //24 0,0.7f, 0.9f, //25 0,0.7f, 0.2f, //26 0, 0.5f, 0.2f, //27 //these points are for the roof 0.5f,1.5f, 2.0f, //28 0.5f, 1.5f, 0.0f, //29 //additional pointers for front windows and doors 1,0, 1.8f, //30 1,1.0f, 1.8f, //31 1,1.0f, 1.6f, //32 1,0, 1.6f, //33 //additional pointers for door 1,1,1.4f, //34 1,1,0.6f, //35 1,0, 0.4f, //36 1,1, 0.4f, //37 1,1, 0.2f, //38 1,0, 0.2f, //39 //additional pointers for back windows 0,0, 1.8f, //40 0,1, 1.8f, //41 0,1, 1.1f, //42 0,0, 1.1f, //43 0,0, 0.9f, //44 0,1, 0.9f, //45 0,1, 0.2f, //46 0,0, 0.2f, //47 }; //set the colour to black gl.glColor3f(0.0f, 0.0f, 0.0f); FloatBuffer vb = (FloatBuffer) GLBuffers.newDirectGLBuffer(GL2.GL_FLOAT,196); vb.put(pt2); vb.rewind(); gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vb); final byte [] vertIndex = new byte [] { 6,30,31,7, 13,31,32,14, 12,30,33,15, 33,8,34,32, 9,10,35,34, 11,36,37,35, 36,39,19,16, 17,18,38,37, 39,2,3,38, 2,0,1,3, 6,7,5,4, 4,6,2,0, 47,0,1,46, 25,26,46,45, 44,47,27,24, 43,44,45,42, 40,43,23,20, 21,22,42,41, 4,40,41,5, 5,7,3,1, 7,28,29,3, 5,28,29,1, //the cube of house //6,2,3,7, //7,3,1,5, //5,1,0,4, //4,6,2,0, //0,2,3,1, //4,6,7,5, //the door //8,9,10,11, // the front windows //12,13,14,15, //16,17,18,19, //the rear windows //20,21,22,23, //24,25,26,27, //the roof //7,28,29,3, //5,28,29,1, }; ByteBuffer ib = (ByteBuffer) GLBuffers.newDirectGLBuffer(GL2.GL_UNSIGNED_BYTE, 196); ib.put(vertIndex); ib.rewind(); //make our house like a frame gl.glPolygonMode(gl.GL_BACK, gl.GL_LINE); gl.glPolygonMode(gl.GL_FRONT, gl.GL_LINE); gl.glDrawElements(GL2.GL_QUADS, 196, GL2.GL_UNSIGNED_BYTE, ib); gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); }
public void keyPressed(KeyEvent e){ if(e.getKeyCode()==KeyEvent.VK_ESCAPE){ System.exit(0); } if(e.getKeyCode()==KeyEvent.VK_D){ Ry=Ry+2; System.out.println("Event"); } if(e.getKeyCode()==KeyEvent.VK_A){ Ry=Ry-2; System.out.println("Event"); } }
protected void drawCube(GL2 gl, Buffer pt){ System.out.println("Draw vertex CUBE"); final float pt2[]= new float[]{ 0,0,0, 0,1,0, 1,0,0, 1,1,0, 0,0,1, 0,1,1, 1,0,1, 1,1,1, }; gl.glColor3f(0.0f, 0.0f, 0.0f); FloatBuffer vb = (FloatBuffer) GLBuffers.newDirectGLBuffer(GL2.GL_FLOAT,24); vb.put(pt2); vb.rewind(); gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); gl.glVertexPointer(3, GL2.GL_FLOAT, 0, vb); final byte [] vertIndex = new byte [] {6,2,3,7,5,1,0,4,7,3,1,5,4,6}; ByteBuffer ib = (ByteBuffer) GLBuffers.newDirectGLBuffer(GL2.GL_UNSIGNED_BYTE, 24); ib.put(vertIndex); ib.rewind(); gl.glDrawElements(GL2.GL_QUADS, 24, GL2.GL_UNSIGNED_BYTE, ib); gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); } public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} @Override public void dispose(GLAutoDrawable arg0) { // TODO Auto-generated method stub } }
|
Выводит обрезанный дом, примерно вот так:  Помогите пожалуйста вывести домик как следует.
|