android– 在Opengl-es旋转地球仪

android– 在Opengl-es旋转地球仪,第1张

概述我发现这个代码在Opengles中生成一个球体.我无法理解逻辑,有人可以给我一些见解.privatevoidgenerateData(){slicesBuffers=newFloatBuffer[slices];normalsBuffers=newFloatBuffer[slices];texCoordsBuffers=newFloatBuffer

我发现这个代码在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旋转地球仪所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1099177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存