包围体的空间一致性(Bounding volume spatial coherence)
1. 要点
- 1.1 包围体的类型
- sphere(Center(x,y,z),radius) 在WGS椭球对应的地心笛卡尔坐标系下
- box(Center(x,y,z), X-axis(x,y,z), Y-axis(x,y,z), Z-axis(x,y,z)) 在WGS椭球对应的地心笛卡尔坐标系下
- region(west, south, east, north, minHeight, maxHeight) 在WGS椭球椭球下对应的经纬度坐标系 单位采用弧度
- 1.2 一个瓦片的包围体肯定会将所有孩子的内容包围住。但是,一个瓦片的包围体不一定会将孩子的包围体包围住,如例子1所示
例子1:
图1 一个地形瓦片的外包围球
图2 该地形瓦片的四个孩子瓦片的包围球。四个孩子瓦片的内容是完全在父节点瓦片的包围体中,但是四个孩子瓦片的包围体是不完全在父节点瓦片的包围体中的
- 1.3 瓦片节点空间一致性测试步骤
- 利用一个对象和瓦片节点的包围体做相交测试,如果不相交,说明该对象和该瓦片的内容以及该瓦片的孩子瓦片的所有内容都不想交;
- 当该对象和该瓦片节点的包围体相交,则判断孩子瓦片的包围体与该对象的相交测试;
- 依次递推到子孙瓦片;
2.参考
1. 3DTiles
规范
2. 3DTiles
reference-card
关于tile的transform属性
1. Tile transforms
例子:假设某个表示city的tileset包含某个表示建筑物的tileset,这个表示建筑物的tileset内部包含一个表示某个部件点云的tileset
有了Tile transforms
属性,就可以实现表示建筑物的tileset可以定义自己的局部坐标系的效果,也可以实现表示某个部件点云的tileset也可以定义自己的局部坐标系的效果。
3d tiles 文件中tile元素包含transform属性
,来定义当前tile坐标系和父tile坐标系的变换矩阵。
transform
属性是一个 4x4的仿射变换矩阵,以列主序存储。transform
属性可以应用到以下内容
- tile.content
- feature’s position
- feature’s normal(
transform
属性的左上角3x3矩阵的转置矩阵的逆矩阵纠正计算法向量异常) - content.boundingVolume(但是content.boundingVolume.region属性不能应用
transform
属性,content.boundingVolume.region是完全定义在 EPSG:4979坐标系下,且经纬度以弧度表示) - tile.boundingVolume(但是tile.boundingVolume.region属性不能应用
transform
属性,tile.boundingVolume.region是完全定义在 EPSG:4979坐标系下,且经纬度以弧度表示) - tile.viewerRequestVolume(但是tile.viewerRequestVolume.region属性不能应用
transform
属性,tile.viewerRequestVolume.region是完全定义在 EPSG:4979坐标系下,且经纬度以弧度表示)
transform
属性不能应用到以下内容:
- geometricError
如果在tileset中未定义transform
属性,默认值就是4x4的单位矩阵。
tileset中从每个tile的局部坐标系到tileset的全局坐标系变换的计算顺序:
- 从顶向下遍历tileset的场景树,后乘孩子的
transform
属性(按照opengl的矩阵运算原则,比如,MVP* v表示v先进行M运算,最后进行P运算),即表示“先进行顶层的transform
变换,再来完成子孙的transform
变换”。 - tileset中的mesh信息以glTF的格式组织,gltf中矩阵变换是前乘模式(按照opengl的矩阵运算原则),即先计算子孙的矩阵变换,再往父节点计算矩阵变换。
- 计算整体的变换矩阵顺序:
先计算glTF对应的矩阵变换结果,再计算tileset中的transform变换结果,对底层渲染内容的变换就是,先变换gltf的,再变换tileset中的transform
。
2.参考
1. 3DTiles
规范