低级相机属性
可以设置的相机属性
相机图形基于一组坐标区属性,它们控制着相机的位置和方向。通常,如果使用相机命令(如 campos
、camtarget
和 camup
),则不需要直接访问这些属性。
属性 | 描述 |
---|---|
CameraPosition | 以坐标区单位指定视点的位置。 |
CameraPositionMode | 在 |
CameraTarget | 指定坐标区中相机指向的位置。它与 |
CameraTargetMode | 在 |
CameraUpVector | 相机围绕观察轴的旋转由一个向量定义,指示方向为向上。 |
CameraUpVectorMode | 在 |
CameraViewAngle | 指定“镜头”的视野。如果您为 CameraViewAngle 指定了值,MATLAB 将不会拉伸坐标区以适应图窗。 |
CameraViewAngleMode | 在 将 |
Projection | 选择正交投影或透视投影。 |
默认视点选择
如果所有相机模式属性都设置为 auto
(默认值),将由 MATLAB 自动控制视图,即,它会基于您希望场景填满位置矩形(由坐标区 Position
属性的宽度和高度分量决定)的假设来选择合适的值。
默认情况下,MATLAB
按照标准 MATLAB 二维或三维视图的场景方向设置
CameraPosition
(请参阅view
命令)将
CameraTarget
设置为图框的中心以二维视图的 y 方向和三维视图的 z 方向为向上方向来设置
CameraUpVector
将
CameraViewAngle
设置为能使场景填满位置矩形(由坐标区Position
属性定义)的最小角度使用正交投影
此默认行为一般情况下可以产生理想的结果。但是,您可以更改这些属性以产生对您有用的效果。
移入和移出场景
您可以将相机移动到由坐标区定义的三维空间中的任何位置。相机无论在什么位置,都始终指向其目标。当相机移动时,MATLAB 将更改相机视角,确保场景填满位置矩形。
穿过场景
通过移动相机穿过场景,可以产生漫游效果。要实现此目的,需要不断地更改 CameraPosition
属性,使相机朝着目标移动。由于相机是在这个空间内穿过,因此它在经过相机目标之后会拐弯。如果将 CameraViewAngleMode
设置为 manual
,则当您每次移动相机时,MATLAB 不再自动调整场景大小。
如果您更新 CameraPosition
和 CameraTarget
,效果是穿过场景时仍然面向移动方向。
如果 Projection
设置为 perspective
,透视失真量将随着相机靠近目标而增加,随着相机远离目标而减少。
示例 - 移近目标或移离目标
要沿着观察轴移动相机,您需要计算 CameraPosition
属性的新坐标。这是通过减去(移近目标)或加上(移离目标)相机位置与相机目标之间总距离的几分之一来实现的。
如果参量 dist
为正,则函数 movecamera
按移入场景计算新的 CameraPosition
;如果参量 dist
为负,则按移出场景计算新位置。
function movecamera(dist) %dist in the range [-1 1] set(gca,'CameraViewAngleMode','manual') newcp = cpos - dist * (cpos - ctarg); set(gca,'CameraPosition',newcp) function out = cpos out = get(gca,'CameraPosition'); function out = ctarg out = get(gca,'CameraTarget');
将 CameraViewAngleMode
设置为 manual
可能会导致纵横比突然变化。
使场景变大或变小
调整 CameraViewAngle
属性可使场景的视图变大或变小。角度越大,视图包含的区域就越大,因此场景中的对象就显得越小。同理,角度越小,对象就显得越大。
更改 CameraViewAngle
会使场景变大或变小,而不会影响相机的位置。如果您希望放大,而不移动视点越过场景中将不再存在的对象(假如您更改了相机位置,就可能会发生这种情况),则可以使用这种方法。此外,更改 CameraViewAngle
不会像图窗属性 Projection
设置为 perspective
时更改 CameraPosition
那样影响应用于场景的透视量。
围绕场景旋转
您可以使用 view
命令通过更改方位角使视点围绕 z 轴旋转,通过更改仰角使视点围绕方位角旋转。这样可以产生围绕球体(半径等于观察轴的长度)曲面上的场景移动相机的效果。您可以通过更改 CameraPosition
实现相同的效果,但需要您执行调用 view
时由 MATLAB 完成的那些计算。
例如,函数 orbit
围绕场景移动相机。
function orbit(deg) [az, el] = view; rotvec = 0:deg/10:deg; for i = 1:length(rotvec) view([az+rotvec(i) el]) drawnow end
旋转但不调整大小
当 CameraViewAngleMode
为 auto
时,MATLAB 将计算能够使场景大到足以填满坐标区位置矩形的 CameraViewAngle
。这会在场景旋转过程中引起明显的大小变化。为了防止旋转时大小改变,您需要将 CameraViewAngleMode
设置为 manual
(当您为 CameraViewAngle
属性指定值时,会自动启用此设置)。要在 orbit
函数中执行此操作,请添加以下语句
set(gca,'CameraViewAngleMode','manual')
围绕观察轴旋转
通过指定定义为向上的方向,可以更改场景的方向。默认情况下,MATLAB 将二维视图的 y 轴(CameraUpVector
为 [0 1 0]
)和三维视图的 z 轴(CameraUpVector
为 [0 0 1]
)定义为向上。但是,您可以指定任意方向作为向上的方向。
CameraUpVector
属性定义的向量构成相机坐标系的一个坐标轴。在内部,MATLAB 通过将指定的向量投影到垂直于相机方向(即观察轴)的平面上来确定相机向上向量的实际方向。这简化了 CameraUpVector
属性的设定,因为它不需要位于此平面上。
在很多情况下,您可能会发现根据与 x、y 和 z 轴之间形成的角度来可视化所需的向上向量很方便。然后,可以使用方向余弦将角度转换为向量分量。对于单位向量,表达式简化为
其中的角 α、β 和 γ 以度为单位指定。
XComponent = cos(α*(pi/180));
YComponent = cos(β*(pi/180));
ZComponent = cos(γ*(pi/180));
有关方向余弦的详细说明,请查阅有关向量分析的数学书籍。
计算相机的向上向量
要指定与 z 轴呈 30° 夹角并且位于 y-z 平面上的向上向量,请使用以下表达式
upvec = [cos(90*(pi/180)),cos(60*(pi/180)),cos(30*(pi/180))];
然后设置 CameraUpVector
属性。
set(gca,'CameraUpVector',upvec)
按此方向绘制球体将得到