Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение фигуры в OpenGL 
:(
    Опции темы
BMWM3GTRE92
Дата 16.10.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
        
    }
    
    
}



Выводит обрезанный дом, примерно вот так:

user posted image

Помогите пожалуйста вывести домик как следует.
PM MAIL   Вверх
Domain
Дата 24.11.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 11.3.2010

Репутация: нет
Всего: нет



Помнится мне когда-то мы на работе писали что-то типа 3D движка, на самом деле это была прилага которая считывала полигоны из "x" файла и рисовала  их. Принцип был такой, был класс "Модель", в котором был массив класса например "Полигон" в котором был List<Point3f> points.  Рисовались модели.
Переопределяешь display и между gl.glBegin(GL.GL_TRIANGLES); и gl.glEnd(); в цикле рисуешь модели. Например так.


Код

Model model = new Model();
      for (Poligon p : model.getPoligons()) {
            gl.glColor3f(0.0f, 0.1f, 0.0f);
            gl.glVertex3f(p.getVertexes().get(0).x, p.getVertexes().get(0).y, p
                    .getVertexes().get(0).z);
            gl.glColor3f(colorX, colorY, colorZ);
            gl.glVertex3f(p.getVertexes().get(1).x, p.getVertexes().get(1).y, p
                    .getVertexes().get(1).z);
            gl.glColor3f(colorX, colorY, colorZ);
            gl.glVertex3f(p.getVertexes().get(2).x, p.getVertexes().get(2).y, p
                    .getVertexes().get(2).z);

        }



таким образом render'у можно было скормить любую модель и он ее рисовал. Только парсер мы свой писали. Не знаю какие ща есть в java, погугли. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.