以3D模式将模型夹在相机上

时间:2019-01-10 22:47:10

标签: c# xna monogame

我正在尝试将已实现到Monogame(Xna 4.0)代码中的3D模型始终显示在屏幕的右下方,这是一把枪-基本的手枪模型,没什么花哨的-没有甚至有纹理!但是我无法弄清楚,我已经尝试了一些数学运算以使其保持在原位,但是问题是我设置的X和Z偏移是硬编码的,因此当玩家旋转相机而手枪旋转时,面对新的LookAt,实际模型不会移动位置,因此很快就会消失。

对于我在Monogame Xna中制作的计算机科学A级(我想相当于高中)课程来说,这是一个相当毫无意义的3D游戏,要走在那些复杂性标记上的路很长,但是我必须最后一刻,我需要让fbx模型坐下来,就像播放器将其固定在屏幕的右下角一样。现在,如果它位于屏幕中央,不会引起太大的注意-但是,如果我增加X或Z偏移以将其定位在所需位置,当您开始旋转相机时,它会落在相机后面或进入相机周围的一个大圆圈会破坏沉浸感(尽管听起来多么愚蠢,但确实使我感到烦恼)。

在简单方法不起作用之后,我尝试将其附加到当前相机正在使用的BoundingBox上:仍然留有空隙,尝试使用BoundingSphere来查看是否可以使其绕球体边缘移动并遵循玩家那样:没有运气。然而。

tl; dr我尝试将枪连接到BoundingBox,BoundingSphere和常规的Vector Positioning都没有成功。

                    if (pausedGame == false)
                {
                    camera.UpdateCamera(gameTime);
                    if (carryingWeapon)
                    {
                        weapons[weaponToCarry].SetRotationMatrix(Matrix.CreateRotationX(camera.GetCameraRotation().X), Matrix.CreateRotationY(camera.GetCameraRotation().Y));
                        weapons[weaponToCarry].SetPosition(camera.weaponSlot.Center + camera.GetLookAtOffSet());
                        //Debug.WriteLine(weapons[weaponToCarry].Position);
                        //Debug.WriteLine(camera.Position);
                    }
                    CheckCollision();
                    AIMovement();
                    UpdateVisitedNodes(updatedNodes);
                }

这是我的更新,简单的设置位置和模型旋转。 “ weaponslot.Centre”的原因是,现在我离开了使用BoundingSphere,因此那段代码仍然存在。

            else if (_state == ItemState.Dynamic)
        {               
            foreach (var mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    effect.PreferPerPixelLighting = true;
                    effect.World = Matrix.CreateScale(SCALE, SCALE, SCALE) * rotationMatrix * 
                        Matrix.CreateTranslation(position);
                    effect.View = view;
                    effect.Projection = projection;
                }
                mesh.Draw();
            }
        }

这是我为实际物品绘制的,没什么好看的。

就像您可以想象的那样,我希望将其锁定在平截头体的右下角,并根据玩家所看到的位置移动它的位置。现在,该商品的位置确实混乱了-欢迎任何概念上的帮助!谢谢。

1 个答案:

答案 0 :(得分:0)

我要做的就是将枪支作为摄像头的母体(在像unity这样的引擎中也是如此)。

您需要自己做单声道操作(我认为)-基本原理是先将枪相对于凸轮进行转换,然后再与摄影机“世界矩阵”相乘-这也意味着使枪的位置相对到相机

gun.worldmatrix = Matrix.CreateTranslation(gun.position) * camera.world;

现在,您只需移动并旋转相机,并且喷枪将保持与相机的相对位置。 请记住:在这种情况下,枪的位置/(旋转)必须相对于相机

重要的是,矩阵的乘积顺序(还没有尝试过,希望我能正确地解决它)