Какую проекцию и камеру использовать для просмотра 3D / 2D сверху вниз? - PullRequest
4 голосов
/ 03 августа 2011

Я, вероятно, собираюсь ударить себя по лицу, когда ответ станет ясным, но я боюсь, что не могу понять, что делать с моей камерой, чтобы эффективно смешивать прокручивающиеся 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 объектам.Это вопрос масштаба?Я чувствую, что очень трудно согласовать способ отображения спрайтов и способ отображения трехмерных объектов на экране ...

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Просто мысль, но ваш Z в вашей матрице вида ограничен между 1 и 0. Обновите компонент Z этих Vector3, чтобы он стал действительным Z камеры, и посмотрите, что это для вас делает.

<2 цента />

0 голосов
/ 04 августа 2011

Это звучит как то, что вы ищете, это Unproject - это возьмет 2D точку и «бросит ее» в 3D пространство.Если все ваши объекты находятся в трехмерном пространстве, ваша обычная камера Ortho / LookAt должна работать так, как вы ожидаете ... Я также полностью ухожу из памяти, поскольку я не могу ее найти.;)

...