1

これに対する答えがウェブ上にあると確信していますが、見つけることができません。複数のメッシュを持つ Blender から OpenTK にシーンをインポートしています。インポートに使用しているライブラリは Assimp-net で、ファイル形式は Collada (.dae) です。

複数のパーツで構成された宇宙船を作成しました。各パーツはメッシュです。インポートして描画すると、オブジェクトのジオメトリがきれいに見え、マテリアルが期待どおりに機能するようになりました。ただし、さまざまなパーツは、Blender に表示されるように回転、スケーリング、または移動されません。さまざまなパーツが接続されておらず、一部が本来よりも大きく/小さく表示されたり、間違った場所に表示されたりします。

Blender からエクスポートするときに欠けている設定はありますか、それともメッシュをレンダリングする前に変換するために使用できる Assimp メンバー/関数はありますか?

ファイルのインポート:

string filename = @"C:\Path\ship.dae";
Scene ship;

//Create a new importer
AssimpImporter importer = new AssimpImporter();

//This is how we add a configuration (each config is its own class)
NormalSmoothingAngleConfig config = new NormalSmoothingAngleConfig(66.0f);
importer.SetConfig(config);

//Import the model
ship = importer.ImportFile(filename, PostProcessPreset.TargetRealTimeMaximumQuality);

//End of example
importer.Dispose();

メッシュの描画 (OpenTK の「RenderFrame」イベント ハンドラ全体):

// Clear color/depth buffers
    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

    // Define world space
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Ortho(-15.0, 15.0, -15.0, 15.0, 15.0, -15.0);

    // Rotate around X and Y axes for better viewing
    rotateX(xrot);
    rotateY(yrot);

    GL.Enable(EnableCap.ColorMaterial);

    var rootnode = wes10.RootNode;
    foreach (Node node in rootnode.Children)
    {
        //for each node, do
        GL.MatrixMode(MatrixMode.Modelview);  //ensure your current matrix is the model matrix.
        GL.PushMatrix();              //save current model matrix so you can undo next transformations;

        var meshIndices = node.MeshIndices;

        if (meshIndices == null)
            continue;
        else
        {
            Matrix4d convertedTransform = new Matrix4d();
            getConvertedMatrix(node.Transform, ref convertedTransform);
            GL.MultMatrix(ref convertedTransform);

            GL.Begin(BeginMode.Triangles);
            foreach (uint i in meshIndices)
            {
                Mesh mesh = wes10.Meshes[i];

                Material mat = wes10.Materials[mesh.MaterialIndex];

                // Material setup                        
                var spec_color = mat.ColorSpecular;
                var amb_color = mat.ColorAmbient;
                var diff_color = mat.ColorDiffuse;


                float[] mat_specular = { spec_color.R, spec_color.G, spec_color.B, spec_color.A };
                float[] mat_ambient = { amb_color.R, amb_color.G, amb_color.B, amb_color.A };
                float[] mat_diffuse = { diff_color.R, diff_color.G, diff_color.B, diff_color.A };

                float[] mat_shininess = { 0.0f };

                GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, mat_specular);
                GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Ambient, mat_ambient);
                GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Diffuse, mat_diffuse);
                GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, mat_shininess);

                foreach (Face face in mesh.Faces)
                {
                    foreach (uint indice in face.Indices)
                    {
                        var normal = mesh.Normals[indice];
                        var pos = mesh.Vertices[indice];
                        //var tex = mesh.GetTextureCoords(0)[v];
                        //GL.TexCoord2(tex.X, tex.Y);
                        GL.Normal3(normal.X, normal.Y, normal.Z);
                        GL.Vertex3(pos.X, pos.Y, pos.Z);
                    }
                }
            }                            
        }

        GL.PopMatrix();
    }


    GL.End();                    

    game.SwapBuffers();

提案を使用するように更新されました。

4

1 に答える 1

1

cの例では、ノードごとに変換行列があります...

aiMultiplyMatrix4(trafo,&nd->mTransformation);

これをチェックして:

そのマトリックスをどうしたらよいかわからない場合は、これをチェックしてマトリックス スタックについて学習してください。(独自の変換マトリックスを実装するための最新の OpenGL 推奨事項に注意してください)

全体的に、レンダリングには次の手順が必要です (詳細については、c の例を参照してください)。

//for each node, do
glMatrixMode (GL_MODELVIEW);  //ensure your current matrix is the model matrix. 
glPushMatrix ();              //save current model matrix so you can undo next transformations;
glMultMatrixf(Transformation);//apply your node matrix

//render your node, in your example it's surely a mesh

glPopMatrix ();               //restore model matrix
于 2014-03-28T18:10:00.207 に答える