我和我的团队一直在尝试在屏幕上显示我们的武器一个星期,但没有成功:我们确实需要帮助。我们希望获得的是,就像在每帧FPS中一样,武器显示在屏幕上带有一点水平偏移,就像玩家在握着它一样。
我们已经尝试使用矩阵,但是没有成功:武器甚至不可见,它似乎在我们身后,即使我们尝试使用一些值也无法使其正常工作。
我们知道我们需要使用摄像机的旋转以及摄像机的位置,但是我们无法找出公式来获得武器的世界矩阵。
我们所拥有的是,摄像机的位置为Vector3,摄像机的旋转也为Vector3,其中y坐标为pi和-pi之间的水平旋转,x为垂直旋转。武器缩放为0.1f。我们应该做什么?
非常感谢您的帮助。
编辑:
这是一些与我的问题有关的代码:
public void Update()
{
weapon.Rotation = ThisPlayer.Rotation;
weapon.WorldMatrix = WeaponWorldMatrix(
ThisPlayer.Position,
ThisPlayer.Rotation.Y,
ThisPlayer.Rotation.X
);
}
private Matrix WeaponWorldMatrix(Vector3 Position, float updown, float leftright)
{
Vector3 xAxis;
Vector3 yAxis;
xAxis.X = SceneManager.Game.Camera.View.M11;
xAxis.Y = SceneManager.Game.Camera.View.M21;
xAxis.Z = SceneManager.Game.Camera.View.M31;
yAxis.X = SceneManager.Game.Camera.View.M12;
yAxis.Y = SceneManager.Game.Camera.View.M22;
yAxis.Z = SceneManager.Game.Camera.View.M32;
Position += new Vector3(1, 0, 0) / 5; //How far infront of the camera The gun will be
Position += xAxis * 1f; //X axis offset
Position += -yAxis * 0.5f; //Y axis offset
SceneManager.Game.DebugScreen.Debug(Position.ToString());
return Matrix.CreateScale(0.1f) //Size of the Gun
* Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(5), 0, 0) //Rotation offset
* Matrix.CreateRotationX(updown)
* Matrix.CreateRotationY(leftright)
* Matrix.CreateTranslation(Position);
}
最佳答案
最简单的方法是将相机的视图矩阵反转,然后将其用于表示世界空间位置和相机的旋转。可以借用并略微更改此结果,以成为武器的世界矩阵。
Matrix cameraWorld = Matrix.Invert(view);
Matrix weaponWorld = cameraWorld; //gives your weapon a matrix that is co-located and co-rotated with camera
//then simply reposition the weapon matrix as necessary
weaponWorld.Translation += (cameraWorld.Forward * distInFrontOfCam) + //set to taste. moves the weapon slightly in front of cam
(cameraWorld.Down * amountWeaponIsLoweredFromCenterOfScreen) + //set to taste. moves the weapon from the center of the screen to the lower part
(cameraWorld.Right * leftOrRightOffset); //set to taste. moves the weapon left or right of center if desired.
编辑。我注意到您也在尝试将比例尺应用到您的武器上。我的建议是不要在代码中这样做。而是在解决方案资源管理器中右键单击武器模型,然后选择属性。在属性窗口上,单击“内容处理器”旁边的小箭头以展开列表。找到scale属性并在那里设置比例(为0.1f或其他值)。现在,您无需浪费cpu周期即可在代码中扩展该模型。当将fbx转换为xnb时,这将导致在构建阶段设置比例。
关于c# - 第一人称武器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21839680/