2

我无法让模型的方向正确。在这个项目中,用户加载了 3 个 DXF 文件。

  • DXF 1 是由 3dfaces 表示的模型。
  • DXF 2 是 3dpoly,表示相机在左侧行驶的路径。
  • DXF 3 是为迎面而来的交通提供路径的 3dpoly。

前两个数据集在 C#/XNA 开发中得到了正确处理。用户可以使用上下键盘键沿道路行驶。但我在第三个过程中失败了。我无法正确获取迎面而来的车辆的方向。位置还可以,每100米就有一辆面包车,但是方向不对。

最奇怪的是,将模型转换到正确位置和方向的正常方法是使模型位于相机顶部!我哪里做错了?我已经在以下 URL 上提供了源代码,因此您可以查看代码并了解我哪里出错了(zip 包含用于测试的 DXF 文件):

http://www.4shared.com/zip/Lk3xmCtO

在此先感谢..凯文。

这是最不正确的部分:

Matrix worldMatrix = Matrix.CreateTranslation(VanPos[vi]);
Matrix[] transforms = new Matrix[Van.Bones.Count];
Van.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh modmesh in Van.Meshes)
{
foreach (BasicEffect be1 in modmesh.Effects)
{
    be1.World = transforms[modmesh.ParentBone.Index] * worldMatrix;

这导致模型被放置在相机位置。仅使用 CreateTranslation 将模型放置在正确的位置,但方向不正确。

4

1 回答 1

1

您永远不会设置方向,这意味着您的东西永远不会旋转。从我放置的一些代码中,这就是我绘制模型网格的方式。

关键点:

  • 您需要包含投影和视图矩阵并将它们设置为您的效果。您可以在以下代码中执行此操作。
  • Orientation需要创建一个矩阵。有很多方便的功能可以帮助您做到这一点Matrix.CreateRotationY
  • 矩阵相乘时要注意排序。我相信你已经注意到了这一点,但顺序真的很重要。我倾向于把这个搞砸并摆弄乘法顺序以使事情起作用:)

    public void Draw(Matrix projection, Matrix view)
    {
        // Copy any parent transforms.
        var transforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(transforms);
    
        foreach (var mesh in model.Meshes)
        {
            // This is where the mesh orientation is set, as well 
            // as our camera and projection.
            foreach (BasicEffect effect in mesh.Effects)
            {
                Matrix world = Orientation; // <- A Matrix that is the orientation
                world.Translation = Position; // <- A Vector3D representing position
                effect.World = transforms[mesh.ParentBone.Index] *
                    world;
    
                effect.View = view;
                effect.Projection = projection;
            }
            // Draw the mesh, using the effects set above.
            mesh.Draw();
        }
    }
    
于 2012-08-31T06:26:17.413 回答