2014-07-19 17 views
1

我對OpenGL和JOGL相當新,但我遇到了這個問題,我似乎無法找出解決方案。每當有霧或有光照時,它總是以平行於x軸的直線繪製。類是發生問題:JOGL霧和照明出現在一條直線而不是一個圓圈

公共類JoglCanvas延伸GLCanvas中實現GLEventListener { 私有靜態最後長的serialVersionUID = 1173053770896367688L;

public FPSAnimator animator; 
private GLU glu; 


public JoglCanvas(int width, int height, GLCapabilities capabilities){ 
    super(capabilities); 

    addGLEventListener(this); 
    setSize(width, height); 

} 


public void display(GLAutoDrawable drawable) { 
    GL2 gl = (GL2)drawable.getGL(); 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

    if(Settings.WireFrame){ 
     gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE); 
    }else{ 
     gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL); 
    } 


    //Draw player hb 
    //drawCube(new Cube(Settings.Player1.get_actual_location(), Settings.Player1.Size), gl); 

    //drawSphere(new Vector(Camera.Location.x, Camera.Location.y, Camera.Location.z), Settings.TEXTURE_SKY, Camera.ViewDistance, gl); 

    //Preparing lights 
     float SHINE_ALL_DIRECTIONS = 0; 
     float[] lightPos = {0, 0, 0, SHINE_ALL_DIRECTIONS}; 
     float[] lightColorAmbient = {0.2f, 0.2f, 0.2f, 0f}; 
     float[] lightColorSpecular = {0.8f, 0.8f, 0.8f, 0f}; 

     //Set Light parameters 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, lightPos, 0); 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_AMBIENT, lightColorAmbient, 0); 
     gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightColorSpecular, 0); 

     //Enable lighting 
     gl.glEnable(GL2.GL_LIGHT1); 
     gl.glEnable(GL2.GL_LIGHTING); 

     //Set material 
     float[] rgba = {0.4f, 0.5f, 0.7f}; 

     gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, rgba, 0); 
     gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, rgba, 0); 
     gl.glMaterialf(GL2.GL_FRONT, GL2.GL_SHININESS, 0.5f); 

     //Enable fog 
     gl.glPushMatrix(); 

     float Fog_distance = 90f; 
     float[] Fog_colour = {0,0,1f,0}; 


     gl.glEnable(GL2.GL_FOG); 
     gl.glHint(GL2.GL_FOG_HINT, GL2.GL_NICEST); 

     //gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_EXP); 
     gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_EXP2); 
     //gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_LINEAR); 

     gl.glFogf(GL2.GL_FOG_DENSITY, 0.005f); 
     gl.glFogfv(GL2.GL_FOG_COLOR, Fog_colour, 0); 
     gl.glFogf(GL2.GL_FOG_START, Fog_distance - 30); 
     gl.glFogf(GL2.GL_FOG_END, Fog_distance); 

     gl.glPopMatrix(); 

     for(int x = 0; x<99; x++){ 
      for(int z = 0; z<99; z++){ 
       float[] Current_Height = {Height[x][z], Height[x+1][z], Height[x][z+1], Height[x+1][z+1],}; 
       new Tile(new Vector(x*Tile.Size/2,0,z*Tile.Size/2), Current_Height).drawTile(gl); 
      } 
     } 
     setCamera(gl); 
} 
float[][] Height = new float[100][100]; 

