我发现这个代码在Opengl es中生成一个球体.我无法理解逻辑,有人可以给我一些见解.
private voID generateData(){
slicesBuffers = new floatBuffer[slices]; normalsBuffers = new floatBuffer[slices]; texCoordsBuffers = new floatBuffer[slices]; for (int i = 0; i < slices; i++) { float[] vertexCoords = new float[7 * (stacks + 1)]; float[] normalCoords = new float[4* (stacks + 1)]; float[] textureCoords = new float[10 * (stacks + 1)]; double Alpha0 = i * (2 * Math.PI) / slices; double Alpha1 = (i + 1) * (2 * Math.PI) / slices; float cosAlpha0 = (float) Math.cos(Alpha0); float sinAlpha0 = (float) Math.sin(Alpha0); float cosAlpha1 = (float) Math.cos(Alpha1); float sinAlpha1 = (float) Math.sin(Alpha1); for (int j = 0; j <= stacks; j++) { double beta = j * Math.PI / stacks - Math.PI / 2; float cosBeta = (float) Math.cos(beta); float sinBeta = (float) Math.sin(beta); Utils.setXYZ(vertexCoords, 6 * j, radius * cosBeta * cosAlpha1, radius * sinBeta, radius * cosBeta * sinAlpha1); Utils.setXYZ(vertexCoords, 6 * j + 3, radius * cosBeta * cosAlpha0, radius * sinBeta, radius * cosBeta * sinAlpha0); Utils.setXYZ(normalCoords, 6 * j, cosBeta * cosAlpha1, sinBeta, cosBeta * sinAlpha1); Utils.setXYZ(normalCoords, 6 * j + 3, cosBeta * cosAlpha0, sinBeta, cosBeta * sinAlpha0); Utils.setXY(textureCoords, 4 * j, ((float) (i + 1)) / slices, ((float) j) / stacks); Utils.setXY(textureCoords, 4 * j + 2, ((float) i) / slices, ((float) j) / stacks); } slicesBuffers[i] = floatBuffer.wrap(vertexCoords); normalsBuffers[i] = floatBuffer.wrap(normalCoords); texCoordsBuffers[i] = floatBuffer.wrap(textureCoords); } }
谢谢
解决方法:
对于球体生成理论,请参阅:
en.wikipedia.org/wiki/Sphere(Vertex)
en.wikipedia.org/wiki/UV_mapPing(纹理坐标)
http://groups.google.com/group/android-developers/browse_thread/thread/0030261b82ed71e5/338fc1dcbfe6945f?lnk=raot(Normal面)
你的代码是对的,它有一些问题,我做了一些修正:
public Sphere(int slices,int stacks, float radius, float H,float K,float Z, Bitmap image,Bitmap first,Bitmap second){ floatBuffer[] slicesBuffers = new floatBuffer[slices]; floatBuffer[] normalsBuffers = new floatBuffer[slices]; floatBuffer[] texCoordsBuffers = new floatBuffer[slices]; float[] total_vertexBuff; float[] total_normalsBuff; float[] total_textCoordsBuff; int vertex_counter = 0; int normals_counter = 0; int texCoords_counter = 0; int position_dst; float tmp[]; for (int i = 0; i < slices; i++) { float[] vertexCoords = new float[ 2 * 3 * (stacks + 1)]; float[] normalCoords = new float[ 2 * 3 *(stacks + 1)]; float[] textureCoords = new float[ 4 * (stacks + 1) ]; double Alpha0 = i * (2 * Math.PI) / slices; double Alpha1 = (i + 1) * (2 * Math.PI) / slices; float cosAlpha0 = (float) Math.cos(Alpha0); float sinAlpha0 = (float) Math.sin(Alpha0); float cosAlpha1 = (float) Math.cos(Alpha1); float sinAlpha1 = (float) Math.sin(Alpha1); for (int j = 0; j <= stacks; j++) { double beta = j * Math.PI / stacks - Math.PI / 2; float cosBeta = (float) Math.cos(beta); float sinBeta = (float) Math.sin(beta); setXYZ(vertexCoords, 6 * j, radius * cosBeta * cosAlpha1, radius * sinBeta, radius * cosBeta * sinAlpha1 ); setXYZ(vertexCoords, 6 * j + 3,radius * cosBeta * cosAlpha0,radius * sinBeta,radius * cosBeta * sinAlpha0); vertex_counter += 2; Log.d(TAG, "j:"+j); setXYZ(normalCoords, 6 * j,cosBeta * cosAlpha1,sinBeta,cosBeta * sinAlpha1); setXYZ(normalCoords, 6 * j + 3,cosBeta * cosAlpha0,sinBeta,cosBeta * sinAlpha0); normals_counter += 2; setXY(textureCoords, 4 * j,((float) (i + 1)) / slices,((float) j) / stacks); setXY(textureCoords, 4 * j + 2,((float) i) / slices,((float) j) / stacks); texCoords_counter += 2; } slicesBuffers[i] = floatBuffer.wrap(vertexCoords); normalsBuffers[i] = floatBuffer.wrap(normalCoords); texCoordsBuffers[i] = floatBuffer.wrap(textureCoords); } total_vertexBuff = new float[vertex_counter * 3]; total_normalsBuff = new float[normals_counter * 3]; total_textCoordsBuff = new float[texCoords_counter * 2]; position_dst = 0; // ricopio vertici for (int i = 0; i < slicesBuffers.length; i++) { for(int j = 0; j < slicesBuffers[i].capacity();j++,position_dst++) total_vertexBuff[position_dst] = slicesBuffers[i].get(j); } position_dst = 0; // ricopio normali for (int i = 0; i < normalsBuffers.length; i++) { for(int j = 0; j < normalsBuffers[i].capacity();j++,position_dst++) total_normalsBuff[position_dst] = normalsBuffers[i].get(j); } position_dst = 0; // ricopio coordinate texture for (int i = 0; i < texCoordsBuffers.length; i++) { for(int j = 0; j < texCoordsBuffers[i].capacity();j++,position_dst++) total_textCoordsBuff[position_dst] = texCoordsBuffers[i].get(j); } this.image = image; this.half_first = first; this.half_second = second; this.vertexBuffer = floatBuffer.wrap(total_vertexBuff); this.normalsBuffer = floatBuffer.wrap(total_normalsBuff); this.texCoordsBuffer = floatBuffer.wrap(total_textCoordsBuff); Log.d(TAG, "vertex_counter:"+vertex_counter); Log.d(TAG, "texCoords_counter:"+texCoords_counter); Log.d(TAG, "vertexBuffer:"+this.vertexBuffer.capacity()); Log.d(TAG, "texCoordsBuffer:"+this.texCoordsBuffer.capacity()); this.textures_IDs = IntBuffer.allocate(2); this.totalVertexCount = vertex_counter; this.setPlaneBuffer(); return;
}
我真的希望我帮助你.
再见
pedr0
总结以上是内存溢出为你收集整理的android – 在Opengl-es旋转地球仪全部内容,希望文章能够帮你解决android – 在Opengl-es旋转地球仪所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)