我正在尝试将已实现到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();
}
}
这是我为实际物品绘制的,没什么好看的。
就像您可以想象的那样,我希望将其锁定在平截头体的右下角,并根据玩家所看到的位置移动它的位置。现在,该商品的位置确实混乱了-欢迎任何概念上的帮助!谢谢。
答案 0 :(得分:0)
我要做的就是将枪支作为摄像头的母体(在像unity这样的引擎中也是如此)。
您需要自己做单声道操作(我认为)-基本原理是先将枪相对于凸轮进行转换,然后再与摄影机“世界矩阵”相乘-这也意味着使枪的位置相对到相机
gun.worldmatrix = Matrix.CreateTranslation(gun.position) * camera.world;
现在,您只需移动并旋转相机,并且喷枪将保持与相机的相对位置。 请记住:在这种情况下,枪的位置/(旋转)必须相对于相机。
重要的是,矩阵的乘积顺序(还没有尝试过,希望我能正确地解决它)