基本信息
源码名称:android 360度全景查看 实例源码下载
源码大小:4.43M
文件格式:.zip
开发语言:Java
更新时间:2015-03-08
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
package com.tim.shadow.ball;
import static android.opengl.GLES20.*;
import static android.opengl.Matrix.*;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.opengl.Matrix;
import com.tim.shadow.glutils.TimGL2Utils;
public class Ball implements Renderer {
Context mContext;
private int mProgram;
private int mAPositionHandler;
private int mUProjectMatrixHandler;
private int mATextureCoordHandler;
private final float[] projectMatrix = new float[16];
private int mSize;
private FloatBuffer vertexBuff;
private FloatBuffer textureBuff;
private int textrueID;
public Ball(Context context) {
mContext = context;
init();
}
public void init() {
int perVertex = 36;
double perRadius = 2 * Math.PI / (float) perVertex;
double perW = 1 / (float) perVertex;
double perH = 1 / (float) (perVertex);
ArrayList<Float> vetexList = new ArrayList<Float>();
ArrayList<Float> textureList = new ArrayList<Float>();
for (int a = 0; a < perVertex; a ) {
for (int b = 0; b < perVertex; b ) {
float w1 = (float) (a * perH);
float h1 = (float) (b * perW);
float w2 = (float) ((a 1) * perH);
float h2 = (float) (b * perW);
float w3 = (float) ((a 1) * perH);
float h3 = (float) ((b 1) * perW);
float w4 = (float) (a * perH);
float h4 = (float) ((b 1) * perW);
textureList.add(h1);
textureList.add(w1);
textureList.add(h2);
textureList.add(w2);
textureList.add(h3);
textureList.add(w3);
textureList.add(h3);
textureList.add(w3);
textureList.add(h4);
textureList.add(w4);
textureList.add(h1);
textureList.add(w1);
float x1 = (float) (Math.sin(a * perRadius / 2) * Math.cos(b
* perRadius));
float z1 = (float) (Math.sin(a * perRadius / 2) * Math.sin(b
* perRadius));
float y1 = (float) Math.cos(a * perRadius / 2);
float x2 = (float) (Math.sin((a 1) * perRadius / 2) * Math
.cos(b * perRadius));
float z2 = (float) (Math.sin((a 1) * perRadius / 2) * Math
.sin(b * perRadius));
float y2 = (float) Math.cos((a 1) * perRadius / 2);
float x3 = (float) (Math.sin((a 1) * perRadius / 2) * Math
.cos((b 1) * perRadius));
float z3 = (float) (Math.sin((a 1) * perRadius / 2) * Math
.sin((b 1) * perRadius));
float y3 = (float) Math.cos((a 1) * perRadius / 2);
float x4 = (float) (Math.sin(a * perRadius / 2) * Math
.cos((b 1) * perRadius));
float z4 = (float) (Math.sin(a * perRadius / 2) * Math
.sin((b 1) * perRadius));
float y4 = (float) Math.cos(a * perRadius / 2);
vetexList.add(x1);
vetexList.add(y1);
vetexList.add(z1);
vetexList.add(x2);
vetexList.add(y2);
vetexList.add(z2);
vetexList.add(x3);
vetexList.add(y3);
vetexList.add(z3);
vetexList.add(x3);
vetexList.add(y3);
vetexList.add(z3);
vetexList.add(x4);
vetexList.add(y4);
vetexList.add(z4);
vetexList.add(x1);
vetexList.add(y1);
vetexList.add(z1);
}
}
mSize = vetexList.size() / 3;
float texture[] = new float[mSize * 2];
for (int i = 0; i < texture.length; i ) {
texture[i] = textureList.get(i);
}
textureBuff = ByteBuffer.allocateDirect(texture.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
textureBuff.put(texture);
textureBuff.position(0);
float vetex[] = new float[mSize * 3];
for (int i = 0; i < vetex.length; i ) {
vetex[i] = vetexList.get(i);
}
vertexBuff = ByteBuffer.allocateDirect(vetex.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuff.put(vetex);
vertexBuff.position(0);
}
@Override
public void onDrawFrame(GL10 arg0) {
rotateM(mCurrMatrix, 0, -xAngle, 1, 0, 0);
rotateM(mCurrMatrix, 0, -yAngle, 0, 1, 0);
rotateM(mCurrMatrix, 0, -zAngle, 0, 0, 1);
glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GLES20.GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textrueID);
glUniformMatrix4fv(mUProjectMatrixHandler, 1, false,
getfinalMVPMatrix(), 0);
glDrawArrays(GL_TRIANGLES, 0, mSize);
}
public float xAngle;
public float yAngle;
public float zAngle;
final float mCurrMatrix[] = new float[16];
final float mMVPMatrix[] = new float[16];
public float[] getfinalMVPMatrix() {
Matrix.multiplyMM(mMVPMatrix, 0, projectMatrix, 0, mCurrMatrix, 0);
Matrix.setIdentityM(mCurrMatrix, 0);
return mMVPMatrix;
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
glViewport(0, 0, width, height);
GLES20.glEnable(GLES20.GL_CULL_FACE);
float ratio = width / (float) height;
frustumM(projectMatrix, 0, -ratio, ratio, -1, 1, 1, 20);
Matrix.setIdentityM(mCurrMatrix, 0);
Matrix.setIdentityM(mMVPMatrix, 0);
translateM(projectMatrix, 0, 0, 0, -2);
// rotateM(projectMatrix, 0, -90, 1, 0, 0);
scaleM(projectMatrix, 0, 4, 4, 4);
mProgram = TimGL2Utils.getProgram(mContext);
glUseProgram(mProgram);
mAPositionHandler = glGetAttribLocation(mProgram, "aPosition");
mUProjectMatrixHandler = glGetUniformLocation(mProgram,
"uProjectMatrix");
mATextureCoordHandler = glGetAttribLocation(mProgram, "aTextureCoord");
System.out.println("mAPositionHandler:" mAPositionHandler);
System.out.println("mUProjectMatrixHandler:" mUProjectMatrixHandler);
System.out.println("mATextureCoordHandler:" mATextureCoordHandler);
textrueID = TimGL2Utils.initTexture(mContext, R.drawable.p3);
System.out.println("textureID:" textrueID);
glVertexAttribPointer(mAPositionHandler, 3, GL_FLOAT, false, 0,
vertexBuff);
glVertexAttribPointer(mATextureCoordHandler, 2, GL_FLOAT, false, 0,
textureBuff);
glEnableVertexAttribArray(mAPositionHandler);
glEnableVertexAttribArray(mATextureCoordHandler);
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
}