Matlab 3D视图矩阵

Ofe*_*fer 12 3d matlab view

AMATLAB的4x4视图矩阵,从视图函数获得:

A = view;
Run Code Online (Sandbox Code Playgroud)

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])
Run Code Online (Sandbox Code Playgroud)

我明白了A = view:

-1 0 0  0.5
 0 1 0 -0.5
 0 0 1 -0.5
 0 0 0    1
Run Code Online (Sandbox Code Playgroud)

现在我无法确定0.5的来源.请注意,我将相机位置设置为[0,0,0],因此不应该进行翻译.

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

set(gca, 'CameraPosition', [0,0,10])
Run Code Online (Sandbox Code Playgroud)

导致A:=视图矩阵变为

1 0  0 -0.5
0 1  0 -0.5
0 0 -1  5.5
0 0  0    1
Run Code Online (Sandbox Code Playgroud)

所以我注意到-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时它意味着它不仅是旋转而且是反射.我们为什么需要反思?

Tal*_*rom 0

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