通过鼠标单击XNA移动3d模型

时间:2015-07-18 15:04:48

标签: c# 3d xna

现在首先我想说我确实知道这个主题存在于websote上,但现有问题的答案(或问题,因为其中一个没有得到回答)并没有帮助我。< / p>

我在xna中创建一个游戏,在你从上面看你的角色,并通过右键单击地图区域来移动它。游戏玩法假设看起来像这样:https://www.youtube.com/watch?v=PDW_jFxfYEk

我曾尝试将地图视为二维地图,因为我只使用二维,是的,由于各种原因,这个游戏必须使用3D图形,并且它不起作用。

我继续尝试实现这里建议的两个解决方案: C# XNA Mouse position projected to 3D plane 他们没有那么好用。

最后我尝试使用viewport.unproject方法将鼠标单击转换为vector3,然后将其实现到世界矩阵中,您可能会猜到这个结果如何。

所以,如果有人在这里可以请我建议一个方法,我会非常感激

这里有关于我的代码的一些信息:

BasicModel类:

class BasicModel
{
    public Model model { get; protected set; }
    public Matrix world = Matrix.Identity;

    public BasicModel(Model m) 
    {    
        model = m;
    }

    public virtual void Update()
    {

    }

    public void Draw(Camera camera) 
    {    
        Matrix[] transforms = new Matrix[model.Bones.Count];    
        model.CopyAbsoluteBoneTransformsTo(transforms);

        foreach (ModelMesh mesh in model.Meshes)    
        {        
            foreach (BasicEffect be in mesh.Effects)        
            {
                be.EnableDefaultLighting(); 
                be.Projection = camera.projection; 
                be.View = camera.view; 
                be.World = GetWorld() * mesh.ParentBone.Transform;
            }
            mesh.Draw();
        }
    }

    public virtual Matrix GetWorld() 
    { 
        return world; 
    } 
}

这是ModelManager类

public class ModelManager : DrawableGameComponent
{
    List<BasicModel> models = new List<BasicModel>();
    Ghost thisPlayer;


    public ModelManager(Game game)
        : base(game)
    {

    }

    public override void Initialize()
    {
        // TODO: Add your initialization code here
        thisPlayer = new Ghost(Color.Red, 300, new Vector3(0.05f, 0.05f, 0));
        base.Initialize();
    }


    protected override void LoadContent()
    {
        models.Add(new BasicModel(Game.Content.Load<Model>(@"watcher")));
        base.LoadContent();
    } 

    public override void Update(GameTime gameTime)
    {

        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime) 
    {
        foreach (GhostModel bm in models) 
        { 
            bm.Draw(((Game1)Game).camera); 
        }
        base.Draw(gameTime); 
    }
}

他们对我尝试过的任何解决方案都很清楚。

0 个答案:

没有答案