在FireMonkey中创建正交投影矩阵

时间:2014-05-15 13:11:52

标签: delphi matrix 3d projection orthographic

我使用FireMonkey创建一个3D场景,效果很好:相机设置和下图中,三个拉伸的立方体显示三个轴(红色X,绿色Y,蓝色Z。)

  

Normal 3D perspective view in FireMonkey

     

FireMonkey中的普通3D透视图 - ProjectionpjCamera

然而,这是一个透视3D场景,我想要一个正交三维投影 - 也就是说,一个物体的尺寸随着它们越来越远而不会减少的投影。 (最终的想法是使用它来显示3D等距视图。)FireMonkey似乎没有正交投影代码 - pjCamera转换为使用透视矩阵。

我根本不需要透视3D视图,所以通过用一种方法替换透视矩阵方法来代替它,而不是创建一个正交矩阵。也就是说,TContext3D.GetProjectionMatrix(获取透视矩阵)调用MatrixPerspectiveFovRH来计算透视矩阵:

Result := MatrixPerspectiveFovRH(cPI / 4, FWidth / FHeight, 1.0, 1000.0);

我用调用ortho矩阵替换它:

Result := IdentityMatrix3D;
Result.m11 := 2 / FWidth;
Result.m22 := 2 / FHeight;
Result.m33 := 1 / (zn - zf);
Result.m43 := zn / (zn - zf);

其中zn = 1且zf = 1000. FWidth是视图的宽度(以320为单位),FHeight是像素的高度,比如说240。

这个最初似乎工作正常,但距离对象远远超出我的预期: enter image description here

问题在于渲染图像似乎不再随着相机位置而改变。我已经验证了世界视图矩阵的计算方法是相同的(即不受我的更改影响),但是当我将相机移近(0,0,0)时,可见对象会被修剪,但渲染的图像本身并没有。更改。例如,在这里我将相机移动到非常接近(0,0,0),这里是相同相机位置的透视和正交渲染: enter image description here

显然,我计算正投影的方式有问题,但我不知道。

  • 我知道改变正交计算中使用的宽度和高度似乎可以使物体更近,更远 - 更小的宽度和高度使它们更靠近屏幕。
  • 我很确定正交矩阵设置应该是正确的 - 尽管显然这是错误的:)
  • 虽然它在引擎盖下使用DirectX,但透视矩阵是右手矩阵,因此正交矩阵也应该是。

我已经阅读了很多关于如何设置正交矩阵的内容,但显然不是正确的事情。例如:

  • widthheight代表屏幕宽度和高度,或其他东西 - 例如平截头体?我没有读到任何内容解释了这些是什么,假设它们是显而易见的。
  • 如果他们是其他东西,我可以从哪里提取他们的价值?如果我允许计算它,我可以从透视矩阵中提取它们吗?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

YouTube上有很棒的视频。搜索" Quark Cube"。 A - 显然 - 德国开发者有一些很棒的视频,它们在Firemonkey中展示了很多3D节目。

对你提问 - 这对我有用: 如果虚拟形状是形状的父形状,那么需要进行2次简单的更改:

这些调用将视图设置为正交: 在dummys活动" OnRender"拨打:
Context.SetCameraViewAngle(0.1);
Dummys Scale.Point属性必须设置为:
Dummy.Scale.Point:= TPoint3D.Create(1, 1, 1) / 45;

恢复透视图:
Dummy.Scale.Point:= TPoint3D.Create(1, 1, 1); Context.SetCameraViewAngle(45);

以上代码适合我。不,我绝对不是专家,但上面的代码是从一个2年的YouTube视频中提取的: "教程:带有正交视图的线框犹他茶壶(FireMonkey XE6 / Delphi XE6)" - 频道" Quark Cube"。
顺便说一句,我使用柏林10.2,所以它也适用于那个版本 希望这有帮助,对于遇到同样问题的其他开发人员也很有用。