Java OpenGL 3.x - 将方形纹理应用于圆模型

时间:2014-01-03 19:57:29

标签: java opengl textures geometry

我有办法在OpenGL中生成像对象这样的圆的真实性。它是由一个可变数字组成的,如果数字为360,则360个单独的三角形将构成圆圈。

我的问题是你如何将一个方形纹理应用于整个圆圈,以便它使纹理适应圆圈?

编辑代码:

LoD =>详细程度。

public static float[] getVerts( int LoD ){
    float[] _spokeArray = new float[ (LoD*2) ];
    double rad = (360.0d / LoD) * (Math.PI / 180.0d);
    for ( int i = 0 ; i < LoD ; i++ ) {
        _spokeArray[ i*2 + 0 ] = (float) Math.cos( rad*i );
        _spokeArray[ i*2 + 1 ] = (float) Math.sin( rad*i );
    }
    float[] _vertArray = new float[ (LoD*9) ];
    for ( int i = 0 ; i < LoD ; i++ ) {
        _vertArray[ i*9 + 0 ] = 0.0f;
        _vertArray[ i*9 + 1 ] = 0.0f;
        _vertArray[ i*9 + 2 ] = 0.0f;

        _vertArray[ i*9 + 3 ] = _spokeArray[ i*2 + 0 ];
        _vertArray[ i*9 + 4 ] = _spokeArray[ i*2 + 1 ];
        _vertArray[ i*9 + 5 ] = 0.0f;

        if ( (i+1) == LoD ){
            _vertArray[ i*9 + 6 ] = 1.0f;
            _vertArray[ i*9 + 7 ] = 0.0f;
            _vertArray[ i*9 + 8 ] = 0.0f;
            break;
        }

        _vertArray[ i*9 + 6 ] = _spokeArray[ (i+1)*2 + 0 ];
        _vertArray[ i*9 + 7 ] = _spokeArray[ (i+1)*2 + 1 ];
        _vertArray[ i*9 + 8 ] = 0.0f;
    }

    return _vertArray;
}

public void setUpTexture() throws GLException, IOException {
    texture = TextureIO.newTexture( imagePath, true );
}

public void draw(GL gl) {
    gl.glBindBuffer( GL3.GL_ARRAY_BUFFER, Main._scene.indexOf( this ) );

    texture.enable( gl );
    texture.bind(   gl );
            // The indices are just: 0, 1, 2, 3, 4, 5 ... LoD*3
    gl.glDrawElements( GL.GL_TRIANGLES, indBuffer.capacity(), GL.GL_UNSIGNED_SHORT, 0 );
}

1 个答案:

答案 0 :(得分:0)

将纹理方块映射到磁盘会导致强烈的扭曲。

通常,仅使用纹理方块的内部圆盘部分(浪费一些空间),并且纹理坐标将是您的单位圆盘顶点坐标(从[-1,1]调整为[0,1])。顶点i的示例:

float u = _vertArray[i*9 + 0] * .5f + .5f;
float v = _vertArray[i*9 + 1] * .5f + .5f;

要仍然扭曲方形纹理以完全映射磁盘,可能的失真是使用Lp - 使用高p的Norm来模仿无穷大:

float const p = 30.f; // to adjust
float const epsilon = 0.00001f; // to adjust
float x  = _vertArray[i*9 + 0];
float y  = _vertArray[i*9 + 1];
float l2 = sqrt(x*x + y*y);
float lp = pow( pow(abs(x),p) + pow(abs(y),p), 1.f/p);
float xp = 0.f;
float yp = 0.f;
if( lp > epsilon )
{
    xp = x * l / lp;
    yp = y * l / lp;
}
float u  = xp * .5f + .5f;
float v  = yp * .5f + .5f;