我正在编写自己的3D引擎,我有这个矩阵来制作透视图。 (这是一个标准矩阵,所以没什么有趣的)
public static Matrix3D PrespectiveFromHV(double fieldOfViewY, double aspectRatio, double zNearPlane, double zFarPlane, double mod)
{
double height = 1.0 / Math.Tan(fieldOfViewY / 2.0);
double width = height / aspectRatio;
double d = zNearPlane - zFarPlane;
var rm = Math.Round(mod, 1);
var m = new Matrix3D(
width, 0, 0, 0,
0, height, 0, 0,
0, 0, (zFarPlane / d) * rm, (zNearPlane * zFarPlane / d) * rm,
0, 0, (-1 * rm), (1 - rm)
);
return m;
}
我可以让我的场景看起来像只是忽略那个矩阵。
但我们想做的是从3D平滑过渡到2D并返回......
任何人都有任何想法?我需要在此矩阵中进行哪些更改才能实现平滑过渡?
答案 0 :(得分:1)
我会在m和indentity矩阵I之间使用插值,如下所示:
让alpha在alpha * m +(1-alpha)* I
中从1变为0编辑:
请你详细说明
我可以让我的场景看起来像2D 只是忽略那个矩阵。
这个想法是在2D(通过忽略矩阵)和3D(使用矩阵)之间插入。如果你解释如何忽略矩阵,插值应该是直截了当的。
答案 1 :(得分:0)
嗯..忽略“预期”矩阵我做了两件事...首先我忽略了矩阵调用中的预期矩阵
var matrix =
Matrix3DHelper.RotateByDegrees(renderParams.AngleX, renderParams.AngleY, renderParams.AngleZ) *
perspectiveMaterix;
我只是不使用perspectiveMatrix ......
和第二步..当progectin指向屏幕时,我忽略'W'参数
private Point3D GetTransformedPoint(Point3D p, Matrix3D m)
{
double w = (((m.M41 * p.X) + (m.M42 * p.Y)) + (m.M43 * p.Z)) + m.M44;
double x = ((((m.M11 * p.X) + (m.M12 * p.Y)) + (m.M13 * p.Z)) + m.M14) / (w);
double y = ((((m.M21 * p.X) + (m.M22 * p.Y)) + (m.M23 * p.Z)) + m.M24) / (w);
double z = (((m.M31 * p.X) + (m.M32 * p.Y)) + (m.M33 * p.Z)) + m.M34;
return new Point3D(x, y, z, w);
}