让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:=视图矩阵变为
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时它意味着它不仅是旋转而且是反射。我们为什么需要反思?
答案 0 :(得分:1)
在Matlab 2013a中尝试相同的...你会发现匹配期望的结果......我不知道你正在使用哪个版本的Matlab ..但它在版本8.1中肯定是固定的
答案 1 :(得分:0)
我受过教育的猜测是,matlab允许你设置它,好像像素坐标在(-0.5 *视口大小,0.5 *视口大小)的范围内,但内部使用更常见的像素坐标系统,其中坐标每个像素的范围是(0,视口大小)。
答案 2 :(得分:0)
不熟悉matlab,但是:在3d图形中,您始终可以区分投影和相机矩阵。
投影从相机处于零的“相机空间”到投影空间。在应用投影矩阵之后,将屏幕坐标计算为x'= x / w等。因此,在透视下,所有投影矩阵都将z移动到w。在正交中,可能会将z添加到x中。
但它也经常包括窗口转换。在相机空间中,相机处于0并向下看z,因此坐标更多为-1..1。但窗口坐标为0..1,因此通常为* .5,+ 5或否定等。
你看到的奇怪之处在于混合相机和投影。我相信matlab都有。使用相机矩阵移动和旋转相机。仅将投影用于窗口坐标和透视效果。