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

-1에서 Z 범위는 일부 스크린 샷을 추가 할 수 있도록? – starmole

+0

이 경우 더 좋은 질문은 큐브가 큐브가 아닌 이유는 무엇입니까? – BDL

+0

@BDL 정확히 다른 평행 육면체가 필요합니다. 더 복잡한 애플리케이션이 있지만이 작은 예제는 – Pablo

답변

0

x 및 y 크기 범위는 -1에서 1까지이지만 z 축의 범위는 -1에서 0까지입니다. 텍스처 좌표는 모두 동일합니다.

어느 쪽 상단, 하단에 텍스처 좌표를 조정은, & 바로 얼굴을 왼쪽 또는 0