OpenGL ES的工具为Android [英] OpenGL ES Tools for Android
问题描述
在哪里可以找到所有的工具,在OpenGL ES设计复杂的对象?
Where can i find all the tools for designing complex Object in OpenGL ES?
像正方形,立方体,sphers等
like squares,cubes,sphers ect
推荐答案
只是模拟你的对象,并将其导出到OBJ文件,那么你可以简单地加载OBJ文件到您的场景。
Just model your objects and export them to OBJ file, then you can simply load the OBJ file into your scene.
下面是code我写信给我的加载OBJ文件,我出口他们形成玛雅。 请注意,这更像是实验code,所以它是不干净的,但我测试了它,完美的作品。
Here is the code I wrote to load my OBJ files which I exported them form Maya. Kindly note that this is more like experimental code, so it is not clean, but I tested it and works perfectly.
Vector3D类包含的X,Y和Z变量,和面类持有的UVW,顶点和顶点法线的ArrayList
Vector3D class holds the X,Y and Z variables, and Face class holds an ArrayList of UVWs, Vertices, and Vertex Normals.
和你有通过调用顺便说一句与glDrawElements吸引你的对象。 希望这个人会帮=)
And you have to draw your object by calling glDrawElements btw. Hope that this one will help =)
public class Model {
// Constants
private static final int FLOAT_SIZE_BYTES = 4;
private static final int SHORT_SIZE_BYTES = 2;
private FloatBuffer _vb;
private FloatBuffer _nb;
private ShortBuffer _ib;
private FloatBuffer _tcb;
private short[] indices;
private float[] tempV;
private float[] tempVt;
private float[] tempVn;
private ArrayList<Vector3D> vertices;
private ArrayList<Vector3D> vertexTexture;
private ArrayList<Vector3D> vertexNormal;
private ArrayList<Face> faces;
private int vertexCount;
private ArrayList<GroupObject> groupObjects;
//Android Stuff!
private Context context;
private int modelID;
public Model(int modelID, Context activity)
{
this.vertices = new ArrayList<Vector3D>();
this.vertexTexture = new ArrayList<Vector3D>();
this.vertexNormal = new ArrayList<Vector3D>();
this.faces = new ArrayList<Face>();
this.groupObjects = new ArrayList<GroupObject>();
this.modelID = modelID;
this.context = activity;
loadFile();
}
private int loadFile()
{
InputStream inputStream = context.getResources().openRawResource(modelID);
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
try {
loadOBJ(in);
Log.d("LOADING FILE", "FILE LOADED SUCESSFULLY====================");
} catch (IOException e) {
e.printStackTrace();
}
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
return 1;
}
private void loadOBJ(BufferedReader in) throws IOException
{
Log.d("LOADING FILE", "STARTING!====================");
GroupObject defaultObject = new GroupObject();
GroupObject currentObject = defaultObject;
this.groupObjects.add(defaultObject);
String Line; // Stores ever line we read!
String[] Blocks; // Stores string fragments after the split!!
String CommandBlock; // Stores Command Blocks such as: v, vt, vn, g, etc...
while((Line = in.readLine()) != null)
{
Blocks = Line.split(" ");
CommandBlock = Blocks[0];
// Log.d("COMMAND BLOCK" , "---------- " + CommandBlock + " ----------");
if(CommandBlock.equals("g"))
{
if(Blocks[1] == "default")
currentObject = defaultObject;
else
{
GroupObject groupObject = new GroupObject();
groupObject.setObjectName(Blocks[1]);
currentObject = groupObject;
groupObjects.add(groupObject);
}
}
if(CommandBlock.equals("v"))
{
Vector3D vertex = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), Float.parseFloat(Blocks[3]));
this.vertices.add(vertex);
// Log.d("VERTEX DATA", " " + vertex.getX() + ", " + vertex.getY() + ", " + vertex.getZ());
}
if(CommandBlock.equals("vt"))
{
Vector3D vertexTex = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), 0.0f);
this.vertexTexture.add(vertexTex);
// Log.d("TEXTURE DATA", " " + vertexTex.getX() + ", " + vertexTex.getY() + ", " + vertexTex.getZ());
}
if(CommandBlock.equals("vn"))
{
Vector3D vertexNorm = new Vector3D(Float.parseFloat(Blocks[1]), Float.parseFloat(Blocks[2]), Float.parseFloat(Blocks[3]));
this.vertexNormal.add(vertexNorm);
// Log.d("NORMAL DATA", " " + vertexNorm.getX() + ", " + vertexNorm.getY() + ", " + vertexNorm.getZ());
}
if(CommandBlock.equals("f"))
{
Face face = new Face();
faces.add(face);
String[] faceParams;
for(int i = 1; i < Blocks.length ; i++)
{
faceParams = Blocks[i].split("/");
face.getVertices().add(this.vertices.get(Integer.parseInt(faceParams[0]) - 1));
if(faceParams[1] == ""){}
else
{
face.getUvws().add(this.vertexTexture.get(Integer.parseInt(faceParams[1]) - 1));
face.getNormals().add(this.vertexNormal.get(Integer.parseInt(faceParams[2]) - 1));
}
}
}
}
// fillInBuffers();
fillInBuffersWithNormals();
Log.d("OBJ OBJECT DATA", "V = " + vertices.size() + " VN = " + vertexTexture.size() + " VT = " + vertexNormal.size());
}
private void fillInBuffers() {
int facesSize = faces.size();
vertexCount = facesSize * 3;
tempV = new float[facesSize * 3 * 3];
tempVt = new float[facesSize * 2 * 3];
indices = new short[facesSize * 3];
for(int i = 0; i < facesSize; i++)
{
Face face = faces.get(i);
tempV[i * 9] = face.getVertices().get(0).getX();
tempV[i * 9 + 1] = face.getVertices().get(0).getY();
tempV[i * 9 + 2] = face.getVertices().get(0).getZ();
tempV[i * 9 + 3] = face.getVertices().get(1).getX();
tempV[i * 9 + 4] = face.getVertices().get(1).getY();
tempV[i * 9 + 5] = face.getVertices().get(1).getZ();
tempV[i * 9 + 6] = face.getVertices().get(2).getX();
tempV[i * 9 + 7] = face.getVertices().get(2).getY();
tempV[i * 9 + 8] = face.getVertices().get(2).getZ();
tempVt[i * 6] = face.getUvws().get(0).getX();
tempVt[i * 6 + 1] = face.getUvws().get(0).getY();
tempVt[i * 6 + 2] = face.getUvws().get(1).getX();
tempVt[i * 6 + 3] = face.getUvws().get(1).getY();
tempVt[i * 6 + 4] = face.getUvws().get(2).getX();
tempVt[i * 6 + 5] = face.getUvws().get(2).getY();
indices[i * 3] = (short) (i * 3);
indices[i * 3 + 1] = (short) (i * 3 + 1);
indices[i * 3 + 2] = (short) (i * 3 + 2);
}
_vb = ByteBuffer.allocateDirect(tempV.length
* FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
_vb.put(tempV);
_vb.position(0);
_tcb = ByteBuffer.allocateDirect(tempVt.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
_tcb.put(tempVt);
_tcb.position(0);
_ib = ByteBuffer.allocateDirect(indices.length
* SHORT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer();
_ib.put(indices);
_ib.position(0);
}
private void fillInBuffersWithNormals() {
int facesSize = faces.size();
vertexCount = facesSize * 3;
tempV = new float[facesSize * 3 * 3];
tempVt = new float[facesSize * 2 * 3];
tempVn = new float[facesSize * 3 * 3];
indices = new short[facesSize * 3];
for(int i = 0; i < facesSize; i++)
{
Face face = faces.get(i);
tempV[i * 9] = face.getVertices().get(0).getX();
tempV[i * 9 + 1] = face.getVertices().get(0).getY();
tempV[i * 9 + 2] = face.getVertices().get(0).getZ();
tempV[i * 9 + 3] = face.getVertices().get(1).getX();
tempV[i * 9 + 4] = face.getVertices().get(1).getY();
tempV[i * 9 + 5] = face.getVertices().get(1).getZ();
tempV[i * 9 + 6] = face.getVertices().get(2).getX();
tempV[i * 9 + 7] = face.getVertices().get(2).getY();
tempV[i * 9 + 8] = face.getVertices().get(2).getZ();
tempVn[i * 9] = face.getNormals().get(0).getX();
tempVn[i * 9 + 1] = face.getNormals().get(0).getY();
tempVn[i * 9 + 2] = face.getNormals().get(0).getZ();
tempVn[i * 9 + 3] = face.getNormals().get(1).getX();
tempVn[i * 9 + 4] = face.getNormals().get(1).getY();
tempVn[i * 9 + 5] = face.getNormals().get(1).getZ();
tempVn[i * 9 + 6] = face.getNormals().get(2).getX();
tempVn[i * 9 + 7] = face.getNormals().get(2).getY();
tempVn[i * 9 + 8] = face.getNormals().get(2).getZ();
tempVt[i * 6] = face.getUvws().get(0).getX();
tempVt[i * 6 + 1] = face.getUvws().get(0).getY();
tempVt[i * 6 + 2] = face.getUvws().get(1).getX();
tempVt[i * 6 + 3] = face.getUvws().get(1).getY();
tempVt[i * 6 + 4] = face.getUvws().get(2).getX();
tempVt[i * 6 + 5] = face.getUvws().get(2).getY();
indices[i * 3] = (short) (i * 3);
indices[i * 3 + 1] = (short) (i * 3 + 1);
indices[i * 3 + 2] = (short) (i * 3 + 2);
}
_vb = ByteBuffer.allocateDirect(tempV.length
* FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
_vb.put(tempV);
_vb.position(0);
_tcb = ByteBuffer.allocateDirect(tempVt.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
_tcb.put(tempVt);
_tcb.position(0);
_nb = ByteBuffer.allocateDirect(tempVn.length * FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
_nb.put(tempVn);
_nb.position(0);
_ib = ByteBuffer.allocateDirect(indices.length
* SHORT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asShortBuffer();
_ib.put(indices);
_ib.position(0);
}
public FloatBuffer getVertices()
{
return _vb;
}
public FloatBuffer getTexCoords()
{
return _tcb;
}
public ShortBuffer getIndices()
{
return _ib;
}
public FloatBuffer getNormals() {
return _nb;
}
}
如果这个回答你的问题,请投票支持它;)
If this answers your question please vote for it ;)
这篇关于OpenGL ES的工具为Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!