OpenGL旋转和缩放的问题

时间:2014-06-20 23:24:15

标签: java opengl rotation scale

我刚刚开始用java尝试一些OpenGL。我下载了LWJGL和Slick-Util Library。现在我试图在屏幕上绘制一些工作得很好的图像。但我必须遇到大问题:

  1. 当我旋转图像并且大约45°时,您可以在角落处看到相同图像的某些位,就像它是具有相同图像的精灵图片一样,可以旋转。

  2. 如何缩放图像?它非常小,glScale()函数可以缩放图像本身,但不会缩放它打印的空间。因此,如果图像的大小为16 * 16像素并且我将其放大,我只看到16 * 16像素中缩放图像的一部分

  3. 这是我的OpenGL代码:

    public class Widget {
    
    String name;
    int angle;
    
    public Texture image_texture;
    public String image_path ;
    public int image_ID;
    
    public int cord_x = 0;
    public int cord_y = 0;
    
    
    static LinkedList<Widget> llwidget = new LinkedList<Widget>();
    
    public Widget(String path){
        llwidget.add(this);
    
        image_path = path;
        try {
            image_texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(image_path), GL_NEAREST);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        };
        image_ID = image_texture.getTextureID();
    
        glEnable(GL_TEXTURE_2D);              
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);         
    
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glViewport(0,0,Display.getWidth(),Display.getHeight());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, Display.getWidth(),Display.getHeight(), 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
    
    }
    
    void render(){
    
    
    
        glMatrixMode(GL_TEXTURE);
        glLoadIdentity();
        glTranslatef(0.5f,0.5f,0.0f);
    
        //! Graphics bug 
        glRotatef(angle,0.0f,0.0f,1.0f);
        //
    
        glTranslatef(-0.5f,-0.5f,0.0f);
    
        //! Doesn't work
        glScalef(2f, 2f, 2f);
        //
    
        glMatrixMode(GL_MODELVIEW);
        Color.white.bind();
        image_texture.bind();
    
    
    
        glBegin(GL_QUADS);
        glTexCoord2f(0,0);
        glVertex2f(cord_x, Display.getHeight() - cord_y);
        glTexCoord2f(1,0);
        glVertex2f(cord_x+image_texture.getTextureWidth(),Display.getHeight() - cord_y);
        glTexCoord2f(1,1);
        glVertex2f(cord_x+image_texture.getTextureWidth(),Display.getHeight() - cord_y+image_texture.getTextureHeight());
        glTexCoord2f(0,1);
        glVertex2f(cord_x,Display.getHeight() - cord_y+image_texture.getTextureHeight());
    
    
        glEnd();
    
    
    }
    
    
    }
    

1 个答案:

答案 0 :(得分:0)

问题1: 在GL_TEXTURE模式下调用glScalef(2f,2f,2f)会导致四边形内部纹理的缩放,其大小由glVertex2f调用确定。这可能会导致四边形边缘出现不必要的伪影。

问题2: 这个问题的主要问题是当调用glScalef(2f,2f,2f)时,程序不处于允许转换四元坐标的状态。在调用glMatrixMode(GL_TEXTURE)之后,所有后续矩阵运算都会影响纹理矩阵。要获得使用glVertex2f绘制的四边形的缩放效果,您需要在调用glScale2f之前进入GL_MODELVIEW模式。

替代: 使用glVertex2f,您可以确定绘制四边形的坐标。 glVertex2f的参数是绘制顶点的坐标。所以改变这个参数也可以做到这一点。