@yangyongtao/gaea 1.1.24 → 1.1.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/GaeaMethods.js +110 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yangyongtao/gaea",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.26",
|
|
4
4
|
"description": "Gaea 3D visualization component library - Vue 3 components based on Godot WASM engine. Includes WMTS layer loading, camera view control, Vite plugin auto-injection, etc.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "src/index.cjs",
|
package/src/GaeaMethods.js
CHANGED
|
@@ -289,6 +289,9 @@ export class GaeaApp {
|
|
|
289
289
|
this.layerCategories = this.config.layerCategories || [];
|
|
290
290
|
this._screenIconList = [];
|
|
291
291
|
this._hiddenCategories = new Set();
|
|
292
|
+
this._tilesetMap = {}; // 已加载的 3D Tiles 引用,key 为 tileset 名称
|
|
293
|
+
this._flattenTool = null; // 压平工具
|
|
294
|
+
this._flattenPolygon = null; // 压平多边形元素
|
|
292
295
|
this._secIsClickArr = [];
|
|
293
296
|
this._secScreenIconKeyValue = {};
|
|
294
297
|
this._groundPolygonElements = [];
|
|
@@ -1180,6 +1183,7 @@ export class GaeaApp {
|
|
|
1180
1183
|
const tilesetUrl = typeof item === 'string' ? item : item.jsonUrl
|
|
1181
1184
|
const name = typeof item === 'string' ? '' : (item.tilName || '')
|
|
1182
1185
|
const height = typeof item === 'string' ? 0 : (item.height || 0)
|
|
1186
|
+
const enableFlatten = typeof item === 'object' ? (item.enableFlatten || false) : false
|
|
1183
1187
|
const tileset = new Gaea.Gaea3DTileset()
|
|
1184
1188
|
tileset.Name = name
|
|
1185
1189
|
tileset.TilesetUrl = tilesetUrl
|
|
@@ -1188,6 +1192,7 @@ export class GaeaApp {
|
|
|
1188
1192
|
tileset.SkipLevelOfDetail = false
|
|
1189
1193
|
tileset.IsZUp = true
|
|
1190
1194
|
tileset.RecalculateNormals = true
|
|
1195
|
+
tileset.EnabledFlatten = enableFlatten
|
|
1191
1196
|
tileset.BaseUrl = tilesetUrl.slice(0, tilesetUrl.lastIndexOf('/') + 1)
|
|
1192
1197
|
tileset.InitTileSet(name, tilesetUrl)
|
|
1193
1198
|
tileset.MaximumMemoryUsage = 512
|
|
@@ -1196,10 +1201,114 @@ export class GaeaApp {
|
|
|
1196
1201
|
tileset.LocalOffset = new Gaea.Vector3(0, height, 0)
|
|
1197
1202
|
}
|
|
1198
1203
|
Gaea.World.Instance.RenderableObjectList.AddLast(tileset)
|
|
1199
|
-
|
|
1204
|
+
if (name) {
|
|
1205
|
+
this._tilesetMap[name] = tileset
|
|
1206
|
+
}
|
|
1207
|
+
console.log('[GaeaApp] 3D Tiles 已加载:', name || tilesetUrl, height ? `高度: ${height}` : '', enableFlatten ? '(压平已启用)' : '')
|
|
1200
1208
|
return tileset
|
|
1201
1209
|
};
|
|
1202
1210
|
|
|
1211
|
+
// ---- 倾斜摄影压平 ----
|
|
1212
|
+
|
|
1213
|
+
/**
|
|
1214
|
+
* 传入多边形坐标直接对倾斜摄影执行压平
|
|
1215
|
+
* @param {Object} opts
|
|
1216
|
+
* @param {string} [opts.tilesetName] - 目标 3D Tiles 名称(不传则默认使用第一个已加载的 tileset)
|
|
1217
|
+
* @param {Array<{lat: number, lng: number}>} opts.polygon - 多边形顶点坐标数组,会自动闭合
|
|
1218
|
+
* @param {number} opts.height - 压平目标高度
|
|
1219
|
+
* @example
|
|
1220
|
+
* app.flatten3DTiles({
|
|
1221
|
+
* tilesetName: '沿浦海塘倾斜',
|
|
1222
|
+
* polygon: [
|
|
1223
|
+
* { lat: 27.2205, lng: 120.456 },
|
|
1224
|
+
* { lat: 27.2210, lng: 120.458 },
|
|
1225
|
+
* { lat: 27.2195, lng: 120.458 },
|
|
1226
|
+
* { lat: 27.2190, lng: 120.456 }
|
|
1227
|
+
* ],
|
|
1228
|
+
* height: 30
|
|
1229
|
+
* })
|
|
1230
|
+
*/
|
|
1231
|
+
flatten3DTiles = ({ tilesetName, polygon, height }) => {
|
|
1232
|
+
if (!polygon || polygon.length < 3) {
|
|
1233
|
+
console.warn('[GaeaApp] flatten3DTiles: polygon 至少需要3个顶点')
|
|
1234
|
+
return
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
// 查找目标 tileset
|
|
1238
|
+
let tileset = null
|
|
1239
|
+
if (tilesetName) {
|
|
1240
|
+
tileset = this._tilesetMap[tilesetName]
|
|
1241
|
+
if (!tileset) {
|
|
1242
|
+
console.warn(`[GaeaApp] flatten3DTiles: 未找到 tileset "${tilesetName}"`)
|
|
1243
|
+
return
|
|
1244
|
+
}
|
|
1245
|
+
} else {
|
|
1246
|
+
const keys = Object.keys(this._tilesetMap)
|
|
1247
|
+
if (keys.length === 0) {
|
|
1248
|
+
console.warn('[GaeaApp] flatten3DTiles: 没有已加载的 3D Tiles')
|
|
1249
|
+
return
|
|
1250
|
+
}
|
|
1251
|
+
tileset = this._tilesetMap[keys[0]]
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1254
|
+
tileset.EnabledFlatten = true
|
|
1255
|
+
|
|
1256
|
+
// 创建/更新压平工具
|
|
1257
|
+
if (!this._flattenTool) {
|
|
1258
|
+
this._flattenTool = new Gaea.FlattenTool()
|
|
1259
|
+
this._flattenTool.NeedIntersectWithMesh = false
|
|
1260
|
+
this._flattenTool.IsMovingIntersectWithMesh = false
|
|
1261
|
+
}
|
|
1262
|
+
this._flattenTool.Gdtvalue = height
|
|
1263
|
+
|
|
1264
|
+
// 构建多边形坐标(经纬度 → Vector3,闭合多边形)
|
|
1265
|
+
const positions = polygon.map(p => new Gaea.Vector3(p.lat, p.lng, height))
|
|
1266
|
+
positions.push(new Gaea.Vector3(polygon[0].lat, polygon[0].lng, height))
|
|
1267
|
+
|
|
1268
|
+
// 创建几何体
|
|
1269
|
+
const geometry = Gaea.Geometry.Create1(Gaea.GeometryType.Polygon, positions)
|
|
1270
|
+
const polygonElement = new Gaea.PolygonGeometryElement()
|
|
1271
|
+
polygonElement.Shape = geometry
|
|
1272
|
+
polygonElement.EnablePick = false
|
|
1273
|
+
polygonElement.EnableEdit = false
|
|
1274
|
+
polygonElement.NeedIntersectWithMesh = true
|
|
1275
|
+
polygonElement.EnableVirtualPoint = true
|
|
1276
|
+
Gaea.SimpleFillSymbol.ConvertBy(polygonElement.Symbol).HasOutLine = true
|
|
1277
|
+
|
|
1278
|
+
// 移除旧的压平多边形
|
|
1279
|
+
if (this._flattenPolygon) {
|
|
1280
|
+
try { Gaea.World.Instance.RenderableObjectList.RemoveChild(this._flattenPolygon) } catch (e) { /* ignore */ }
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
Gaea.World.Instance.RenderableObjectList.AddLast(polygonElement)
|
|
1284
|
+
this._flattenPolygon = polygonElement
|
|
1285
|
+
console.log('[GaeaApp] 压平已执行:', tileset.Name || tileset.TilesetUrl, `高度: ${height}`, `顶点数: ${polygon.length}`)
|
|
1286
|
+
};
|
|
1287
|
+
|
|
1288
|
+
/**
|
|
1289
|
+
* 清除倾斜摄影压平效果
|
|
1290
|
+
* @param {string} [tilesetName] - 目标 tileset 名称(不传则清除压平多边形并重置工具)
|
|
1291
|
+
*/
|
|
1292
|
+
clearFlatten = (tilesetName) => {
|
|
1293
|
+
// 移除压平多边形
|
|
1294
|
+
if (this._flattenPolygon) {
|
|
1295
|
+
try { Gaea.World.Instance.RenderableObjectList.RemoveChild(this._flattenPolygon) } catch (e) { /* ignore */ }
|
|
1296
|
+
this._flattenPolygon = null
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
// 重置压平工具状态
|
|
1300
|
+
this._flattenTool = null
|
|
1301
|
+
Gaea.World.Instance.SetCurrentTool(null)
|
|
1302
|
+
Gaea.World.Instance.CurrentTool = null
|
|
1303
|
+
|
|
1304
|
+
// 可选:禁用特定 tileset 的压平
|
|
1305
|
+
if (tilesetName && this._tilesetMap[tilesetName]) {
|
|
1306
|
+
this._tilesetMap[tilesetName].EnabledFlatten = false
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
console.log('[GaeaApp] 压平效果已清除')
|
|
1310
|
+
};
|
|
1311
|
+
|
|
1203
1312
|
/**
|
|
1204
1313
|
* 根据经纬度飞到指定位置
|
|
1205
1314
|
* @param {number} lat - 纬度
|