@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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. 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.24",
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",
@@ -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
- console.log('[GaeaApp] 3D Tiles 已加载:', name || tilesetUrl, height ? `高度: ${height}` : '')
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 - 纬度