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(); // ?????
}