2017-02-15 17 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

вы можете добавить несколько скриншотов? – starmole

+0

В этом случае лучший вопрос: почему куб не является кубом? – BDL

+0

@BDL Мне нужен ровно параллелепипед - разные поверхности. У меня более сложное приложение, но этот только маленький пример – Pablo

ответ

0

Вы определили поле, в котором размер x и y варьируется от -1 до 1, но ось z находится в диапазоне от -1 до 0. В то время как координаты текстуры одинаковы.

Либо настроить координаты текстуры сверху, снизу, слева & правильных лиц или сделать диапазон г от -1 до 0.