Skip to content

Commit 6e6e089

Browse files
committed
fix(composables): useWaterPlane now have correct height
1 parent b8eb9ed commit 6e6e089

File tree

2 files changed

+34
-30
lines changed

2 files changed

+34
-30
lines changed

src/core/composables/useWaterPlane/demo.vue

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
<script setup lang="ts">
22
import * as Cesium from 'cesium'
33
import { reactive, watchEffect } from 'vue'
4-
import { defineColor, toCartesian3, useViewer } from '~/index'
4+
import { defineColor, toCartesian3, toCoordinates, useViewer } from '~/index'
55
import { useWaterPlane } from '.'
66
import glb from './golden_eagle.glb?url'
77
import WaterImage from './waterNormals.jpg'
88
99
const viewer = useViewer()
1010
11-
viewer.flyTo(viewer.entities.add({
12-
position: toCartesian3(119.95, 31.8, 100),
11+
const entityList = Array.from({ length: 5 }, (_, k) => 100 + 20 * (k + 1) - 60).map(v => viewer.entities.add({
12+
position: toCartesian3(119.95 + v / 20000, 31.8, v),
1313
model: {
1414
uri: glb,
1515
scale: 100,
1616
},
1717
}))
18+
viewer.flyTo(entityList[2])
1819
1920
const positions = [
2021
[
@@ -44,7 +45,7 @@ const waterPlane = useWaterPlane()
4445
const primitive = waterPlane({
4546
normalMapUrl: WaterImage,
4647
positions: positions.map(item => Cesium.Cartographic.fromDegrees(item[0], item[1])),
47-
height: 10,
48+
height: -1000,
4849
})
4950
5051
const form = reactive({
@@ -67,6 +68,23 @@ watchEffect(() => {
6768
function toggleShow() {
6869
primitive.show = !primitive.show
6970
}
71+
72+
const middleEntityPosition = toCoordinates(entityList[2].position!.getValue(viewer.clock.currentTime)!)
73+
viewer.entities.add({
74+
position: new Cesium.CallbackPositionProperty(
75+
() => toCartesian3(
76+
middleEntityPosition.longitude,
77+
middleEntityPosition.latitude,
78+
form.height,
79+
),
80+
false,
81+
),
82+
point: {
83+
pixelSize: 4,
84+
color: defineColor('#f00'),
85+
disableDepthTestDistance: Infinity,
86+
},
87+
})
7088
</script>
7189

7290
<template>

src/core/composables/useWaterPlane/index.ts

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -118,32 +118,18 @@ class WaterPrimitive {
118118
const positions = options.positions
119119
this._show = true
120120

121-
this._positions = []
122-
123-
const [
124-
cosLatitudeSum,
125-
cosLatitudeSinLongitudeSum,
126-
sinLatitudeSum,
127-
] = positions
128-
.reduce((acc, position) => {
129-
const { latitude, longitude } = position
130-
131-
this._positions.push(Cesium.Cartesian3.fromRadians(position.longitude, position.latitude, this._height))
132-
133-
return [
134-
acc[0] + Math.cos(latitude) * Math.cos(longitude),
135-
acc[1] + Math.cos(latitude) * Math.sin(longitude),
136-
acc[2] + Math.sin(latitude),
137-
]
138-
}, [0, 0, 0])
139-
.map(item => item /= positions.length)
140-
141-
const averageLongitude = Math.atan2(cosLatitudeSinLongitudeSum, cosLatitudeSum)
142-
const distanceToSurface = Math.sqrt(cosLatitudeSum * cosLatitudeSum + cosLatitudeSinLongitudeSum * cosLatitudeSinLongitudeSum)
143-
const averageLatitude = Math.atan2(sinLatitudeSum, distanceToSurface)
144-
145-
this._reflectorWorldPosition = Cesium.Cartesian3.fromRadians(averageLongitude, averageLatitude, this._height)
146-
this._originalReflectorWorldPosition = this._reflectorWorldPosition.clone()
121+
this._positions = positions.map(position =>
122+
Cesium.Cartesian3.fromRadians(position.longitude, position.latitude, this._height),
123+
)
124+
125+
const sumCartesian = this._positions.reduce((sum, cartesian) => {
126+
return Cesium.Cartesian3.add(sum, cartesian, new Cesium.Cartesian3())
127+
}, new Cesium.Cartesian3())
128+
129+
const averageCartesian = Cesium.Cartesian3.divideByScalar(sumCartesian, positions.length, new Cesium.Cartesian3())
130+
this._reflectorWorldPosition = averageCartesian.clone()
131+
this._originalReflectorWorldPosition = averageCartesian.clone()
132+
147133
this._normal = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormal(this._reflectorWorldPosition)
148134
this._waterPlane = Cesium.Plane.fromPointNormal(this._reflectorWorldPosition, this._normal)
149135

0 commit comments

Comments
 (0)