我有办法在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 );
}
答案 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;