编码 three.js 时使用的 .json 和 .js 文件有什么区别?
What is difference between .json and .js file which are used while coding three.js?
.json 和 .js 文件在 three.js 中使用。它们是对象的格式之一。他们之间有什么区别?他们需要不同的加载程序来加载对象吗?
我正在关注这个 three.js 示例:http://mrdoob.github.io/three.js/examples/webgl_materials_cars.html。在该示例中,使用对象和 BinaryLoader 的 .js 文件。但是当我做同样的事情时,我已经使用 BinaryLoader 为我的对象使用了 .js 文件,但它没有用。它适用于 JSONLoader。所以我想知道如何识别 .js 或 .json 文件和相应对象的加载程序?
.json and .js file are used in three.js. They are one of the object's format. what is difference between them?
js
扩展标记文件内容 应该是 遵循 javascript 语法的脚本,因此是人类可读的。
json
扩展名表示文件内容 应该是 遵循 javascript 对象语法的树结构(javascript 对象无关具有 3d 对象),因此是人类可读的。此结构对于 .js 扩展名也有效,换句话说,任何有效的 json 文件也是有效的 js 文件。
三个 js 加载器来自 big part 文件解析器。这些加载器根本不关心文件扩展名。它被忽略了。对解析器来说唯一重要的是文件的内容。
Do they require different loaders to load the object?
据我所知,three.js可以加载多种结构。每一种都有自己的加载器(加载器包含一个或多个解析器)。
最基本的就是JSONLoader。它需要具有特定 json 结构的文件(关于材料、法线、位置、纹理坐标等或多或少的数据,并非所有内容都是强制性的)。
您提供的示例使用了 BinaryLoader。这个二进制加载器需要两个文件(据我所知)。第一个文件包含 json 结构以及其他文件的材料和位置(因此 json 解析器用于解析此文件)。第二个文件包含缓冲区(关于法线、位置、纹理坐标的数据......)并且是二进制文件。我不知道这里使用的是什么确切的二进制结构。你看这是一种混合,如果你在 json 结构中提供缓冲区数据,它将无法读取它。
我听说的最后一个加载器是 fbxloader,它可以读取例如在 blender 中创建的结果。但我不确定这个是否有效。
In that example .js file for object and for that BinaryLoader is used. But when I do the same means I had used the .js file for my object with BinaryLoader, it did not worked.
我希望现在一切都清楚了。 BinaryLoader 需要两个具有 json 和二进制结构的文件。它忽略包括扩展名的文件名。如果您创建两个名为 blablabla.wtf 和 blabla.omg 的文件,但内部结构正确,它将起作用。我猜您有一个 json 结构正确的文件。这仅适用于 JSONLoader。
有关文件加载器的更多信息
我们可以讨论三个方面。解析速度、文件大小和可维护性。
如果你想在 运行 上下载越来越多的数据,解析速度就更重要了。
如果当前大小要突破某个限制(不应该或不能突破),文件大小就更为重要。
如果您需要大量更改文件内容,则可维护性更为重要。
二进制格式在文件大小和解析速度方面更好。但主要浏览器使用 gzip/bzip 压缩,这使得 json 文件几乎与二进制文件大小相同。可维护性应该始终是最重要的方面。 Json 结构非常容易维护和调试。 fbx 或其他二进制格式更适合具有大量资产的大型而强大的项目。
编辑:
恐怕我还得解释多一点...
让我们来谈谈整个概念。假设我们有一个空的世界,我们想在里面放两个模型,简单的立方体和一些动物。
可以通过三种基本方法来做到这一点。程序生成它,使用外部数据或混合(部分是程序,部分是外部数据)。
例如,程序或混合可能是海浪。
程序生成是通过程序中的一些算法完成的,而外部数据必须通过一些程序工具插入,加载程序。
现在检查立方体和动物。立方体只是由 6 个平面组成的简单物体。它不能移动,不能呼吸,不能吃东西,任何东西。它只是存在。另一方面,动物要复杂得多,它不会只呆在中间不动。所有这些东西都将成为外部数据(一个或多个文件)的一部分。
我提供了两个截然不同的东西,但重要的是要知道即使是最简单的东西在 3D 中也很复杂并且可以用不同的方式进行操作。例如,那个立方体有什么颜色?每架飞机的颜色都一样吗?有光泽吗?能反映吗?
主要是加载器能够接受、阅读和理解什么样的描述。首先你必须知道加载器的一切,然后你可以创建一个对象。
这是 JSONLoader
可以接受的结构示例:
https://github.com/mrdoob/three.js/wiki/JSON-Geometry-format-4
https://github.com/mrdoob/three.js/wiki/JSON-Material-format-4
例如,如果 "metadata"
包含 "type": "Geometry"
,则加载程序将查找 "indices"
、"vertices"
、"normals"
和 "uvs"
。有些部分可能是可选的,例如 "uvs"
。
简单的立方体只能从顶点组装,但这可能不是这个特定的加载器所知道的,即使你的结构确实有意义,加载器也可能不知道。
二进制加载器非常不同,因为二进制代码中没有单词,只有 0 和 1。所以你需要大量的元数据来指定里面到底是什么。元数据可以是同一文件的一部分,也可以是某个不同文件的一部分。但这又取决于加载器将在哪里寻找它们。
Could you please tell me, what do mean by JSON structure?
通常我指的是特定加载程序可读的结构。
I am guessing that it might be the content that .js file has.
以您提供的示例为例,此文件中是 json 结构:
http://mrdoob.github.io/three.js/examples/obj/veyron/VeyronNoUv_bin.js
.js file content is different when it is used with BinaryLoader as you have mentioned it contains buffers.
更准确地说,它不包含缓冲区。它包含关键字 "buffers":
引导我们到文件 "VeyronNoUv_bin.bin",其中是缓冲区的数据。
它还包含与 "VeyronNoUv_bin.bin" 相关的其他重要信息( 有多少顶点、法线等 )。所以你可以说,.js 文件内容包含其自身的元数据和相关二进制文件的元数据。
有关顶点、法线等的数据稍后会加载到程序中的缓冲区中,这就是为什么他们选择关键字 buffers。更精确的标识是 dataForBuffers。
And when it is used with JSONLoader it contains long list of vertices. Am I understanding right?
没错!使用 JSONLoader 时,会读取 顶点等 的长列表,然后将其加载到缓冲区中。
.json 和 .js 文件在 three.js 中使用。它们是对象的格式之一。他们之间有什么区别?他们需要不同的加载程序来加载对象吗?
我正在关注这个 three.js 示例:http://mrdoob.github.io/three.js/examples/webgl_materials_cars.html。在该示例中,使用对象和 BinaryLoader 的 .js 文件。但是当我做同样的事情时,我已经使用 BinaryLoader 为我的对象使用了 .js 文件,但它没有用。它适用于 JSONLoader。所以我想知道如何识别 .js 或 .json 文件和相应对象的加载程序?
.json and .js file are used in three.js. They are one of the object's format. what is difference between them?
js
扩展标记文件内容 应该是 遵循 javascript 语法的脚本,因此是人类可读的。
json
扩展名表示文件内容 应该是 遵循 javascript 对象语法的树结构(javascript 对象无关具有 3d 对象),因此是人类可读的。此结构对于 .js 扩展名也有效,换句话说,任何有效的 json 文件也是有效的 js 文件。
三个 js 加载器来自 big part 文件解析器。这些加载器根本不关心文件扩展名。它被忽略了。对解析器来说唯一重要的是文件的内容。
Do they require different loaders to load the object?
据我所知,three.js可以加载多种结构。每一种都有自己的加载器(加载器包含一个或多个解析器)。
最基本的就是JSONLoader。它需要具有特定 json 结构的文件(关于材料、法线、位置、纹理坐标等或多或少的数据,并非所有内容都是强制性的)。
您提供的示例使用了 BinaryLoader。这个二进制加载器需要两个文件(据我所知)。第一个文件包含 json 结构以及其他文件的材料和位置(因此 json 解析器用于解析此文件)。第二个文件包含缓冲区(关于法线、位置、纹理坐标的数据......)并且是二进制文件。我不知道这里使用的是什么确切的二进制结构。你看这是一种混合,如果你在 json 结构中提供缓冲区数据,它将无法读取它。
我听说的最后一个加载器是 fbxloader,它可以读取例如在 blender 中创建的结果。但我不确定这个是否有效。
In that example .js file for object and for that BinaryLoader is used. But when I do the same means I had used the .js file for my object with BinaryLoader, it did not worked.
我希望现在一切都清楚了。 BinaryLoader 需要两个具有 json 和二进制结构的文件。它忽略包括扩展名的文件名。如果您创建两个名为 blablabla.wtf 和 blabla.omg 的文件,但内部结构正确,它将起作用。我猜您有一个 json 结构正确的文件。这仅适用于 JSONLoader。
有关文件加载器的更多信息
我们可以讨论三个方面。解析速度、文件大小和可维护性。 如果你想在 运行 上下载越来越多的数据,解析速度就更重要了。 如果当前大小要突破某个限制(不应该或不能突破),文件大小就更为重要。 如果您需要大量更改文件内容,则可维护性更为重要。
二进制格式在文件大小和解析速度方面更好。但主要浏览器使用 gzip/bzip 压缩,这使得 json 文件几乎与二进制文件大小相同。可维护性应该始终是最重要的方面。 Json 结构非常容易维护和调试。 fbx 或其他二进制格式更适合具有大量资产的大型而强大的项目。
编辑:
恐怕我还得解释多一点...
让我们来谈谈整个概念。假设我们有一个空的世界,我们想在里面放两个模型,简单的立方体和一些动物。
可以通过三种基本方法来做到这一点。程序生成它,使用外部数据或混合(部分是程序,部分是外部数据)。
例如,程序或混合可能是海浪。
程序生成是通过程序中的一些算法完成的,而外部数据必须通过一些程序工具插入,加载程序。
现在检查立方体和动物。立方体只是由 6 个平面组成的简单物体。它不能移动,不能呼吸,不能吃东西,任何东西。它只是存在。另一方面,动物要复杂得多,它不会只呆在中间不动。所有这些东西都将成为外部数据(一个或多个文件)的一部分。
我提供了两个截然不同的东西,但重要的是要知道即使是最简单的东西在 3D 中也很复杂并且可以用不同的方式进行操作。例如,那个立方体有什么颜色?每架飞机的颜色都一样吗?有光泽吗?能反映吗?
主要是加载器能够接受、阅读和理解什么样的描述。首先你必须知道加载器的一切,然后你可以创建一个对象。
这是 JSONLoader
可以接受的结构示例:
https://github.com/mrdoob/three.js/wiki/JSON-Geometry-format-4
https://github.com/mrdoob/three.js/wiki/JSON-Material-format-4
例如,如果 "metadata"
包含 "type": "Geometry"
,则加载程序将查找 "indices"
、"vertices"
、"normals"
和 "uvs"
。有些部分可能是可选的,例如 "uvs"
。
简单的立方体只能从顶点组装,但这可能不是这个特定的加载器所知道的,即使你的结构确实有意义,加载器也可能不知道。
二进制加载器非常不同,因为二进制代码中没有单词,只有 0 和 1。所以你需要大量的元数据来指定里面到底是什么。元数据可以是同一文件的一部分,也可以是某个不同文件的一部分。但这又取决于加载器将在哪里寻找它们。
Could you please tell me, what do mean by JSON structure?
通常我指的是特定加载程序可读的结构。
I am guessing that it might be the content that .js file has.
以您提供的示例为例,此文件中是 json 结构: http://mrdoob.github.io/three.js/examples/obj/veyron/VeyronNoUv_bin.js
.js file content is different when it is used with BinaryLoader as you have mentioned it contains buffers.
更准确地说,它不包含缓冲区。它包含关键字 "buffers":
引导我们到文件 "VeyronNoUv_bin.bin",其中是缓冲区的数据。
它还包含与 "VeyronNoUv_bin.bin" 相关的其他重要信息( 有多少顶点、法线等 )。所以你可以说,.js 文件内容包含其自身的元数据和相关二进制文件的元数据。
有关顶点、法线等的数据稍后会加载到程序中的缓冲区中,这就是为什么他们选择关键字 buffers。更精确的标识是 dataForBuffers。
And when it is used with JSONLoader it contains long list of vertices. Am I understanding right?
没错!使用 JSONLoader 时,会读取 顶点等 的长列表,然后将其加载到缓冲区中。