技术标签: OpenGL gltf json glb 三维图形
目录
4. buffers, bufferViews, accessors
gltf采用json格式描述3D模型的结构,主要用来解决3D模型在网络中的高效传输问题。
gltf 主要包括以下元素。
名称 | 含义 |
scenes, nodes | 场景基本结构 |
cameras | 相机 |
meshes | 三维几何 |
buffers, bufferViews, accessors | 数据块 |
materials | 材质 |
textures, images, samplers | 纹理,图片,采样器 |
skins | 蒙皮 |
animations | 动画 |
gltf中元素的关系图如下:
gltf中可以定义若干个场景(scenes),每个场景引用若干个节点(nodes),节点以树形结构的方式组织。
节点(nodes)可以包含坐标转换。该转换可以用平移(translation),旋转(rotation),缩放(scale)分别表示。
"nodes": [
{
"translation": [ 0,0,0 ],
"rotation": [ 0,0,0,1 ],
"scale": [ 1,1,1 ]
...
}
]
也可以通过4*4的矩阵(matrix)表示坐标转换。即:
"nodes": [
{
"matrix": [
1,0,0,0,
0,1,0,0,
0,0,1,0,
5,6,7,1
],
...
}
]
其中,矩阵(matrix)与表示平移(translation),旋转(rotation),缩放(scale)的矩阵之间,存在如下关系:
matrix = translation * rotation * scale
node还可以包含三维几何(mesh)和相机(camera)的信息。在渲染中,这些信息与上述变换矩阵相乘,就可以确定在场景中的位置。
"nodes": [
{
"mesh": 4,
...
},
{
"camera": 2,
...
},
]
三维几何(meshes)中可以包含多个片元(primitives)。 片元(primitives)包含了渲染需要信息。片元(primitives)中包含的信息如下:
字段 | 含义 |
---|---|
mode | 表示几何类型。如点(POINTS),线(LINES) , 或者三角形(TRIANGLES) |
attributes | 表示几何顶点信息。如位置(POSITION)和法线(NORMAL) |
indices | 表示几何顶点索引 |
material | 表示材质信息 |
三维几何(meshes)的例子如下:
"meshes": [
{
"primitives": [
{
"mode": 4,
"indices": 0,
"attributes": {
"POSITION": 1,
"NORMAL": 2
},
"material": 2
}]
}]
buffers包含了场景的几何数据,bufferViews是对buffers中数据的索引,accessors为bufferViews中的数据添加类型和布局。
buffers包含了场景的几何数据,一般是二进制数据的形式。buffers包含的字段如下:
字段 | 含义 |
---|---|
byteLength | 表示二进制数据的长度。 |
uri | 指向二进制数据的地址 |
二进制的几何数据有两种方式存储:一种是通过 base64的压缩后存入gltf文件中,此时字段uri的内容如下:
"buffers" : [
{
"byteLength" : 827640,
"uri" : "data:application/gltf-buffer;base64,AAAB..."
}
]
另一种单独存入以.bin为后缀名的文件中,然后以链接文件的方式接入gltf。此时字段uri的内容如下:
"buffers": [
{
"byteLength": 827640,
"uri": "gltf.bin"
}
]
bufferViews指向buffers中数据的一个片段。 bufferViews包含的字段如下:
字段 | 含义 |
---|---|
buffer | 表示一个二进制数据块,该块中存储了场景中的几何信息。 |
byteOffset | 表示相对buffer块起始位置的偏移。 |
byteLength | 表示了二进制数据的长度。 |
byteStride | 表示数据之间的间隔。 |
target | 表示opengl缓冲区的类型,如ARRAY_BUFFER,ELEMENT_ARRAY_BUFFER。 |
bufferViews的例子如下:
"bufferViews": [
{
"buffer": 0,
"byteOffset": 4,
"byteLength": 28,
"byteStride": 12,
"target": 34963
}]
accessors定义了bufferViews中的数据如何解释。accessors包含的字段如下:
字段 | 含义 |
---|---|
bufferViews | 指向一段二进制数据。 |
byteOffset | 表示相对bufferViews起始位置的偏移。 |
type | 表示数据类型,如"SCALAR","VEC2","MAT3"等。 |
componentType | 表示分量的数据类型,如unsigned short,float等。 |
count | 表示分量的个数。 |
min | 表示分量的最小值。数组的长度必须与分量的个数相同。 |
max | 表示分量的最大值。数组的长度必须与分量的个数相同。 |
accessors的例子如下:
"accessors": [
{
"bufferView": 0,
"byteOffset": 4,
"type": "VEC2",
"componentType": 5126,
"count": 2,
"min" : [0.1, 0.2],
"max" : [0.9, 0.8]
}]
示例
将上述三者结合起来,就可以准确的获取渲染所需的几何信息。如下图:
其中,bufferViews中的数据可以使用glBindBuffer绑定到openGL的缓冲区,accessor可以指定该缓冲区中定义了顶点的属性数据,并通过glVertexAttribPointer告诉顶点着色器(vertex shader)改如何解释和使用该缓冲区中的数据。
材质(materials)描述物体表面的特征,它决定了渲染器该如何渲染该物体。
材质模型 Metallic-Roughness-Model 描述了物体表面材质的金属特征和粗糙程度,是gltf中默认的材质模型。其中,Metallic描述了材质的金属特征,取值在0到1之间。取值越靠近1,表示金属特征越强。Roughness则描述了材质的粗糙程度,取值在0到1之间。取值越靠近1,表示越粗糙。
材质模型Metallic-Roughness-Model是gltf默认使用的材质模型。在gltf中, 对象pbrMetallicRoughness 定义了该模型。
字段 | 含义 |
---|---|
baseColorTexture | 物体表面纹理。 |
baseColorFactor | 颜色RGBA。没有纹理时,该项定义了物体表面颜色。 |
metallicRoughnessTexture | 在颜色的blue分量中,存储了金属程度。在颜色的green分量中,存储了粗糙程度。 |
metallicFactor | 金属程度因子。 |
roughnessFactor | 粗糙程度因子。 |
pbrMetallicRoughness的例子如下:
"materials": [
{
"pbrMetallicRoughness": {
"baseColorTexture": {
"index": 1,
"texCoord": 1
},
"baseColorFactor": [ 1.0, 0.75, 0.35, 1.0 ],
"metallicRoughnessTexture": {
"index": 5,
"texCoord": 1
},
"metallicFactor": 1.0,
"roughnessFactor": 0.0
}
}]
material中通过纹理索引(index)和纹理坐标(texCoord)引用纹理。纹理索引(index)是纹理数组中元素的索引号。纹理坐标(texCoord)定义在图元(primitive)在顶点属性中。
有两种类型的相机:透视投影相机和正交投影相机。
透视投影相机(perspective cameras)的定义如下:
字段 | 含义 |
---|---|
aspectRatio | 裁剪面的宽高比 |
yfov | 垂直夹角。可视空间顶面和底面的夹角。 |
zfar | 远裁剪面的位置 |
znear | 近裁剪面的位置 |
透视投影相机(perspective cameras)的示例如下:
"cameras": [
{
"type": "perspective",
"perspective": {
"aspectRatio": 1.5,
"yfov": 0.65,
"zfar": 100,
"znear": 0.01
}
}]
正交投影相机(orthographic cameras)的定义如下:
字段 | 含义 |
---|---|
xmag | 裁剪面宽度的1/2 |
ymag | 裁剪面高度的1/2 |
zfar | 远裁剪面的位置 |
znear | 近裁剪面的位置 |
正交投影相机(orthographic cameras)的示例如下:
"cameras": [
{
"type": "orthographic",
"orthographic": {
"xmag": 1.0,
"ymag": 1.0,
"zfar": 100,
"znear": 0.01
}
}]
材质(materials)中可以使用纹理(textures)指定物体表面的颜色和物理特征。纹理(textures)的定义的字段如下:
字段 | 含义 |
---|---|
source | 图片(images)数组的索引。 |
sampler | 采样器(samplers)数组的索引。 |
纹理(textures)的示例如下:
"textures": [
{
"source": 4,
"sampler": 2
}]
图片(images)的格式为jpg/png等,在纹理(texture)中引用。图片(images)有两种存储方式:
一种是通过base64的压缩成字符串,存入gltf;
"images": [
{
"uri": "data:image/png;base64,iVBORw0K..."
}
]
另一种以链接文件的方式接入gltf。
"images": [
{
"uri": "image01.png"
}
]
采样器(samplers)定义了图片放大或缩小时,如何获取颜色信息,类似于opengl中的设置纹理参数的函数glTexParameter。
采样器(samplers)定义的字段如下:
字段 | 含义 |
---|---|
magFilter | 纹理放大时,如何获取像素颜色。取值有Nearest或Linear |
minFilter | 纹理缩小时,如何获取像素颜色。取值有Nearest或Linear |
wrapS | 如何填充纹理图像左侧或右侧的区域。 |
wrapT | 如何填充纹理图像上方或下方的区域。 |
采样器(samplers)的示例如下:
"samplers": [
{
"magFilter": 9729,
"minFilter": 9987,
"wrapS": 10497,
"wrapT": 10497
}]
文章浏览阅读206次。服务器的系统备份一直困饶着企业网管,ghost也是从版本8系列开始支持ntfs格式,虽说也可以达到了备份服务器系统的要求,但效果无法满足实时备份(系统运行过程中实行备份),现在介绍的是由acronis出品的Acronis True Image Enterprise Server可以实现一健(F11)进行备份及恢复,而且可以在增量备份,不影响系统正常运行的情况下。这是安装好后..._acronis true image 9
文章浏览阅读57次。JDOM是一种使用 XML(标准通用标记语言下的一个子集) 的独特 Java 工具包,。它的设计包含 Java 语言的语法乃至语义。概述编辑JDOM是两位著名的 Java 开发人员兼作者,Brett Mclaughlin 和 Jason Hunter 的创作成果, 2000 年初在类似于Apache协议的许可下,JDOM作为一个开放源代码项目正式开始研发了。它已成长为包含来自...
文章浏览阅读832次。1.[LangChain-Chatchat学习资料-简介]2.[LangChain-Chatchat学习资料-Windows开发部署]3.[LangChain-Chatchat学习资料-Windows开发部署(踩坑篇)]4.LangChain-Chatchat学习资料-Ubuntu安装Nvidia驱动和CUDA5.LangChain-Chatchat学习资料-Ubuntu开发部署6.LangChain-Chatchat学习资料-Ubuntu开发部署(踩坑篇)_int4weightextractionhalf
文章浏览阅读458次。字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上有很多解释,但读起来都很_字符串匹配kmp算法时间复杂度
文章浏览阅读6.5k次。关于ElementUI中级联选择器选择内容时出现空白的情况使用ElementUI中级联选择器进行某些数据的选择时,发现最后一级是空白的页的情况,如下图所示:原因分析通过查看请求中的响应我们发现,响应数据中存在children为[]空数组的情况,而在ElementUI中的级联选择器里,[]会被解析为空白数据进行展示,因此,前端人员在接受到后端开发人员返回的数据时,需要将children为[..._element级联选择器空白框
文章浏览阅读613次,点赞2次,收藏2次。我的环境为 CDH 6.2 sqoop1.4.7 出现这个错误。我这里不考虑没有创建JOB的情况。因为,我已经创建几次job。同时我执行运行job时,有时可以运行,有时不可以运行。20/04/27 10:22:41 ERROR metastore.GenericJobStorage: Cannot restore job: acc_account_ply_base_job20/04/27 10..._error metastore.genericjobstorage: cannot restore job: myjob_incremental_imp
文章浏览阅读2.7k次。目录标题@[TOC](目录标题)借鉴文章出处URL就是出版商的文章页面路径,要把文章的全部网址复制到Sci-Hub主页的搜索框进行搜索。_scihub url
文章浏览阅读5.2k次,点赞30次,收藏115次。手把手教如何将个人项目部署到云服务器(超详细!!)步骤目录手把手教如何将个人项目部署到云服务器(超详细!!)前言一、云服务器设置1.1 首先去购买一个云服务器,阿里或腾讯,具体步骤就不讲了1.2 拿到服务器后先修改密码1.3 修改服务器安全组策略1.4 远程连接云服务器二、远程服务器环境配置2.1 安装jdk(1) 将Linux系统下自带JDK(如果原先安装过,无则忽略)的删除(2) JDK11的安装(3) 设置JAVA_HOME2.2 安装配置MySQL(1)下载mysql(2)卸载Maria DB_spring boot vue 部署 图解
文章浏览阅读5.8k次,点赞3次,收藏12次。Docker容器—Windows下的安装与使用_docker windows容器
文章浏览阅读1.7k次,点赞27次,收藏27次。SysBench 是一个跨平台且支持多线程的模块化基准测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现。可绕过复杂的数据库基准设置,甚至在没有安装数据库的前提下,快速了解数据库系统的性能。
文章浏览阅读3.9k次。原理返回的用户信息是在deployerConfigContext.xml中的配置的既然想自定义返回的用户信息,那么继承org.jasig.services.persondir.support.StubPersonAttributeDao就好了1、创建com.jadyer.sso.authentication extends StubPersonAttributeDao并复写getPer..._如何获取单点登录自定义得值
文章浏览阅读6.4k次,点赞7次,收藏40次。物理信道和调制方式下行信道:PDSCH,PDCCH,PBCH 上行信道:PRACH,PUSCH,PUCCH下行调制:QPSK,16QAM,64QAM,256QAM 上行调制:QPSK,16QAM,64AQM,256QAM for OFDM with a CP;π/2-BPSK, QPSK, 16QAM, 64QAM and 256QAM for DFT-s-OFDM with a CP..._3gpp物理层流程