矩阵实验室 3D 视图矩阵



A是 MATLAB 的 4x4 视图矩阵,由以下公式从视图函数获得:

A = view;

A(1:3,1:3)应对应于旋转和缩放,
A(1:3,4)应与翻译相对应,并且
A(4,:)应该只是[0 0 0 1].

将相机参数设置为以下简单方案时:

camproj('orthographic')
set(gca, 'CameraPosition', [0,0,0])
set(gca, 'CameraTarget', [0,0,1])
set(gca, 'CameraUpVector', [0,1,1])

我明白A = view是:

-1 0 0  0.5
 0 1 0 -0.5
 0 0 1 -0.5
 0 0 0    1

现在我无法弄清楚我们的 0.5 来自哪里。请注意,我将相机位置设置为 [0,0,0],因此不应进行平移。

另一个特点是通过以下方式将相机位置设置为 [0,0,10]:

set(gca, 'CameraPosition', [0,0,10])

导致 A:=view 矩阵变为

1 0  0 -0.5
0 1  0 -0.5
0 0 -1  5.5
0 0  0    1

所以我注意到 -0.5 在 A(3,4) 中变成了 5.5,这在某种程度上与 5 = 10/2 有关。
也就是说,将相机位置更改为 [0,0,a] 会将A(3,4)处的视图矩阵更改大约 a / 2

这是。。。奇怪?奇特?奇怪?

更新:另一个特点是 A(1:3,1:3) 的行列式是 -1,尽管对于旋转矩阵,它应该是 1。当它是-1时,这意味着它不仅是旋转,而且是反射。我们为什么需要反思?

在 Matlab 2013a 中尝试相同的操作,您会发现结果符合预期...我不知道你使用的是哪个版本的 Matlab..但它肯定在 8.1 版中得到了修复

我有根据的猜测是,matlab 允许您将其设置为像素坐标在 (-0.5*视口大小,0.5*视口大小)范围内,但在内部使用更常见的像素坐标系统,其中每个像素的坐标在 (0, 视口大小) 范围内。

不熟悉 matlab,但是: 在 3D 图形中,您始终区分投影矩阵和相机矩阵。

投影

从相机为零的"相机空间"到投影空间。应用射影矩阵后,屏幕坐标计算为 x' = x/w 等。因此,在透视下,射影矩阵所做的只是将z移动到w中。在正字法中,可能会将 z 添加到 x 中。

但它通常也包括窗口转换。在相机空间中,相机位于 0 并向下看 z,因此坐标更多为 -1..1。但是窗口坐标是 0..1,因此通常是 *.5、+.5 或否定等。

你看到的怪异之处在于混合了相机和投影。我相信matlab两者都有。使用相机矩阵移动和旋转相机。仅将投影用于窗口坐标和透视效果。

最新更新