Matlab 3D 视图矩阵

12

假设A是MATLAB的4x4视角矩阵,通过view函数获得:

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:=视图矩阵的值变为

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

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

这很奇怪?异常?古怪?

更新: 另一个奇特之处在于A(1:3,1:3)的行列式为-1,尽管对于旋转矩阵应该为1。当它为-1时,这意味着不仅进行了旋转还进行了反射。我们为什么需要反射呢?


我也得到了相同的结果,真的很奇怪... 值得一提的是,请查看这个线程,它提到了几个与 3D 视图和 2D 投影相关的未记录的轴属性。 - Amro
3个回答

1

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


0

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


0

虽然不熟悉Matlab,但在3D图形中,您总是区分投影和相机矩阵。

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

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

您看到的奇怪现象是通过混合相机和投影实现的。我确信Matlab都有。使用相机矩阵来移动和旋转相机。仅使用投影进行窗口坐标和透视效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接