backup/examples-webpack-old/gltf/gltf.ts (133 lines of code) (raw):
import { MercatorProjection } from '@polaris.gl/projection'
import { PolarisGSIGL2 } from '@polaris.gl/gsi-gl2'
import { AMapLayer } from '@polaris.gl/layer-amap'
import { PolygonLayer } from '@polaris.gl/layer-geojson'
import { GLTF2Layer } from '@polaris.gl/layer-std-gltf2'
declare let window: any
//测试数据
const testData = {
gltfs: {
water: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_water.glb',
green: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_green.glb',
road: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_road.glb',
building_lod1: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_lod1.glb',
building_lod2: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_lod2.glb',
building_lod3: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_lod3.glb',
building_lod4: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/gltf/hangzhou_lod4.glb',
},
}
const center3D = [119.315693, 26.070336, 0] // 模型中心经纬度,取自返回数据
const p = new PolarisGSIGL2({
container: document.querySelector('#container') as HTMLDivElement,
width: 1000,
height: 500,
debug: true,
lights: {
ambientLight: { color: '#ffffff' },
},
cameraControl: true,
})
// p.timeline._config.onError = (e) => throw e
// // 设置投影中心
// p.projection = new MercatorProjection({ center: center3D })
// const pmapCenter = p.projection.project(center3D[0], center3D[1], 0)
// p.cameraProxy.setCenter(pmapCenter)
// 加载GLTF
const gltfLayer = new GLTF2Layer({ rotateX: false })
p.add(gltfLayer)
const gltfObject = testData.gltfs
const keys = Object.keys(gltfObject)
for (let i = 0; i < keys.length; i++) {
const key = keys[i]
const url = gltfObject[key] // 注意url源数据是否为空模型
// 分类设色
let color = '#ffffff'
switch (key) {
case 'water': {
color = '#1E90FF'
break
}
case 'green': {
color = '#008000'
break
}
case 'road': {
color = '#8A2BE2'
break
}
case 'building_lod1': {
color = '#FFA07A'
break
}
case 'building_lod2': {
color = '#FF7F50'
break
}
case 'building_lod3': {
color = '#FF4500'
break
}
case 'building_lod4': {
color = '#FF0000'
break
}
}
gltfLayer.loadGLB(url).then((meshes) => {
// 平移模型
const centerPt = gltfLayer.projection.project(...center3D)
for (const item1 of meshes.children.values()) {
if (item1.children.size > 0) {
for (const item2 of item1.children.values()) {
// 判断是否是空模型
if (item2.geometry !== undefined && item2.material !== undefined) {
const positions = item2.geometry.attributes.position.array as Float32Array
for (let i = 0; i < positions.length / 3; i++) {
positions[i * 3] += centerPt[0]
positions[i * 3 + 1] += centerPt[1]
positions[i * 3 + 2] += centerPt[2]
}
// 改变颜色
item2.material['baseColorFactor'] = color
item2.material['roughnessFactor'] = 0.5
item2.material['metallicFactor'] = 0.1
}
}
} else {
// 判断是否是空模型
if (item1.geometry !== undefined && item1.material !== undefined) {
const positions = item1.geometry.attributes.position.array as Float32Array
for (let i = 0; i < positions.length / 3; i++) {
positions[i * 3] += centerPt[0]
positions[i * 3 + 1] += centerPt[1]
positions[i * 3 + 2] += centerPt[2]
}
// 改变颜色
item1.material['baseColorFactor'] = color
item1.material['roughnessFactor'] = 0.5
item1.material['metallicFactor'] = 0.1
}
}
}
})
}
// 添加amaplayer
const amapLayer = new AMapLayer({})
p.add(amapLayer)
amapLayer.updateProps({
key: 'f8d835e1abdb0e4355b19aa454f4de65', // 高德API使用key,可以缺省
showLogo: true, // 是否显示高德logo
style: 'normal', // 主题有: 标准-normal, 幻影黑-dark,月光银-light,远山黛-whitesmoke,草色青-fresh,雅土灰-grey,涂鸦-graffiti,马卡龙-macaron,靛青蓝-blue,极夜蓝-darkblue,酱籽-wine
layers: [
// 地图显示图层集合: 卫星图层-Satellite,路网图层RoadNet,实施交通图层-Traffic
{ name: 'Satellite', show: false },
{ name: 'RoadNet', show: false },
{ name: 'Traffic', show: false },
],
features: [
// 地图显示要素集合: 区域面-bg,兴趣点-point,道路及道路标注-road,建筑物-building
{ name: 'bg', show: true },
{ name: 'point', show: false },
{ name: 'road', show: true },
{ name: 'building', show: false },
],
})
const polygonLayer = new PolygonLayer({
getFillColor: '#ffff00',
getSideColor: '#999999',
getThickness: 1,
enableExtrude: false,
opacity: 0.2,
transparent: true,
baseAlt: 0,
data: 'https://polaris-geo.oss-cn-hangzhou.aliyuncs.com/simple/amap/China_Fill_Dissolved_25.json',
})
p.add(polygonLayer)
window.p = p
window.layer = gltfLayer
window.p.setStatesCode('1|119.310764|26.073899|0.000000|0.00000|-0.03000|15')