【译】glTF教程:相机(十六)

【译】glTF教程:相机(十六)

2019-02-22

相机

示例:简单相机小节中的示例展示了如何定义透视和正投影相机,以及如何通过将它们附加到节点来将它们集成到场景中。本节将解释这两种类型的相机之间的区别,以及相机的一般处理方法。

透视和正投影照相机

有两种摄像机:透视摄像机,其中观察体积是一个截断的金字塔(通常称为“观察平面”),以及正投影摄像机,其中观察体积是一个矩形框。主要区别在于,使用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对象包含xmagymag 属性。这些定义了相机在x和y方向上的放大倍数,并基本描述了可视体积的宽度和高度。

此外,这两种相机类型都包含 znearzfar属性,这是近距离剪切平面和远距离剪切平面的坐标。对于透视相机, 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资产中定义的摄像机中选择活动摄像机,也可以选择可以用鼠标控制的“外部摄像机”。