Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JOGL、OpenGL中重塑形状_Java_Opengl_Jogl - Fatal编程技术网

Java 在JOGL、OpenGL中重塑形状

Java 在JOGL、OpenGL中重塑形状,java,opengl,jogl,Java,Opengl,Jogl,我遇到一个问题,在resize事件中,画布中的图形无法正确显示,直到在restrape()函数中调用repaint()。在调整大小的过程中是否调用了重塑()?为什么我需要再次调用repaint()?此外,当调整大小时,图形似乎首先在屏幕中选择一个随机区域,然后正确定位自己。它不是一步到位的 另外,在绘制图形时,是否可以按如下所示将它们填充到init()函数中,或者它们应该位于display()中 @覆盖 公共空白显示(GLAutoDrawable){ GL2 gl=drawable.getGL(

我遇到一个问题,在
resize
事件中,画布中的图形无法正确显示,直到在
restrape()
函数中调用
repaint()
。在调整大小的过程中是否调用了
重塑()
?为什么我需要再次调用
repaint()
?此外,当调整大小时,图形似乎首先在屏幕中选择一个随机区域,然后正确定位自己。它不是一步到位的

另外,在绘制图形时,是否可以按如下所示将它们填充到
init()
函数中,或者它们应该位于
display()

@覆盖
公共空白显示(GLAutoDrawable){
GL2 gl=drawable.getGL().getGL2();
gl.glClearColor(.0f、.0f、.2f、0.9f);
gl.glClear(GL2.gl_颜色_缓冲_位| GL2.gl_深度_缓冲_位);
gl.glLoadIdentity();
glu.gluLookAt(45,45,0,0,0,0,0,0.0,1.0,0.0);
glEnable冰川(GL2.Glu多样本);
gl.glPushMatrix();
gl.glCallList(2);
gl.glPopMatrix();
gl.glDisable(GL2.gl\u多样本);
gl.glFlush();
}
@凌驾
公共空间处置(可提取){
}
@凌驾
公共void init(GLAutoDrawable){
GL2 gl=drawable.getGL().getGL2();
glEnable(GL2.Glu深度试验);
gl.glDepthFunc(GL2.gl_-LESS);
glEnable总图(GL2.Glu CULL_面);
glEnable总图(GL2.Glu照明);
glEnable总称(GL2.Glu LIGHT0);
gl.glEnable(GL2.gl\U自动\U正常);
glEnable(GL2.Glu正常化);
gl.glFrontFace(GL2.GLU CCW);
gl.glCullFace(GL2.glu BACK);
gl.glHint(GL2.gl\u透视图\u校正\u提示,GL2.gl\u最佳);
gl.glShadeModel(GL2.glu平滑);
int buf[]=新的int[1];
int sbuf[]=新的int[1];
gl.glGetIntegerv(GL2.gl_样本_缓冲区,buf,0);
gl.glGetIntegerv(GL2.gl_样本,sbuf,0);
int ind=0;
int nind=0;//正常索引
gl.glNewList(1,GL2.gl_编译);
gl.glColorMaterial(GL2.gl_FRONT,GL2.gl_DIFFUSE);
glEnable(GL2.Glu颜色材料);
gl.glRotatef(45,0,1,0);
gl.glTranslatef(-tr_x,-tr_y,-tr_z);
而(ind
你在使用动画师吗?不.我没有使用动画师.我不能帮你编写代码,但我可以向你解释理论。调整大小时,将调用
restrape()
,在这里更新投影矩阵和视口,您已经在这样做了,所以看起来很好。但在此之后,您需要一个
display()
,在新调整大小的区域上再次渲染,因为由于大小已修改,您需要使用新的投影和视口再次渲染
init
看起来不错,但您使用的是不推荐使用的OpenGL,这是非常不鼓励的。您是指GL2吗?我应该使用什么?我的意思是你应该使用现代的OpenGL调用,比如
@Override
public void display(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glClearColor(.0f, .0f, .2f, 0.9f);
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    glu.gluLookAt(45, 45, 0, 0, 0, 0, 0.0, 1.0, 0.0);

    gl.glEnable(GL2.GL_MULTISAMPLE);
    gl.glPushMatrix();
    gl.glCallList(2);
    gl.glPopMatrix();
    gl.glDisable(GL2.GL_MULTISAMPLE);

    gl.glFlush();
}

@Override
public void dispose(GLAutoDrawable drawable) {
}

@Override
public void init(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glEnable(GL2.GL_DEPTH_TEST);
    gl.glDepthFunc(GL2.GL_LESS);
    gl.glEnable(GL2.GL_CULL_FACE);
    gl.glEnable(GL2.GL_LIGHTING);
    gl.glEnable(GL2.GL_LIGHT0);
    gl.glEnable(GL2.GL_AUTO_NORMAL);
    gl.glEnable(GL2.GL_NORMALIZE);
    gl.glFrontFace(GL2.GL_CCW);
    gl.glCullFace(GL2.GL_BACK);
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
    gl.glShadeModel(GL2.GL_SMOOTH);

    int buf[] = new int[1];
    int sbuf[] = new int[1];

    gl.glGetIntegerv(GL2.GL_SAMPLE_BUFFERS, buf, 0);
    gl.glGetIntegerv(GL2.GL_SAMPLES, sbuf, 0);

    int ind = 0;
    int nind = 0; // normal index

    gl.glNewList(1, GL2.GL_COMPILE);
    gl.glColorMaterial(GL2.GL_FRONT, GL2.GL_DIFFUSE);
    gl.glEnable(GL2.GL_COLOR_MATERIAL);
    gl.glRotatef(45, 0, 1, 0);
    gl.glTranslatef(-tr_x, -tr_y, -tr_z);
    while (ind < fvert.size()) {
        gl.glClear(GL2.GL_DEPTH_BUFFER_BIT);
        gl.glBegin(GL2.GL_TRIANGLES);
        gl.glColor4f(.94f, .43f, 0.12f, 0.5f); // upper border
        gl.glNormal3f(fnorm.get(nind + 4).x, fnorm.get(nind + 4).y, fnorm.get(nind + 4).z);
        gl.glVertex3f(fvert.get(ind + 8).x, fvert.get(ind + 8).y, fvert.get(ind + 8).z);
        gl.glVertex3f(fvert.get(ind + 9).x, fvert.get(ind + 9).y, fvert.get(ind + 9).z);
        gl.glVertex3f(fvert.get(ind + 10).x, fvert.get(ind + 10).y, fvert.get(ind + 10).z);

        gl.glEnd();

        ind = ind + 16;
        nind = nind + 8;
    }
    gl.glEndList();

            //buffer two init here.

}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
    GL2 gl = drawable.getGL().getGL2();

    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(45, w / (float) h, 0.1f, 1000.0);
    gl.glMatrixMode(GL2.GL_MODELVIEW);

    canvas.repaint();   //?????
}

  //*****Updated************
    @Override
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
    GL2 gl = drawable.getGL().getGL2();
    double fov = (Math.PI / 4.0);
    double zmm = Math.abs(mminz - mmaxz);
    double camdist = (zmm / 2.0) / Math.tan(fov / 2.0);

    gl.glViewport(0, 0, w, h);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(camdist, w / (float) h, 0.1f, 1000.0);
    gl.glMatrixMode(GL2.GL_MODELVIEW);

    display(drawable); 

    //canvas.repaint(); // ?????
}