1. 相机

1.1. 相机概述

三维空间中在屏幕中呈现的画面,即是相机观察到的视角画面。实际是以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标。通俗的说是三维空间的物体根据相应的规则(相机定义)映射到相机上产生的画面。

要定义一个摄像机,我们需要它在世界空间中的位置(Position)、观察的方向( Direction )、一个指向它右轴( Right )的向量以及一个指向它上方( Up )的向量。

01


1.2. 定义相机

1.2.1. 相机的位置( Position )

摄像机位置简单来说就是世界空间中摄像机的位置。在 iTwin 中可采用 Camera.getEyePoint(), 或 Camera.setEyePoint(point: XYAndZ) 方法获取或设置相机的位置。

1.2.2. 相机的方向( Direction )

指的是摄像机指向哪个方向。在iTwin中,可采用 targetPoint (目标点)与 eyePoint (相机位置) 作为矢量相减得到,即场景目标点向量减去摄像机位置向量的结果就是摄像机的指向向量。

1.2.3. 相机的右轴( Right )

它代表摄像机空间的x轴的正方向。为获取右向量我们需要先使用一个小技巧:先定义一个上向量(Up Vector)。接下来把上向量和第二步得到的方向向量进行叉乘。两个向量叉乘的结果会同时垂直于两向量,因此我们会得到指向x轴正方向的那个向量。

1.2.4. 相机的上轴( Up )

指相机的头顶方向,不能与相机的方向( Direction )平行。在 iTwin 中采用向量作为表示,即 upVector: Vector3d。

1.2.5. 相机的视野( Field of View )

视野(Field of View)或 fov 定义了我们可以看到场景中多大的范围。当视野变小时,场景投影出来的空间就会减小,产生放大了的感觉。

  • 相机中的近平面(Near/Front Plane)、远平面(Far/Back Plane)、焦平面(Focus Plane)如图所示
    • 02
  • 相机中的 Fov 如图所示,为图黄色区域:
透视图 侧视图
03 04

1.2.6. 相机的视锥体(View Frustum)

指的是远平面(Far/Back Plane)与近平面(Near/Front Plane)组成的梯形锥体(灰色区域)。远平面的距离应大于近平面的距离,否则不显示图像。如下图所示:

05


1.3. 相机的投影方式

投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程。你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程。投影变换是所有变换中最复杂的一个。视锥体的形状决定了模型如何投影到屏幕上,主要分为正交投影(Orthographic)和透视投影(Perspective)。

1.3.1. 正交投影(Orthographic)

正交投影是相对简单的一种,坐标的相对位置都不会改变,所有光线都是平行传播,视锥体(View Frustum)可视为一个长方体,且远平面在无限远的地方,通常应用在制图的立面图中,如下图所示:

06

iTwin 中关闭相机( selectedView.view.turnCameraOff() )即采用正交投影方式对模型进行展示,展示的效果将是:如两个一样大的物体放在相机相同位置,或者有远近的放置,是看不出来大小缩放的,也看不出谁前谁后。

07

注: 当视锥体中的宽度与高度的比例与模型的宽高比不一致时,映射出的画面从感官上认为图形被挤压了。

长方体比例与原始一致 长方体左右与上下截面的比例大于原始比例 长方体左右与上下截面的比例小于原始比例
08 09 10

1.3.2. 透视投影(Perspective)

透视投影与人眼观察视角类似,遵循近大远小,如有一个模型放在相机距离较近,那么就会显示的特别大,相反距离越远就越小(如下图)。也是 iTwin 打开相机的默认投影方式。

11

iTwin 中开启相机( selectedView.turnCameraOn() ),即开启了透视投影方式对模型进行展示。如下图所示,左边为呈现的三维画面;右边为相机在二维空间的位置(白色的点)及视野范围(蓝色线),绿色的线可看作为焦平面(Focus plane),不在焦平面上的图形将会失焦(模糊)。

11

1.3.3. 投影切换

在 iTwin 中进行投影方式的切换即开关相机( turn camera on/off )即可。

当开关相机时,iTwin 将保持相同的视野角度(Lens Angel)和焦距,但是由于需要确定相机的位置,会在屏幕中央一部分可见区域推测最远和最近的可见几何体,以此确定相机的位置。


更多可在 iTwin 的 Sample 示例中进行体验。

results matching ""

    No results matching ""