将3D场景的特定区域绘制到更大的画布/视口

时间:2018-04-12 16:27:58

标签: c# math matrix sharpdx

我有一个3D场景,我想将一个特定的区域绘制到一个更大的画布/视口上(想象一个放大镜)。

如下图所示: Zoom in on part of an existing 3D scene

我想保持任何透视效果,只需将相机移动到指定区域就不会产生这种效果。

我从http://www.mvps.org/DirectX/articles/tilerender/index.htm收集到可以用投影矩阵做一些诡计,但我无法弄清楚获得更具体的小节/区域背后的数学那篇文章。

如果我们假设文章中描述的坐标,x0y0将是场景的确切中心,x-1y1将是左上角而x1y-1将是场景的右下角。

例如,我希望渲染范围从x-0.75y0.75到x-0.25y0.25的区域。

我有一个Projection矩阵和一个View矩阵可以单独使用。我正在使用SharpDX库,我的Projection矩阵是右手(这似乎是上面描述的y坐标的翻转)。

如何计算将我的投影矩阵与?相乘所需的比例/平移矩阵?或者,还有其他方法可以解决这个问题吗?

Psuedo-code会是这样的:

public Matrix GetProjectionRegion(float topLeftX, float topLeftY, float bottomRightX, float bottomRightY)
{
    var magicMatrix = Matrix.Identity;;
    //some magic
    return magicMatrix;
}
ProjectionMatrix *= GetProjectionRegion(-0.75f, 0.75f, -0.25f, 0.25f);

修改 我目前正在使用以下两种方法之一创建我的投影矩阵:

ProjectionMatrix = Matrix.PerspectiveFovRH(FOV, Width / Height, NearPlane, FarPlane);

ProjectionMatrix = Matrix.OrthoOffCenterRH(_topLeft.X, _bottomRight.X, _topLeft.Y, _bottomRight.Y, NearPlane, FarPlane);

近平面是75飞机是5000000;就我记忆而言,Width / Height / _topLeft / _topRight都是像素格式。

矩阵使用Row-Major。

1 个答案:

答案 0 :(得分:0)

如果你真的想要做一个非常基本的放大机制,你可以用你的相机矩阵作弊,那就是" World"在你的世界观投影矩阵中。

可以通过靠近该位置来解决缩放问题。而已。但是,如果你确定了,你也可以缩放那个世界矩阵,然后放大所有物体,从而有效地缩放。