Main Content

低级相机属性

可以设置的相机属性

相机图形基于一组坐标区属性,它们控制着相机的位置和方向。通常,如果使用相机命令(如 camposcamtargetcamup),则不需要直接访问这些属性。

属性

描述

CameraPosition

以坐标区单位指定视点的位置。

CameraPositionMode

automatic 模式下,由场景决定位置。在 manual 模式下,由您指定视点位置。

CameraTarget

指定坐标区中相机指向的位置。它与 CameraPosition 一起定义观察轴。

CameraTargetMode

automatic 模式下,MATLAB®CameraTarget 指定为坐标区图框的中心。在 manual 模式下,由您指定位置。

CameraUpVector

相机围绕观察轴的旋转由一个向量定义,指示方向为向上。

CameraUpVectorMode

automatic 模式下,MATLAB 将二维视图的 y 轴正方向和三维视图的 z 轴正方向作为向上向量。在 manual 模式下,由您指定方向。

CameraViewAngle

指定“镜头”的视野。如果您为 CameraViewAngle 指定了值,MATLAB 将不会拉伸坐标区以适应图窗。

CameraViewAngleMode

automatic 模式下,MATLAB 将视角调整为能够捕捉到整个场景的最小角度。在 manual 模式下,由您指定角度。

CameraViewAngleMode 设置为 manual 会覆盖伸展填充行为。

Projection

选择正交投影或透视投影。

默认视点选择

如果所有相机模式属性都设置为 auto(默认值),将由 MATLAB 自动控制视图,即,它会基于您希望场景填满位置矩形(由坐标区 Position 属性的宽度和高度分量决定)的假设来选择合适的值。

默认情况下,MATLAB

  • 按照标准 MATLAB 二维或三维视图的场景方向设置 CameraPosition(请参阅 view 命令)

  • CameraTarget 设置为图框的中心

  • 以二维视图的 y 方向和三维视图的 z 方向为向上方向来设置 CameraUpVector

  • CameraViewAngle 设置为能使场景填满位置矩形(由坐标区 Position 属性定义)的最小角度

  • 使用正交投影

此默认行为一般情况下可以产生理想的结果。但是,您可以更改这些属性以产生对您有用的效果。

移入和移出场景

您可以将相机移动到由坐标区定义的三维空间中的任何位置。相机无论在什么位置,都始终指向其目标。当相机移动时,MATLAB 将更改相机视角,确保场景填满位置矩形。

穿过场景

通过移动相机穿过场景,可以产生漫游效果。要实现此目的,需要不断地更改 CameraPosition 属性,使相机朝着目标移动。由于相机是在这个空间内穿过,因此它在经过相机目标之后会拐弯。如果将 CameraViewAngleMode 设置为 manual,则当您每次移动相机时,MATLAB 不再自动调整场景大小。

如果您更新 CameraPositionCameraTarget,效果是穿过场景时仍然面向移动方向。

如果 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

旋转但不调整大小

CameraViewAngleModeauto 时,MATLAB 将计算能够使场景大到足以填满坐标区位置矩形的 CameraViewAngle。这会在场景旋转过程中引起明显的大小变化。为了防止旋转时大小改变,您需要将 CameraViewAngleMode 设置为 manual(当您为 CameraViewAngle 属性指定值时,会自动启用此设置)。要在 orbit 函数中执行此操作,请添加以下语句

set(gca,'CameraViewAngleMode','manual')

围绕观察轴旋转

通过指定定义为向上的方向,可以更改场景的方向。默认情况下,MATLAB 将二维视图的 y 轴(CameraUpVector[0 1 0])和三维视图的 z 轴(CameraUpVector[0 0 1])定义为向上。但是,您可以指定任意方向作为向上的方向。

CameraUpVector 属性定义的向量构成相机坐标系的一个坐标轴。在内部,MATLAB 通过将指定的向量投影到垂直于相机方向(即观察轴)的平面上来确定相机向上向量的实际方向。这简化了 CameraUpVector 属性的设定,因为它不需要位于此平面上。

在很多情况下,您可能会发现根据与 xyz 轴之间形成的角度来可视化所需的向上向量很方便。然后,可以使用方向余弦将角度转换为向量分量。对于单位向量,表达式简化为

其中的角 α、β 和 γ 以度为单位指定。

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)

按此方向绘制球体将得到