我一直在寻找几天来找到我的问题的答案。我已经通过教科书查看了几个网站等...从我能看到我的代码应该正确渲染。我已经把我的脸扔在我的键盘上反复试图找到错误:(。 在这里。我有一个简单的.OBJ立方体从搅拌机已被设置为三角形,所以我有3个指数,每面。我有一个解析器解析在总共8个顶点和36个指数。我只是不知道该怎么再这里做的是我的代码...请帮助! 在此先感谢。.OBJ立方体在OPENGL中不能正确渲染ES
enter code here
this is the .OBJ file
# Blender v2.62 (sub 0) OBJ File: ''
# www.blender.org
mtllib tcubetest.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
usemtl Material
s off
f 5 1 4
f 5 4 8
f 3 7 8
f 3 8 4
f 2 6 3
f 6 7 3
f 1 5 2
f 5 6 2
f 5 8 6
f 8 7 6
f 1 2 3
f 1 3 4
这是正在做解析。
enter code here
Context context;
public ArrayList<Float> v = new ArrayList<Float>();
public ArrayList<Short> f = new ArrayList<Short>();
Parser(Context context) {
this.context = context;
BufferedReader reader = null;
String line = null;
try { // try to open file
reader = new BufferedReader(new InputStreamReader(context
.getResources().getAssets().open("tcubetest.obj")));
} catch (IOException e) {
}
try {
while ((line = reader.readLine()) != null) {
if (line.startsWith("v")) {
processVLine(line);
} else if (line.startsWith("f")) {
processFLine(line);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void processVLine(String line) {
String[] tokens = line.split("[ ]+"); // split the line at the spaces
int c = tokens.length;
for (int i = 1; i < c; i++) { // add the vertex to the vertex array
v.add(Float.valueOf(tokens[i]));
}
}
private void processFLine(String line) {
String[] tokens = line.split("[ ]+");
int c = tokens.length;
if (tokens[1].matches("[0-9]+")) {// f: v
//if (c == 4) {
for (int i = 1; i < c; i++) {
Short s = Short.valueOf(tokens[i]);
s--;
f.add(s);
}
}
}
//THIS IS THE CUBE CLASS
public class Cube {
FloatBuffer vertBuff;
ShortBuffer faceBuff;
float[] verts;
short[] faces;
Cube(ArrayList<Float> vertices, ArrayList<Short> facesa) {
verts = new float[vertices.size()];
faces = new short[facesa.size()];
for (int index = 0; index < verts.length; index++) {
verts[index] = vertices.get(index);
}
for (int index = 0; index < faces.length; index++) {
faces[index] = facesa.get(index);
}
ByteBuffer vbb = ByteBuffer.allocateDirect(verts.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertBuff = vbb.asFloatBuffer();
vertBuff.put(verts);
vertBuff.position(0);
vbb = ByteBuffer.allocateDirect(faces.length * 4);
vbb.order(ByteOrder.nativeOrder());
faceBuff = vbb.asShortBuffer();
faceBuff.put(faces);
faceBuff.position(0);
}
public void draw(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
gl.glColor4f(1.0f, 0.0f, 0.0f, .2f);
gl.glDrawElements(GL10.GL_TRIANGLES, faces.length,
GL10.GL_UNSIGNED_BYTE, faceBuff);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
} 用于制作用于绘制阵列的阵列
enter code here
public void makeArray(float ver[], short fac[]){
finals = new float[fac.length];
for(int index = 0; index < fac.length; index++){
finals[index] = ver[fac[index]];
}
ByteBuffer vbb = ByteBuffer.allocateDirect(finals.length *4);
vbb.order(ByteOrder.nativeOrder());
vertBuff = vbb.asFloatBuffer();
vertBuff.put(finals);
vertBuff.position(0);
}
自从第一篇文章以来,我一直在关注这个问题......尝试我能想到的任何事情。代码本身并不复杂,是不是有人知道我做错了什么?该文件导出不当可能是问题吗?
好的更新时间。我手动加载的顶点和索引,应该基于教程工作...使用相同的绘图设置的立方体类,它有相同的问题,并不是所有的面完全绘制(只有大约一半看起来),所以这就是我知道:我的解析器有效;我的加载是“工作”,我的意思是它符合手动输入的值;我已经尝试了在我看来是一切的东西。我花了几个月的时间教自己编程从头开始,到目前为止没有向任何人提出任何问题。尽管我现在真的可以使用这个帮助,但是再次感谢大家。
您的问题可以使用一些清晰。你有什么样的问题,结果是什么样的?另外,如果一个立方体不能正常工作,我建议从一个三角形的对象开始,然后看看你是否能够正常工作。如果是这样,然后尝试两个不同的三角形等。看看你能得到多远。 – Tim
我一直在使用矩形和纹理一段时间。立方体随机画出锯齿状。我曾尝试使用TRIANGLES TRIANGLE_FAN TRIANGLE_STRIPS风扇已经做得最好。我猜我的问题是我正在使用的索引和绘图方法。我试图添加.OBJ文件,但我是论坛的新手,所以我不知道为什么它不在这里。无论如何面孔是三个例如f 1 2 3f 5 6 8 ...等 –
那么有obj文件:P –