12

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 已更改为 5.5 in A(3,4),这在某种程度上与 5 = 10 / 2有关。
也就是说,将相机位置更改为 [0,0,a] 会使视图矩阵A(3,4)大致更改为a / 2.

这……很奇怪?奇特?奇怪的?

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

4

3 回答 3

1

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

于 2013-08-01T14:19:13.353 回答
0

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

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

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

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

于 2012-10-30T04:18:27.147 回答
0

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

于 2012-06-14T08:33:27.597 回答