#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. Возможно, вам также придется переместить камеру назад (в зависимости от поля зрения).