Matlab三维视图矩阵

Matlab三维视图矩阵,matlab,view,3d,Matlab,View,3d,设A为MATLAB的4x4视图矩阵,通过以下方式从视图函数中获得: A = view; A(1:3,1:3)应与旋转和缩放相对应, A(1:3,4)应与翻译相对应,且 A(4,:)应该是[01] 将相机参数设置为以下简单场景时: camproj('orthographic') set(gca, 'CameraPosition', [0,0,0]) set(gca, 'CameraTarget', [0,0,1]) set(gca, 'CameraUpVector', [0,1,1]) 我得到

A
为MATLAB的4x4视图矩阵,通过以下方式从视图函数中获得:

A = view;
A(1:3,1:3)
应与旋转和缩放相对应,
A(1:3,4)
应与翻译相对应,且
A(4,:)
应该是
[01]

将相机参数设置为以下简单场景时:

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时,意味着它不仅是旋转,而且是反射。为什么我们需要反射?

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

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

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

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


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

在Matlab 2013a中尝试相同的方法。。你会发现结果符合预期…我不知道你使用的是哪个版本的Matlab。。但它在8.1版中肯定是固定的,我也得到了同样的结果,真的很奇怪。。。关于它的价值,请查看这篇文章,其中提到了一些与3D视图和2D投影相关的未记录的轴属性