【问题标题】:In OpenTK, multiple meshes are not transforming when imported using Assimp在 OpenTK 中,多个网格在使用 Assimp 导入时不会发生变换
【发布时间】:2014-05-08 07:11:23
【问题描述】:

我确信网上有这个问题的答案,但我找不到。 我正在将具有多个网格的 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();

更新为使用建议。

【问题讨论】:

  • 肯定有为每个网格定义的模型转换矩阵或您错过的更高级别。
  • 开始 - 结束之间不允许进行矩阵运算。你的开始应该就在面孔解析循环之前......
  • 我必须承认我觉得自己很傻,你是对的。更新原始后移动调用 GL.Begin。现在,网格正在被转换——它们看起来很薄(在 Y 轴上缩放)但其他方面没有变化。可能是转换矩阵的问题。我会尽力解决并让你知道
  • MultMatrix 调用确实有效。我还必须在 Blender 中做一些事情:将光标置于中心或 3d 世界的中心,选择每个网格并转到“Transform->Origin to 3d cursor”。这将为每个网格正确设置变换矩阵,除了已经旋转的网格,这仍然给我带来了问题。如果我弄清楚了,我会发布如何。

标签: opengl blender opentk collada assimp


【解决方案1】:

c example中,每个节点都有一个变换矩阵...

aiMultiplyMatrix4(trafo,&nd->mTransformation);

检查一下:

如果您不知道如何处理该矩阵,请查看this 以了解矩阵堆栈。 (请注意现代 OpenGL 建议实现您自己的转换矩阵)

Golobaly,您需要以下步骤进行渲染(详情请阅读 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

【讨论】:

  • 嗯由于某种原因它不起作用...我在 OpenTK 中使用 GL.MultMatrix() 函数。我给它的矩阵肯定有值,但似乎没有效果。
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 2020-12-26
  • 2021-12-27
  • 2018-03-28
  • 1970-01-01
  • 2013-04-14
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多