【译】glTF教程:相机(十六)
相机
在示例:简单相机小节中的示例展示了如何定义透视和正投影相机,以及如何通过将它们附加到节点来将它们集成到场景中。本节将解释这两种类型的相机之间的区别,以及相机的一般处理方法。
透视和正投影照相机
有两种摄像机:透视摄像机,其中观察体积是一个截断的金字塔(通常称为“观察平面”),以及正投影摄像机,其中观察体积是一个矩形框。主要区别在于,使用perspective camera进行渲染会导致适当的透视图失真,而使用orthographic camera进行渲染则会保留长度和角度。
在示例:简单相机部分中的示例中,每种类型的相机都有一个,一个索引为0的透视相机和一个索引为1的正投影相机:
"cameras" : [
{
"type": "perspective",
"perspective": {
"aspectRatio": 1.0,
"yfov": 0.7,
"zfar": 100,
"znear": 0.01
}
},
{
"type": "orthographic",
"orthographic": {
"xmag": 1.0,
"ymag": 1.0,
"zfar": 100,
"znear": 0.01
}
}
],
相机的type
是一个字符串,可以是"perspective"
或"orthographic"
。根据这种类型,“camera”对象包含camera.perspective
对象或 camera.orthographic
对象。这些对象包含定义实际查看卷的附加参数。
camera.perspective
对象包含一个aspectRatio
属性,该属性定义了viewport的纵横比。此外,它还包含一个名为yfov
的属性,代表Field Of View in Y-direction。它定义了摄像机的“打开角度”,并以弧度表示。
camera.orthographic
对象包含xmag
和 ymag
属性。这些定义了相机在x和y方向上的放大倍数,并基本描述了可视体积的宽度和高度。
此外,这两种相机类型都包含 znear
和 zfar
属性,这是近距离剪切平面和远距离剪切平面的坐标。对于透视相机, zfar
值是可选的。当它丢失时,将使用一个特殊的“无限投影矩阵”。
解释摄像机、视图和投影的细节超出了本教程的范围。重要的一点是,大多数图形api提供了直接基于这些参数定义查看配置的方法。一般来说,这些参数可以用来计算一个摄像机矩阵。摄像机矩阵可以倒转得到model-view matrix,后与model-view matrix相乘得到渲染器需要的model-view matrix。
相机方向
一个camera
可以被转换成在场景中有一定的方向和观看方向。这是通过将摄像头连接到一个node
来完成的。每个 node
可能包含附加到它的camera
的索引。在简单的摄像机示例中,摄像机有两个节点。第一个节点为索引0的透视相机,第二个节点为索引1的正投影相机:
"nodes" : {
...
{
"translation" : [ 0.5, 0.5, 3.0 ],
"camera" : 0
},
{
"translation" : [ 0.5, 0.5, 3.0 ],
"camera" : 1
}
},
如场景和节点部分所示,这些节点可能具有定义节点的转换矩阵的属性。节点的场景和节点然后定义场景中摄像机的实际方向。有了对节点应用任意动画的选项,甚至可以定义摄像机飞行。
当摄像机节点的全局变换为单位矩阵时,摄像机的视点在原点,观看方向为负z轴。在给定的例子中,节点都有一个translation
(0.5,0.5,3.0),相应地导致相机改变了:它是翻译约0.5在x - y方向,看单位的中心广场,和沿着z轴约3.0,它有点远离对象。
摄像头实例化和管理
在glTF的JSON部分中可能定义了多个摄像机。每个摄像机可以由多个节点引用。因此,出现在glTF资产中的相机实际上是实际相机实例的“模板”:每当一个节点引用一个相机时,就会创建这个相机的一个新实例
glTF资产没有“默认”摄像机。相反,客户机应用程序必须跟踪当前活动的摄像机。例如,客户端应用程序可以提供下拉菜单,允许用户选择活动摄像机,从而在预定义的视图配置之间快速切换。通过更多的实现工作,客户机应用程序还可以为摄像机控件定义自己的摄像机和交互模式(例如,使用鼠标滚轮缩放)。但是,在这种情况下,导航和交互的逻辑必须由客户机应用程序单独实现。示例:简单相机显示了这种实现的结果,用户可以从glTF资产中定义的摄像机中选择活动摄像机,也可以选择可以用鼠标控制的“外部摄像机”。