private GL2 drawCube(Cube c, GL2 gl){ 
    //Set material 
    float[] rgba = {0.8f, 0.8f, 0.8f, 1f}; 

    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT, rgba, 1); 
    gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_SPECULAR, rgba, 0); 
    gl.glMaterialf(GL2.GL_FRONT, GL2.GL_SHININESS, 0.5f); 

    gl.glDisable(GL2.GL_TEXTURE_2D); 
    try{ 
     Settings.Textures[c.GraphicsID].enable(gl); 
     Settings.Textures[c.GraphicsID].bind(gl); 
    }catch(NullPointerException e){ 
    } 

    //drawSphere(c.Location, c.GraphicsID, 0.2f, gl); 

    final int x = 0, y = 1, z = 2; 


    final float[] TL = {0, 0, 0}; 
    final float[] BR = {c.Size.x, c.Size.y, c.Size.z}; 


    final float[] FrontTL = {TL[x], TL[y] ,TL[z]}; 
    final float[] FrontTR = {BR[x], TL[y], TL[z]}; 
    final float[] FrontBL = {TL[x], BR[y], TL[z]}; 
    final float[] FrontBR = {BR[x], BR[y], TL[z]}; 

    final float[] BackTL = {TL[x], TL[y], BR[z]}; 
    final float[] BackTR = {BR[x], TL[y], BR[z]}; 
    final float[] BackBL = {TL[x], BR[y], BR[z]}; 
    final float[] BackBR = {BR[x], BR[y], BR[z]}; 

    gl.glPushMatrix(); 

    gl.glTranslatef(c.Location.x, c.Location.y, c.Location.z); 
    gl.glRotatef(c.Rotation.x, c.Rotation.y, c.Rotation.z, 0); 
    //Draw Cube 

     // Front Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, 0.0f, 1.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(FrontTR, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(FrontBR, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, 0.0f, 1.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(FrontBR, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(FrontBL, 0); 
      gl.glEnd(); 

     //Left Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(-1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(BackTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBL, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(-1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBL, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(FrontBL, 0); 
      gl.glEnd(); 

     //Right Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTR, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(BackTR, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTR, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(FrontBR, 0); 
      gl.glEnd(); 


     //Bottom Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, -1.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontBL, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(BackBL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, -1.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontBL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(FrontBR, 0); 
      gl.glEnd(); 


     //Top Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(-1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(BackTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackTR, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(-1.0f, 0.0f, 0.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(FrontTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackTR, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(FrontTR, 0); 
      gl.glEnd(); 


     // Back Face. 
      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, 0.0f, -1.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(BackTL, 0); 

      gl.glTexCoord2f(1.0f, 0.0f); 
      gl.glVertex3fv(BackTR, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glEnd(); 

      gl.glBegin(GL2.GL_TRIANGLE_FAN); 
      gl.glNormal3f(0.0f, 0.0f, -1.0f); 

      gl.glTexCoord2f(0.0f, 0.0f); 
      gl.glVertex3fv(BackTL, 0); 

      gl.glTexCoord2f(1.0f, 1.0f); 
      gl.glVertex3fv(BackBR, 0); 

      gl.glTexCoord2f(0.0f, 1.0f); 
      gl.glVertex3fv(BackBL, 0); 
      gl.glEnd(); 

     // Restore old state. 
     gl.glPopMatrix(); 


    return gl; 
} 

private GL2 drawSphere(Vector Pos, int t, float r, GL2 gl){ 
    gl.glPushMatrix(); 

    gl.glTranslatef(Pos.x, Pos.y, Pos.z); 

    GLUquadric Sphere = glu.gluNewQuadric(); 
    glu.gluQuadricTexture(Sphere, false); 

    try{ 
     Settings.Textures[t].enable(gl); 
     Settings.Textures[t].bind(gl); 
     glu.gluQuadricTexture(Sphere, true); 
    }catch(Exception e){ 
     //System.err.println("Texture application " + e.getMessage()); 
    } 

    glu.gluQuadricDrawStyle(Sphere, GLU.GLU_FILL); 
    glu.gluQuadricNormals(Sphere, GLU.GLU_FLAT); 
    glu.gluQuadricOrientation(Sphere, GLU.GLU_INSIDE); 

    glu.gluSphere(Sphere, r, Settings.Slices, Settings.Stacks); 
    glu.gluDeleteQuadric(Sphere); 

    gl.glPopMatrix(); 
    return gl; 
} 


private void setCamera(GL2 gl){ 
    Camera.Location = Settings.Player1.get_eye_pos(); 

    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 

    float widthHeightRatio = (float) getWidth()/ (float) getHeight(); 

    glu.gluPerspective(Camera.FOV, widthHeightRatio, 1, Camera.ViewDistance); 

    glu.gluLookAt(Camera.Location.x, Camera.Location.y, Camera.Location.z, 
           Camera.Location.x+Camera.ViewPort.x, Camera.Location.y+Camera.ViewPort.y, Camera.Location.z+Camera.ViewPort.z, 
           0, 1, 0); 

    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

} 

public void dispose(GLAutoDrawable arg0) { 
} 

