2014-02-17 2 views
2

Наша команда и я пытались отобразить наше оружие на экране в течение недели, без успеха: нам действительно нужна помощь в этом. То, что мы хотели бы получить, это, как и в каждом FPS, отображение оружия с небольшим горизонтальным смещением на экране, как будто игрок держал его.Оружие от первого лица

Мы уже пытались использовать матрицу, но безуспешно: оружие даже не видно, оно, кажется, позади, и даже если мы попытаемся немного сыграть со значениями, мы не сможем его получить работает должным образом.

Мы знаем, что нам нужно использовать поворот камеры, а также ее положение, но мы не можем понять формулу, чтобы получить матрицу мира оружия.

То, что у нас есть, положение камеры как Vector3, поворот камеры как Vector3 тоже, при этом координата y является горизонтальным вращением между pi и -pi, а x - вертикальным вращением. Оружие масштабируется на 0.1f. Что нам делать?

Большое спасибо за помощь.

EDIT: Вот код по отношению к моей проблеме:

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); 
} 
+0

Не могли бы вы выслать соответствующий код? – davidsbro

+0

Я только что опубликовал образец нашего кода. Второй метод найден на google, но мы не можем найти, как заставить его работать. Спасибо вам большое за ваш ответ. –

ответ

5

Простейший способ сделать это - инвертировать матрицу просмотра камеры, которая затем может использоваться для представления положения пространства в мире и вращения камеры. Этот результат можно заимствовать и немного изменить, чтобы стать мировой матрицей оружия.

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. 

Редактировать. Я заметил, что вы также пытаетесь применить масштаб к своему оружию. Мое предложение - не делать этого в коде. Скорее щелкните правой кнопкой мыши модель оружия в проводнике решений и выберите свойства. В окне свойств щелкните небольшую стрелку рядом с «контент-процессором», чтобы развернуть список. Найдите свойство шкалы и установите масштаб там (на 0.1f или что-то еще). Теперь вам не нужно тратить циклы процессора, чтобы масштабировать эту модель в коде. Это приводит к тому, что масштаб устанавливается на этапе сборки, когда он преобразует fbx в xnb.

+0

Большое вам спасибо, это сработало отлично! –

2

Я думаю, что проблема, которую вы, возможно, является то, что для оружия, чтобы быть перед вами, вам нужно будет использовать Z значение -1, как и значение Vector3.Forward. Но есть гораздо более простые способы вычисления такого смещения без непосредственного использования матриц.

XNA уже предлагает простые инструменты для преобразования векторов с использованием матриц. Вы можете использовать Vector3.Transform, например, для поворота точки с использованием матрицы вращения (матрица просмотра).

Например, чтобы получить позицию, в которой требуется оружие, вам понадобится вектор смещения, значение которого определяет положение оружия с того места, где вы находитесь, и ваше текущее положение.

В правой правой системе, используемой по умолчанию XNA, вам нужно будет установить отрицательное значение для компонента Z для оружия перед представлением (Vector3.Forward), и вам понадобится небольшой отрицательный результат Значение Y для оружия должно быть ниже точки обзора. Затем для значения X вы можете добавить небольшое значение для смещения оружия справа от игрока.

var offset = new Vector3(0.2, -0.2, -1) 

Затем можно вычислить положение для оружия путем вращения, что смещение вектора с использованием представления матрицы камеры и добавить позицию игрока.

var weaponPosition = Vector3.Transform(Offset, SceneManager.Game.Camera.View) 
        + ThisPlayer.Position; 

Наконец, с помощью этой позиции можно вернуть простую мировую матрицу для оружия

return Matrix.CreateScale(0.1f) 
     * Matrix.CreateRotationX(updown) 
     * Matrix.CreateRotationY(leftright) 
     * Matrix.Translation(weaponPosition); 

Если после того, как что оружие все еще не находится в передней части камеры, попробуйте изменить значение смещения вокруг или установите более высокие значения. Возможно также, что оружие обрезается рядом с полем камеры, попробуйте снизить это значение в настройках камеры или в параметрах матрицы проекции. Для функции CreatePerspectiveFieldOfView это значение является третьим полем с именем nearPlaneDistance.

+0

Хм, похоже, не работает. Вот что происходит с коордами камеры и оружия: [щелкните здесь для изображения] (http://puu.sh/70haB.jpg) Кажется, что когда-то коорды просто становятся слишком большими –

Смежные вопросы