1

.obj ファイルを読み取り、ワイヤー フレーム モードでレンダリングするだけのプログラムを作成しています。私はレンダリングしたい.objファイルをすでに読んでいました(正しく-私は信じています)。しかし、私はいくつかの問題を抱えています...それはワイヤーフレームであると思われますが、代わりに... (画像は下にあります)

私の出力

コードは次のとおりです。

    public void render(GL gl){
    float xMiddle = (m.getXVertexMax() + m.getXVertexMin())/2;
    float yMiddle = (m.getYVertexMax() + m.getYVertexMin())/2;
    float zMiddle = (m.getZVertexMax() + m.getZVertexMin())/2;

    gl.glScalef(1/(m.getXVertexMax() - m.getXVertexMin()), 1, 1);
    gl.glScalef(1, 1/(m.getYVertexMax() - m.getYVertexMin()), 1);
    gl.glScalef(1, 1, 1/(m.getZVertexMax() - m.getZVertexMin()));

    gl.glBegin(GL.GL_TRIANGLES);
    {
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINES);
        for(int i = 0; i < m.faces.size(); i++ ){
            Vector3f n1 = m.normals.get(m.faces.get(i).getNormalIndices()[0] - 1); 
            Vector3f v1 = m.vertices.get(m.faces.get(i).getVertexIndices()[0] - 1);
            gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);
            gl.glNormal3f(n1.x, n1.y, n1.z);


            Vector3f n2 = m.normals.get(m.faces.get(i).getNormalIndices()[1] - 1); 
            Vector3f v2 = m.vertices.get(m.faces.get(i).getVertexIndices()[1] - 1);
            gl.glVertex3f(v2.x - xMiddle, v2.y - yMiddle, v2.z - zMiddle);
            gl.glNormal3f(n2.x, n2.y, n2.z);




            Vector3f n3 = m.normals.get(m.faces.get(i).getNormalIndices()[2] - 1); 
            Vector3f v3 = m.vertices.get(m.faces.get(i).getVertexIndices()[2] - 1);
            gl.glVertex3f(v3.x - xMiddle, v3.y - yMiddle, v3.z - zMiddle);
            gl.glNormal3f(n3.x, n3.y, n3.z);

        }
    }
    gl.glEnd(); 
}

注: コード内の Vector3f は、私が作成したデータ構造です。

私は見つけたすべてを試しましたが、それでも画像をワイヤーフレームとしてレンダリングしません! :-/

誰でも手を差し伸べることができますか?

4

1 に答える 1

1
gl.glBegin(GL.GL_TRIANGLES);
{
    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINES);
    ...

glBegin()/glEnd()ブロック内で有効な GL コマンドはほとんどありません

glBegin と glEnd の間で使用できるのは、GL コマンドのサブセットのみです。コマンドは 、glVertex、glColor、glSecondaryColor、glIndex、glNormal、glFogCoord、glTexCoord、glMultiTexCoord、glVertexAttrib、glEvalCoord、glEvalPoint、glArrayElement、glMaterial、および glEdgeFlag です。また、glCallList または glCallLists を使用して、上記のコマンドのみを含む表示リストを実行することもできます。 glBegin と glEnd の間に他の GL コマンドが実行された場合、エラー フラグが設定され、コマンドは無視されます。

glEnable()glPolygonMode()そのリストにはありません。

glBegin()それらをブロックの外に移動します。


    gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);
    gl.glNormal3f(n1.x, n1.y, n1.z);

間違った方法。法線、次に頂点が必要です。

    gl.glNormal3f(n1.x, n1.y, n1.z);
    gl.glVertex3f(v1.x - xMiddle, v1.y - yMiddle, v1.z - zMiddle);

glNormal()現在の法線を設定するだけで、glVertex()実際にそれをパイプラインに送ります。

于 2013-11-26T15:44:02.300 に答える