我和我的团队一直在尝试在屏幕上显示我们的武器一个星期,但没有成功:我们确实需要帮助。我们希望获得的是,就像在每帧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/

10-09 05:04