Я, вероятно, собираюсь ударить себя по лицу, когда ответ станет ясным, но я боюсь, что не могу понять, что делать с моей камерой, чтобы эффективно смешивать прокручивающиеся 2D и 3D объекты.
В настоящее время я использую камеру смещения, которую я реализовал, когда это был всего лишь 2D-проект.Камера смещает положение рисования всех 2D-объектов в зависимости от того, где она находится в мире.Если это не ясно, вот код:
public void DrawSprite(Sprite sprite)
{
Vector2 drawtopLeftPosition = ApplyTransformation(sprite.Position);
//TODO: add culling logic here
sprite.Draw(spriteBatch, drawtopLeftPosition);
}
private Vector2 ApplyTransformation(Vector2 spritetopLeftPosition)
{
return (spritetopLeftPosition - topLeftPosition);
}
Достаточно просто.Это работало эффективно, пока я не попытался вставить 3D в уравнение.У меня есть несколько сфер, которые я хочу отображать рядом с объектами 2D игры.Я уже понял, как правильно Z-упорядочить все, но я не могу заставить сферы правильно проецироваться.Они появляются и исчезают в зависимости от того, где находится камера, и часто беспорядочно летают даже при малейшем движении камеры.Вот мои матрицы камер:
viewMatrix = Matrix.CreateLookAt(new Vector3(Position, 1f), new Vector3(Position , 0), Vector3.Up);
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, graphics.Viewport.AspectRatio, 1f, 1000f);
Обратите внимание, что позиция Vector2 - это абсолютный центр области просмотра камеры, а не верхний левый угол или что-то подобное.Я также пытался использовать OrthographicOffCenter и Orthographic проекции.ViewMatrix обновляет каждый кадр с помощью той же функции CreateLookAt в зависимости от текущей позиции камеры.Вот метод Camera, который рисует 3D-объект:
public void DrawModel(Sprite3D sprite, GraphicsDevice device)
{
device.BlendState = BlendState.Opaque;
device.DepthStencilState = DepthStencilState.Default;
device.SamplerStates[0] = SamplerState.LinearWrap;
sprite.DrawBasic(this, device);
}
Моя главная путаница в том, должен ли я смещать 3D-объекты, а также 2D-объекты.Я пытался сделать это, но с большим успехом на самом деле увидел 3D-объекты на экране, если я этого не сделаю.
Вот раздел Sprite3D для рисования:
public Matrix GenerateWorld()
{
return Matrix.CreateScale(Scale) * Matrix.CreateTranslation(new Vector3(Position, -ZPosition)) * Matrix.CreateFromYawPitchRoll(Rotation3D.X, Rotation3D.Y, Rotation3D.Z);
}
private Matrix GenerateDEBUGWorld()
{
return Matrix.CreateScale(Scale) * Matrix.CreateTranslation(Vector3.Zero);
}
public void DrawBasic(Camera camera, GraphicsDevice device)
{
Matrix[] transforms = new Matrix[Model.Bones.Count];
Model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in Model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.World = (transforms[mesh.ParentBone.Index] * GenerateDEBUGWorld());
effect.View = camera.ViewMatrix;
effect.Projection = camera.ProjectionMatrix;
}
mesh.Draw();
}
}
GenerateDEBUGWorld просто размещает сферув 0,0, так что я всегда знаю, где это должно быть .
Несколько вещей, которые я заметил:
- Если я установлю положение Zчем больше камера (скажем, 10), сферы движутся менее хаотично, но все же неправильно
- При использовании проекции OrthographicOffCenter в центре экрана отображаются крошечные маленькие сферы, которые не меняются по положению или масштабу, даже если яумножьте переменную Scale Sprite3D на 1000.
Итак, главный вопрос: должен ли я даже использовать камеру смещения, или есть ли лучший способ эффективно смешивать 2D и 3D (возможно, рекламный щит?не хотите добавить ненужные сложности в этот проект)?И, если я использую смещение, я должен сместить 3D-объекты, а также 2D?Наконец, какой тип проекции следует использовать?
Обновление: если я верну камеру в положение z на 100 и увеличу сферы на 100%, они будут вести себя несколько нормально - когда камера движется влевоони движутся вправо, вверх, вниз, и т. д., как и следовало ожидать для перспективной проекции.Однако они движутся слишком сильно по отношению к остальным 2D объектам.Это вопрос масштаба?Я чувствую, что очень трудно согласовать способ отображения спрайтов и способ отображения трехмерных объектов на экране ...