gpt4 book ai didi

c# - 3D/2D 自上而下的 View 使用什么样的投影和相机?

转载 作者:行者123 更新时间:2023-11-30 13:04:56 24 4
gpt4 key购买 nike

一旦答案变得清晰,我可能会打自己的脸,但恐怕我不知道如何使用我的相机才能有效地混合滚动的 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 Position 是相机视口(viewport)的绝对中心,而不是左上角或类似的东西。我也尝试过使用 OrthographicOffCenter 和 Orthographic 投影。 viewMatrix 根据当前相机位置使用相同的 CreateLookAt 函数更新每一帧。这是绘制 3D 对象的 Camera 方法:

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 投影在屏幕中心显示微小的小球体,即使我将 Sprite3D 的 Scale 变量乘以 1000 也不会改变位置或比例。

那么,主要问题是:我是否应该使用位移相机,或者是否有更好的方法来有效地混合 2D 和 3D(也许是广告牌?但我不想给这个项目增加不必要的复杂性)?而且,如果我确实使用置换,我是否应该置换 3D 对象以及 2D 对象?最后,应该使用什么样的投影?

更新:如果我将相机移回 z 位置 100 并使球体按比例放大 100%,它们的行为有些正常——当相机向左移动时,它们向右移动,向上移动时,它们向下移动,等等,就像您期待透视投影。然而,它们相对于其余 2D 对象移动得太多了。这是规模问题吗?我觉得很难调和 Sprite 的显示方式和 3D 对象在屏幕上的显示方式...

最佳答案

听起来您正在寻找的是 Unproject - 这将采用 2D 点并将其“转换”到 3D 空间中。如果您所有的对象都在 3D 空间中,那么您典型的 Ortho/LookAt 相机应该会像您期望的那样工作......我在这里也完全从内存中走出来,因为我无法查看它。 ;)

关于c# - 3D/2D 自上而下的 View 使用什么样的投影和相机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com