我正在尝试在Monogame中实现等距效果,到目前为止我的视觉效果还不错,但我不确定我为视图和投影矩阵编写的代码是否正确。
所以这就是我为Camera类所做的:
public class Camera
{
GraphicsDevice graphicsDevice;
public Vector3 position = new Vector3(0, 0, 10);
public Vector3 lookAtVector = new Vector3(0, 0, 0);
public Matrix ViewMatrix
{
get
{
var upVector = Vector3.UnitZ;
return Matrix.CreateLookAt(Vector3.Transform(position, Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(45), MathHelper.ToRadians(35), 0)),
Vector3.Transform(lookAtVector, Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(45), MathHelper.ToRadians(35), 0)),
upVector);
}
}
public Matrix ProjectionMatrix
{
get
{
return Matrix.CreateOrthographic(50, 38, -100, 500);
}
}
public Camera(GraphicsDevice graphicsDevice)
{
this.graphicsDevice = graphicsDevice;
}
public void Update(GameTime gameTime)
{
}
}
当我绘制一些图块时会创建以下内容:
现在从我所看到的,偏航应该是45度,并且音高应该是30度才能达到我想要的效果,但是如果我将音高设置为30则使用上面的代码它看起来很扭曲所以我已经不得不把它提高到35,我认为它看起来不错。
我对3D编程很陌生,所以也许我的方法不是最好的,任何建议都会非常感激。仅供参考我正在将变换应用于视图矩阵的位置和目标矢量,以便我能够移动相机。
提前致谢!
答案 0 :(得分:0)
我不确定你在哪里30°。正确的仰角约为35.3°。
如果使用CreateLookAt
函数,则有一种更简单的方法,因为视图方向始终是立方体对角线。为此,我们假设您的相机有一个target
位置,正在查看viewDistance
。然后,视图矩阵是:
Matrix.CreateLookAt(target + new Vector3(1, 1, -1) * viewDistance, target, upVector)
您可以更改对角线矢量(1, 1, -1)
中的符号以匹配您想要的视图。