我有一个3D场景,我想将一个特定的区域绘制到一个更大的画布/视口上(想象一个放大镜)。
我想保持任何透视效果,只需将相机移动到指定区域就不会产生这种效果。
我从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。
答案 0 :(得分:0)
如果你真的想要做一个非常基本的放大机制,你可以用你的相机矩阵作弊,那就是" World"在你的世界观投影矩阵中。
可以通过靠近该位置来解决缩放问题。而已。但是,如果你确定了,你也可以缩放那个世界矩阵,然后放大所有物体,从而有效地缩放。