【译】glTF教程:简单相机(十五)

【译】glTF教程:简单相机(十五)

2019-02-21

简单的相机

前几节展示了如何在glTF资产中表示带有几何对象的基本场景结构,以及如何对这些对象应用不同的材质。这还不包括应该用于渲染场景的视图配置信息。这种视图配置通常被描述为一个虚拟的“摄像机”,它包含在场景中的某个位置,并指向某个方向。

下面是一个简单、完整的glTF资产。它类似于已经显示的资产:它定义了一个简单的“场景”,其中包含“节点”对象,以及一个单独的几何对象,该对象以“网格”的形式给出,并附加到其中一个节点上。但该资产还包含两个camera对象:

{
  "scenes" : [
    {
      "nodes" : [ 0, 1, 2 ]
    }
  ],
  "nodes" : [
    {
      "rotation" : [ -0.383, 0.0, 0.0, 0.924 ],
      "mesh" : 0
    },
    {
      "translation" : [ 0.5, 0.5, 3.0 ],
      "camera" : 0
    },
    {
      "translation" : [ 0.5, 0.5, 3.0 ],
      "camera" : 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
      }
    }
  ],

  "meshes" : [
    {
      "primitives" : [ {
        "attributes" : {
          "POSITION" : 1
        },
        "indices" : 0
      } ]
    }
  ],

  "buffers" : [
    {
      "uri" : "data:application/octet-stream;base64,AAABAAIAAQADAAIAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAA",
      "byteLength" : 60
    }
  ],
  "bufferViews" : [
    {
      "buffer" : 0,
      "byteOffset" : 0,
      "byteLength" : 12,
      "target" : 34963
    },
    {
      "buffer" : 0,
      "byteOffset" : 12,
      "byteLength" : 48,
      "target" : 34962
    }
  ],
  "accessors" : [
    {
      "bufferView" : 0,
      "byteOffset" : 0,
      "componentType" : 5123,
      "count" : 6,
      "type" : "SCALAR",
      "max" : [ 3 ],
      "min" : [ 0 ]
    },
    {
      "bufferView" : 1,
      "byteOffset" : 0,
      "componentType" : 5126,
      "count" : 4,
      "type" : "VEC3",
      "max" : [ 1.0, 1.0, 0.0 ],
      "min" : [ 0.0, 0.0, 0.0 ]
    }
  ],

  "asset" : {
    "version" : "2.0"
  }
}

该资产中的几何图形是一个简单的单元正方形。它围绕x轴旋转-45度,以强调不同相机的效果。图17a显示了用于呈现此资产的三个选项。第一个示例使用资产中的摄像机。最后一个例子展示了从一个外部的、用户定义的视角来看场景的样子。


Image 17a:用不同的相机渲染场景的效果。

相机的定义

该glTF资产的新顶级元素是’ camera ‘数组,其中包含camera 对象:

"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
    }
  }
],

当一个摄像机对象被定义时,它可能被附加到一个“节点”上。这是通过将摄像机的索引分配给节点的“camera”属性来实现的。在给定的例子中,场景图中添加了两个新节点,每个摄像头一个:

"nodes" : {
  ...
  {
    "translation" : [ 0.5, 0.5, 3.0 ],
    "camera" : 0
  },
  {
    "translation" : [ 0.5, 0.5, 3.0 ],
    "camera" : 1
  }
},

透视和正投影相机之间的区别和它们的属性,将相机附加到节点的效果,以及多个相机的管理将在相机一节中详细说明。