0

私は自分の質問に対する答えを見つけるために何日も探していました。私はいくつかのウェブサイトなどをチェックした教科書を調べました...私のコードが適切にレンダリングされるべきであることがわかるからです。エラーを見つけようとしてキーボードに顔を繰り返し投げました:(。ここにあります。三角形に設定されたブレンダーの単純な.OBJキューブを持っているので、面ごとに3つのインデックスがあります。合計 8 個の頂点と 36 個のインデックス. もうどうすればいいのかわかりません.ここに私のコードがあります.助けてください.よろしくお願いします.

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);
}

最初の投稿以来、私はこれに目を通しています...私が考えられることは何でも試しています。コード自体はそれほど複雑ではありません。私が間違っていることを知っている人はいませんか? ファイルが正しくエクスポートされていない可能性がありますか?

さて更新時間。チュートリアルに基づいて機能するはずの頂点とインデックスを手動でロードしました... Cube クラスに同じ描画設定を使用しましたが、すべての面が完全に描画されないという同じ問題がありました (それらの約半分のみが表示されます)。私は知っています:私のパーサーは動作します。私の読み込みは「機能」しています。つまり、手動で入力した値と一致しています。私にはすべてのように見えるものを試したこと。私は何ヶ月もプログラミングをゼロから独学で学び、誰にも質問することなくここまでやってきました。でも、今は本当に助けを使うことができました。ありがとうございます。

4

1 に答える 1

1

たくさんのフェイスローリングとフェイスパーミングの後、ドローエレメント呼び出しで UNSIGNED_BYTE を UNSIGNED_SHORT に変更する必要があることに気付きました (ショートを使用していたため)。学んだ教訓。

于 2012-05-15T05:50:35.447 に答える