Проблема моделирования XNA 3D Skybox с положением камеры и переводом модели

#3d #xna

#3D #xna

Вопрос:

Я создал 3D-проект XNA 4.0 в сообществе VS 2015. У него есть Skybox с моделью пули, которую я пытаюсь смоделировать траекторию. Кажется, я не могу установить камеру в правильное положение, и перевод, похоже, работает на неправильной оси.

Я попытался изменить положение модели, камеры и даже перспективы.

 protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
        this.Exit();

    mDeltaTime = gameTime;
    mFlightTime  = 0.1f;


    //if (mAngleInput != 0)
    //{
    //    mVelocity.X = (float)(mVelocityInput * Math.Cos(DegreeToRadian(mAngleInput)));
    //    mVelocity.Y = (float)(mVelocityInput * Math.Sin(DegreeToRadian(mAngleInput)));
    //}

    position = (mStartingPosition   mVelocity * mFlightTime) - (0.5f * mAcceleration * (float)Math.Pow(mFlightTime, 2)) / 5;


    // This updates the world matrix, so that it reflects the changes to the position
    // and angle.  Remember that this matrix determines where the model will be located
    // at in the 3D world.

    //   camTarget  = new Vector3(0.1f,0,0);

    //           world = Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);
    //            view = Matrix.CreateLookAt(camTarget, position,  Vector3.UnitY);

    cameraPosition =  (distance * new Vector3((float)Math.Sin(angle), 0, (float)Math.Cos(angle)));
    Vector3 cameraTarget = position;
    //original Vector3 cameraTarget = new Vector3(0, 0, 0);

    viewVector = Vector3.Transform(cameraTarget - cameraPosition, Matrix.CreateRotationY(0));
    // viewVector.Normalize();

    angle  = 0.002f;

    world = Matrix.CreateScale(0.5f) * Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);
    view = Matrix.CreateLookAt(cameraTarget, cameraPosition, Vector3.UnitY);
    //original view = Matrix.CreateLookAt(cameraPosition, new Vector3(0, 0, 0), Vector3.UnitY);

    base.Update(gameTime);
}
  

Я надеялся, что модель начнется в определенном положении и переместится по горизонтальной оси X и опустится по вертикальной оси Y на основе формулы траектории, которую я использую. Остановка после достижения определенного значения Y.

Комментарии:

1. Кто-нибудь может помочь?

2. Не могли бы вы поделиться методом Draw() и инициализацией переменных.

3. файл @Strom Game1.cs находится здесь dropbox.com/s/wews924zmyqg6rj/Game1.cs?dl=0

Ответ №1:

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

Чтобы увидеть движение пули, камера должна находиться в фиксированном положении и вращаться. Предполагая, что начальное положение маркера равно (0,0,0), ваша камера должна быть смещена по оси Z, чтобы LookAt вектор не вырождался в a NaN .

Вы можете перемещать камеру, чтобы следовать за маркером по оси X, но он будет начинаться в середине экрана и опускаться прямо вниз.

 Protected override void Update(GameTime gameTime)
{

    //mDeltaTime = gameTime;  
    mFlightTime  = 0.1f;

    //position = (mStartingPosition   mVelocity * mFlightTime) - (0.5f * mAcceleration * (float)Math.Pow(mFlightTime, 2)) / 5;
    // The previous line can be simplified, assuming you do not need to jump to a specific time:
    position  = mVelocity;
    mVelocity  =mAcceleration;
    mAcceleration  = mDrag;
    mDrag = -bulletCoefficient * airDensity * mBulletCrossSection * (float)Math.Pow(mVelocity, 2) / 2; 

    cameraTarget = new Vector3(0,0,0);
    cameraPosition = new Vector3(0,0,-1);   

    world = Matrix.CreateScale(0.5f) * Matrix.CreateRotationY(angle) * Matrix.CreateTranslation(position);
    view = Matrix.CreateLookAt(cameraTarget, cameraPosition, Vector3.UnitY);    

    base.Update(gameTime);
}
`
  

Комментарии:

1. Какими должны быть типы переменных для mVelocity, mAcceleration и mDrag? Векторы или поплавки? позиция — это Вектор3. Как мне загрузить модель в определенное положение?

2. @SSHK Они Vector3 s. положение должно быть установлено в исходное положение. Каждая модель будет использовать свою собственную матрицу преобразования мира.

3. На экране ничего не отображается.

4. Извините, я забыл упомянуть, что вам нужно масштабировать значения перемещения (силы тяжести и сопротивления) на 1/60. Возможно, вам также придется переместить камеру назад (в зависимости от поля зрения).