2017-02-15 88 views
0

我有一個簡單的紋理平行六面體。紋理均勻拉伸

import java.io.File; 
import java.io.IOException; 

import javax.swing.JFrame; 

import com.jogamp.opengl.*; 
import com.jogamp.opengl.awt.GLCanvas; 
import com.jogamp.opengl.glu.GLU; 
import com.jogamp.opengl.util.FPSAnimator; 
import com.jogamp.opengl.util.texture.Texture; 
import com.jogamp.opengl.util.texture.TextureIO; 

public class CubeTexture implements GLEventListener { 

private GLU glu = new GLU(); 
private float xrot,yrot,zrot; 
private int texture; 

@Override 
public void display(GLAutoDrawable drawable) { 

    final GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); // Reset The View 
    gl.glTranslatef(0f, 0f, -5.0f); 

    gl.glRotatef(xrot, 1.0f, 1.0f, 1.0f); 
    gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f); 
    gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f); 

    gl.glBindTexture(GL2.GL_TEXTURE_2D, texture); 
    gl.glBegin(GL2.GL_QUADS); 

    // Front Face 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, 0f); 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 0f); 

    // Back Face 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); 

    // Top Face 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(1.0f, 1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); 

    // Bottom Face 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 0f); 

    // Right face 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, -1.0f); 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, -1.0f); 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, 0f); 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 0f); 

    // Left Face 
    gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); 
    gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 0f); 
    gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 0f); 
    gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); 
    gl.glEnd(); 
    gl.glFlush(); 

    //change the speeds here 
    xrot += .1f; 
    yrot += .1f; 
    zrot += .1f; 
} 

@Override 
public void dispose(GLAutoDrawable drawable) { 
    // method body 
} 

@Override 
public void init(GLAutoDrawable drawable) { 

    final GL2 gl = drawable.getGL().getGL2(); 

    gl.glShadeModel(GL2.GL_SMOOTH); 
    gl.glClearColor(0f, 0f, 0f, 0f); 
    gl.glClearDepth(1.0f); 
    gl.glEnable(GL2.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL2.GL_LEQUAL); 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); 

    gl.glEnable(GL2.GL_TEXTURE_2D); 
    try{ 

     File im = new File("res/textures/PARED2.jpg"); 
     Texture t = TextureIO.newTexture(im, true); 
     texture= t.getTextureObject(gl); 

    }catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 

@Override 
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
    final GL2 gl = drawable.getGL().getGL2(); 
    if(height == 0) 
    height = 1; 

    final float h = (float) width/(float) height; 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 

    glu.gluPerspective(45.0f, h, 1.0, 20.0); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

public static void main(String[] args) { 
    final GLProfile profile = GLProfile.get(GLProfile.GL2); 
    GLCapabilities capabilities = new GLCapabilities(profile); 

    // The canvas 
    final GLCanvas glcanvas = new GLCanvas(capabilities); 
    CubeTexture r = new CubeTexture(); 

    glcanvas.addGLEventListener(r); 
    glcanvas.setSize(400, 400); 

    final JFrame frame = new JFrame (" Textured Cube"); 
    frame.getContentPane().add(glcanvas); 
    frame.setSize(frame.getContentPane().getPreferredSize()); 
    frame.setVisible(true); 
    final FPSAnimator animator = new FPSAnimator(glcanvas, 300, true); 

    animator.start(); 
} 

} 

紋理延伸到全表面的平行六面體的每個面上的主要問題。所以每張臉都看起來不一樣。

enter image description here

但實際上我不希望我的紋理被拉伸。我希望所有的表面都充滿了我的紋理,看起來相似。

+1

的z範圍可以添加一些截圖? – starmole

+0

在這種情況下,更好的問題是:爲什麼立方體不是立方體? – BDL

+0

@BDL我需要完全平行六面體 - 不同的表面。我有更復雜的應用程序,但這只是一個小例子 – Pablo

回答

0

您定義了一個框,其中x和y的大小範圍從-1到1,但z軸範圍從-1到0.紋理座標完全相同。

要麼調整紋理的頂部,底部座標,左向右&面或使從-1到0