public void init(GLAutoDrawable drawable) { 
    Height[0][0] = 0; 
    for(int x = 0; x<100; x++){ 
     for(int z = 0; z<100; z++){ 
      Height[x][z] = Maths.RandFloat(-Maths.RandInt(-10, 10)/2, Maths.RandInt(-10, 10)/2); 
     } 
    } 

    this.addKeyListener(new KeyAdapter(){ 

     public void keyPressed(KeyEvent e){ 
      Settings.KeyBoard[e.getKeyCode()] = true; 
     } 

     public void keyReleased(KeyEvent e){ 
      Settings.KeyBoard[e.getKeyCode()] = false; 
     } 

    }); 


    this.addMouseListener(new MouseAdapter(){ 

     public void mousePressed(MouseEvent e){ 

      if(Settings.LockMouse){ 
       Settings.LockMouse = false; 
      }else{ 
       Settings.LockMouse = true; 
      } 
     } 

    }); 

    //LoadTexture 
    Settings.Textures[Settings.TEXTURE_STONE] = importTexture("Stone"); 
    Settings.Textures[Settings.TEXTURE_SKY] = importTexture("Sky"); 

    GL2 gl = (GL2)drawable.getGL(); 
    drawable.setGL(new DebugGL2(gl)); 

    //Global settings. 
    gl.glEnable(GL.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL.GL_LEQUAL); 

    gl.glShadeModel(GL2.GL_SMOOTH); 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); 

    gl.glClearColor(0f, 0f, 0f, 0f); 

    glu = new GLU(); 

    //Animator 
    animator = new FPSAnimator(this, 60); 
    animator.start(); 
} 

public Texture importTexture(String Loc){ 
    Texture t = null; 
    try{ 

     FileInputStream stream = new FileInputStream(new File("Resources/" + Loc + ".png")); 
     TextureData data = TextureIO.newTextureData(getGLProfile(), stream, true, "png"); 
     t = TextureIO.newTexture(data); 
    }catch(IOException e){ 
     System.err.println(e.getMessage() + "\n"); 
    } 
    return t; 
} 

public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
    GL gl = drawable.getGL(); 
    gl.glViewport(0, 0, width, height); 
} 



} 

有沒有什麼可以導致這條霧/照明線,而不是在一個圓圈?

編輯: 我現在已經去了,並創建了我自己的極座標系統,但是,我仍然有興趣知道什麼是錯誤的。

編輯2:

解決辦法:

private void setCamera(GL2 gl){ 
    Camera.Location = Settings.Player1.get_eye_pos(); 

    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 

    float widthHeightRatio = (float) getWidth()/ (float) getHeight(); 

    glu.gluPerspective(Camera.FOV, widthHeightRatio, 1, 10000); 


    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    glu.gluLookAt(Camera.Location.x, Camera.Location.y, Camera.Location.z, 
           Camera.Location.x+Camera.ViewPort.x, Camera.Location.y+Camera.ViewPort.y, Camera.Location.z+Camera.ViewPort.z, 
           0, 1, 0); 


    //Enable fog 

    float Fog_distance = Camera.ViewDistance; 
    float[] Fog_colour = {0,0,1f,0}; 


    gl.glEnable(GL2.GL_FOG); 
    gl.glHint(GL2.GL_FOG_HINT, GL2.GL_NICEST); 

    //gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_EXP); 
    gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_EXP2); 
    //gl.glFogi(GL2.GL_FOG_MODE, GL2.GL_LINEAR); 

    gl.glFogf(GL2.GL_FOG_DENSITY, 0.005f); 
    gl.glFogfv(GL2.GL_FOG_COLOR, Fog_colour, 0); 
    gl.glFogf(GL2.GL_FOG_START, Fog_distance - 30); 
    gl.glFogf(GL2.GL_FOG_END, Fog_distance); 







} 

回答

1

固定功能GL可與由視圖矩陣定義的特定眼睛空間,並期望該模型的組合物和視圖矩陣作爲GL_MODELVIEW矩陣(因此名稱)將頂點從物體空間轉換爲眼睛空間。照明和霧計算在眼睛空間中進行。

對於眼睛空間,使用相機位於原點處的對流,使用向上指向-z和y的方向。 GLu的lookAt()函數將會精確地生成該函數。

但是,此代碼

gl.glMatrixMode(GL2.GL_PROJECTION); 
gl.glLoadIdentity(); 

float widthHeightRatio = (float) getWidth()/ (float) getHeight(); 

glu.gluPerspective(Camera.FOV, widthHeightRatio, 1, Camera.ViewDistance); 

glu.gluLookAt(Camera.Location.x, Camera.Location.y, Camera.Location.z, 
          Camera.Location.x+Camera.ViewPort.x, Camera.Location.y+Camera.ViewPort.y, Camera.Location.z+Camera.ViewPort.z, 
          0, 1, 0); 

gl.glMatrixMode(GL2.GL_MODELVIEW); 
gl.glLoadIdentity(); 

結合投影和視圖矩陣到GL_PROJECTION矩陣。這樣做會打破燈光和霧氣,因爲現在GL認爲眼睛空間是現實世界空間。這意味着,照明和霧將不會取決於觀看位置。

相關問題