@geoblocks/cesium-walk 0.4.0 → 0.5.0

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.
@@ -0,0 +1,206 @@
1
+ import { Cartesian3 } from "@cesium/core";
2
+ import { ObstacleProbe } from "@geoblocks/cesium-obstacles";
3
+ /** @satisfies {Record<string, import("@geoblocks/cesium-input").Binding>} */
4
+ export declare const WALK_BINDINGS: {
5
+ move: {
6
+ type: "vector";
7
+ keys: {
8
+ up: string[];
9
+ down: string[];
10
+ left: string[];
11
+ right: string[];
12
+ };
13
+ stick: "left";
14
+ };
15
+ sprint: {
16
+ type: "button";
17
+ keys: string[];
18
+ buttons: number[];
19
+ };
20
+ jump: {
21
+ type: "button";
22
+ keys: string[];
23
+ buttons: number[];
24
+ };
25
+ };
26
+ export type WalkIntent = {
27
+ move: {
28
+ x: number;
29
+ y: number;
30
+ };
31
+ sprint: boolean;
32
+ jump: boolean;
33
+ };
34
+ /** @typedef {{move: {x: number, y: number}, sprint: boolean, jump: boolean}} WalkIntent */
35
+ declare const CONTROLLER_SETTINGS: readonly ["enableTranslate", "enableZoom", "enableRotate", "enableTilt", "enableCollisionDetection"];
36
+ export default class CesiumWalk {
37
+ /**
38
+ * @type {import('@cesium/engine').CesiumWidget}
39
+ */
40
+ viewer: import('@cesium/engine').CesiumWidget;
41
+ /**
42
+ * @type {number}
43
+ */
44
+ speed: number;
45
+ /**
46
+ * Speed while sprinting, in meters per second.
47
+ * @type {number}
48
+ */
49
+ sprintSpeed: number;
50
+ /**
51
+ * Upward speed at the start of a jump, in meters per second.
52
+ * @type {number}
53
+ */
54
+ jumpSpeed: number;
55
+ /**
56
+ * The gravity of jumps and falls, in meters per second squared.
57
+ * @type {number}
58
+ */
59
+ gravity: number;
60
+ /**
61
+ * How fast the walker reaches its speed, stops and turns, in meters per second squared; at once by
62
+ * default.
63
+ * @type {number}
64
+ */
65
+ acceleration: number;
66
+ /**
67
+ * The deepest drop of the ground the walker steps down, in meters: deeper, off a ledge or a roof, it
68
+ * falls. By default it follows the ground whatever the drop.
69
+ * @type {number}
70
+ */
71
+ stepHeight: number;
72
+ /**
73
+ * @type {number}
74
+ */
75
+ height: number;
76
+ /**
77
+ * @type {boolean}
78
+ */
79
+ active_: boolean;
80
+ /**
81
+ * @type {number}
82
+ */
83
+ lastTick_: number;
84
+ /**
85
+ * Where the walker's intent comes from, read on each tick: {move: {x, y}, sprint, jump}, move no longer
86
+ * than 1, x right and y forward. The keyboard and the first gamepad by default, with WALK_BINDINGS; any
87
+ * object with a read() method otherwise: touch controls, an AI, a replay. The walk turns its active on
88
+ * and off with its own: replace it while the walk is not active.
89
+ * @type {{read(): WalkIntent, active?: boolean}}
90
+ */
91
+ input: {
92
+ read(): WalkIntent;
93
+ active?: boolean;
94
+ };
95
+ velocity_: Cartesian3;
96
+ /** @type {number | undefined} */
97
+ ground_: number | undefined;
98
+ jumpOffset_: number;
99
+ jumpVelocity_: number;
100
+ jumpHeld_: boolean;
101
+ /**
102
+ * Whether the camera bobs at each step and dips on landing, as in GTA 5's first person.
103
+ * @type {boolean}
104
+ */
105
+ headBob: boolean;
106
+ /**
107
+ * Whether the walker stops at the obstacles in view at eye height: opaque 3D tiles or primitives.
108
+ * @type {boolean}
109
+ */
110
+ collision: boolean;
111
+ obstacleProbe_: ObstacleProbe;
112
+ /**
113
+ * The obstacle ahead of the walker in a direction, a point of its plane and its normal toward the walker,
114
+ * if any; asked for each step while collision is on. By default the obstacles in view, read in the depth
115
+ * of the last frame, which waits for the GPU; for a world known on the CPU, a ray cast in every direction.
116
+ * @type {(toward: Cartesian3, key: string) => import('@geoblocks/cesium-obstacles').Obstacle | undefined}
117
+ */
118
+ obstacleAhead: (toward: Cartesian3, key: string) => import('@geoblocks/cesium-obstacles').Obstacle | undefined;
119
+ /**
120
+ * The walker's body: how far from the walls it keeps, in meters, pushed out of any it walks past, sideways
121
+ * or at a corner, where no ray ahead meets it; 0 by default, a walker without a body.
122
+ * @type {number}
123
+ */
124
+ radius: number;
125
+ /**
126
+ * The surface nearest the walker's body, within its radius: a point of it, the surface's normal toward the
127
+ * body, and the point of the body it is nearest, if any; asked after each step while collision is on. None by
128
+ * default, as the obstacles in view tell nothing about what is beside the walker; walkOn gives the mesh's.
129
+ * @type {() => {point: Cartesian3, normal: Cartesian3, origin: Cartesian3} | undefined}
130
+ */
131
+ surfaceNear: () => {
132
+ point: Cartesian3;
133
+ normal: Cartesian3;
134
+ origin: Cartesian3;
135
+ } | undefined;
136
+ /**
137
+ * The height of the ground under a position, in meters above the ellipsoid, or undefined when unknown
138
+ * yet. The terrain by default, none without a globe; a model's floors otherwise, for a walker on several levels.
139
+ * @type {(position: import('@cesium/core').Cartographic) => number | undefined}
140
+ */
141
+ groundHeight: (position: import('@cesium/core').Cartographic) => number | undefined;
142
+ sprinting_: boolean;
143
+ /** @type {Partial<Record<typeof CONTROLLER_SETTINGS[number], boolean>>} */
144
+ controllerSettings_: Partial<Record<typeof CONTROLLER_SETTINGS[number], boolean>>;
145
+ bob_: number;
146
+ stepPhase_: number;
147
+ landing_: number;
148
+ handleTickFunction_: () => void;
149
+ /**
150
+ * @param {import('@cesium/engine').CesiumWidget} viewer
151
+ * @param {number} [speed=1.6] Walk speed in meters per second.
152
+ * @param {number} [height=2.0] Height of the camera above the terrain.
153
+ */
154
+ constructor(viewer: import('@cesium/engine').CesiumWidget, speed?: number, height?: number);
155
+ get active(): boolean;
156
+ /**
157
+ * Whether the walker is sprinting.
158
+ * @return {boolean}
159
+ */
160
+ get sprinting(): boolean;
161
+ set active(active: boolean);
162
+ handleTick_(): void;
163
+ /**
164
+ * Moves the camera a step, stopping at obstacles or sliding along them; a slide is checked against the obstacles
165
+ * ahead of it in turn, so that at a concave corner it stops at the second wall rather than going through it.
166
+ * @param {Cartesian3} direction The unit direction of the step, level.
167
+ * @param {number} step The length of the step, negative backward, in meters.
168
+ * @param {string} kind Which steps these are, for the obstacle looked for last time.
169
+ */
170
+ step_(direction: Cartesian3, step: number, kind: string): void;
171
+ /**
172
+ * Pushes the camera level out of the walls the walker's body is in, each in turn.
173
+ */
174
+ keepClear_(): void;
175
+ clampCameraToTerrain_(): void;
176
+ /**
177
+ * @return {import('@cesium/core').Cartesian3} The ellipsoid surface normal at the camera position.
178
+ */
179
+ surfaceNormal_(): import('@cesium/core').Cartesian3;
180
+ }
181
+ /**
182
+ * The heights above the floor the walls are looked for at: the knees, the waist and the eyes.
183
+ * @param {number} eye
184
+ * @param {number} step
185
+ * @return {number[]} In meters, from the lowest.
186
+ */
187
+ export declare function rayHeights(eye: number, step: number): number[];
188
+ /**
189
+ * Walks a CesiumWalk on a triangle mesh of cesium-obstacles: it stands on the highest floor below its knees, up
190
+ * the stairs, under the arches, else on what it stood on before (the terrain); the walls ahead stop it, from rays
191
+ * cast at the knees, the waist and the eyes, the floors and stairs left to the ground below, in every direction;
192
+ * with a radius, its body at those heights is kept that far from the walls beside it too, a step's riser under
193
+ * the knees excepted.
194
+ * @param {CesiumWalk} walk
195
+ * @param {import("@geoblocks/cesium-obstacles").TriangleMesh} mesh
196
+ * @param {{eye: number, step: number, reach: number, radius?: number}} options In meters: the eyes above the
197
+ * floor, the highest step, how far ahead the walls are looked for, the body's radius (none by default).
198
+ */
199
+ export declare function walkOn(walk: CesiumWalk, mesh: import("@geoblocks/cesium-obstacles").TriangleMesh, { eye, step, reach, radius }: {
200
+ eye: number;
201
+ step: number;
202
+ reach: number;
203
+ radius?: number;
204
+ }): void;
205
+ export {};
206
+ //# sourceMappingURL=cesium-walk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cesium-walk.d.ts","sourceRoot":"","sources":["../src/cesium-walk.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,456 @@
1
+ import { Cartesian3, Ellipsoid, FixedFrameTransforms, Math as CesiumMath, Matrix4 } from "@cesium/core";
2
+ import Controls from "@geoblocks/cesium-input";
3
+ import { ObstacleProbe, blockedStep, meshGroundHeight, meshObstacleAhead } from "@geoblocks/cesium-obstacles";
4
+ // in seconds: a frame after a backgrounded tab must not walk or fall far
5
+ const MAX_DELTA = 0.1;
6
+ // the head bob: a dip of DIP meters at each step of STEP_LENGTH meters, twice as deep when sprinting,
7
+ // and of LANDING meters when landing from a jump; both settle in about BOB_TIME seconds
8
+ const STEP_LENGTH = 0.8;
9
+ const DIP = 0.03;
10
+ const LANDING = 0.15;
11
+ const BOB_TIME = 0.15;
12
+ // in meters: nearer its height, the camera stays, so that a walker standing still renders no frame
13
+ const SETTLED = 1e-3;
14
+ // at a concave corner the slide along one wall heads into the other: a step is checked again along its slide, this
15
+ // many times at most, before it is taken
16
+ const SLIDE_PASSES = 3;
17
+ // in a corner, pushed out of one wall, the body may be in the other: it is pushed again, this many times at most
18
+ const CLEAR_PASSES = 3;
19
+ // the default bindings: W, A, S, D or the arrows to walk, Shift to sprint and Space to jump; on a gamepad, the
20
+ // left stick, at any speed and in any direction, Cross to sprint and Square to jump, as in GTA 5. Keys by
21
+ // event.code, so that other keyboard layouts walk with the keys in the same place
22
+ /** @satisfies {Record<string, import("@geoblocks/cesium-input").Binding>} */
23
+ export const WALK_BINDINGS = {
24
+ move: { type: "vector", keys: { up: ["KeyW", "ArrowUp"], down: ["KeyS", "ArrowDown"], left: ["KeyA", "ArrowLeft"], right: ["KeyD", "ArrowRight"] }, stick: "left" },
25
+ sprint: { type: "button", keys: ["ShiftLeft", "ShiftRight"], buttons: [0] },
26
+ jump: { type: "button", keys: ["Space"], buttons: [2] },
27
+ };
28
+ /** @typedef {{move: {x: number, y: number}, sprint: boolean, jump: boolean}} WalkIntent */
29
+ // the camera controller's settings off while walking: its navigation, and its collision detection, which lifts
30
+ // the camera onto the 3D tiles under it, a roof or a coarse tile still loading over the street, whenever the
31
+ // camera moves; the walk keeps its own height
32
+ const CONTROLLER_SETTINGS = /** @type {const} */ (["enableTranslate", "enableZoom", "enableRotate", "enableTilt", "enableCollisionDetection"]);
33
+ const normalScratch = new Cartesian3();
34
+ const forwardScratch = new Cartesian3();
35
+ const stepScratch = new Cartesian3();
36
+ const allowedScratch = new Cartesian3();
37
+ const awayScratch = new Cartesian3();
38
+ const frameScratch = new Matrix4();
39
+ const bodyScratch = new Cartesian3();
40
+ const upScratch = new Cartesian3();
41
+ const targetScratch = new Cartesian3();
42
+ const changeScratch = new Cartesian3();
43
+ /**
44
+ * One step of a jump or a fall under gravity.
45
+ * @param {number} offset Height above the walk height, in meters.
46
+ * @param {number} velocity Upward speed, in meters per second.
47
+ * @param {number} dt Seconds.
48
+ * @param {number} gravity In meters per second squared.
49
+ * @return {[number, number]} The next offset and velocity, [0, 0] once landed.
50
+ */
51
+ function jumpStep(offset, velocity, dt, gravity) {
52
+ const next = velocity - gravity * dt;
53
+ const height = offset + ((velocity + next) / 2) * dt;
54
+ return height <= 0 && next <= 0 ? [0, 0] : [height, next];
55
+ }
56
+ /**
57
+ * Whether a jump starts: on a new press only, so that holding the button does not jump again on landing.
58
+ * @param {boolean} pressed
59
+ * @param {boolean} wasPressed
60
+ * @param {boolean} grounded
61
+ * @return {boolean}
62
+ */
63
+ function jumpStart(pressed, wasPressed, grounded) {
64
+ return pressed && !wasPressed && grounded;
65
+ }
66
+ export default class CesiumWalk {
67
+ /**
68
+ * @param {import('@cesium/engine').CesiumWidget} viewer
69
+ * @param {number} [speed=1.6] Walk speed in meters per second.
70
+ * @param {number} [height=2.0] Height of the camera above the terrain.
71
+ */
72
+ constructor(viewer, speed = 1.6, height = 2.0) {
73
+ /**
74
+ * @type {import('@cesium/engine').CesiumWidget}
75
+ */
76
+ this.viewer = viewer;
77
+ /**
78
+ * @type {number}
79
+ */
80
+ this.speed = speed;
81
+ /**
82
+ * Speed while sprinting, in meters per second.
83
+ * @type {number}
84
+ */
85
+ this.sprintSpeed = 3 * speed;
86
+ /**
87
+ * Upward speed at the start of a jump, in meters per second.
88
+ * @type {number}
89
+ */
90
+ this.jumpSpeed = 4;
91
+ /**
92
+ * The gravity of jumps and falls, in meters per second squared.
93
+ * @type {number}
94
+ */
95
+ this.gravity = 9.81;
96
+ /**
97
+ * How fast the walker reaches its speed, stops and turns, in meters per second squared; at once by
98
+ * default.
99
+ * @type {number}
100
+ */
101
+ this.acceleration = Infinity;
102
+ /**
103
+ * The deepest drop of the ground the walker steps down, in meters: deeper, off a ledge or a roof, it
104
+ * falls. By default it follows the ground whatever the drop.
105
+ * @type {number}
106
+ */
107
+ this.stepHeight = Infinity;
108
+ /**
109
+ * @type {number}
110
+ */
111
+ this.height = height;
112
+ /**
113
+ * @type {boolean}
114
+ */
115
+ this.active_ = false;
116
+ /**
117
+ * @type {number}
118
+ */
119
+ this.lastTick_ = 0;
120
+ /**
121
+ * Where the walker's intent comes from, read on each tick: {move: {x, y}, sprint, jump}, move no longer
122
+ * than 1, x right and y forward. The keyboard and the first gamepad by default, with WALK_BINDINGS; any
123
+ * object with a read() method otherwise: touch controls, an AI, a replay. The walk turns its active on
124
+ * and off with its own: replace it while the walk is not active.
125
+ * @type {{read(): WalkIntent, active?: boolean}}
126
+ */
127
+ this.input = new Controls(WALK_BINDINGS);
128
+ // the walker's velocity, level, on the globe
129
+ this.velocity_ = new Cartesian3();
130
+ // the ground under the walker on the last tick, which it keeps its height above while in the air
131
+ /** @type {number | undefined} */
132
+ this.ground_ = undefined;
133
+ // the jump or the fall: height above the walk height and upward speed; whether the jump input was down
134
+ // last tick
135
+ this.jumpOffset_ = 0;
136
+ this.jumpVelocity_ = 0;
137
+ this.jumpHeld_ = false;
138
+ /**
139
+ * Whether the camera bobs at each step and dips on landing, as in GTA 5's first person.
140
+ * @type {boolean}
141
+ */
142
+ this.headBob = false;
143
+ /**
144
+ * Whether the walker stops at the obstacles in view at eye height: opaque 3D tiles or primitives.
145
+ * @type {boolean}
146
+ */
147
+ this.collision = false;
148
+ this.obstacleProbe_ = new ObstacleProbe(viewer.scene);
149
+ /**
150
+ * The obstacle ahead of the walker in a direction, a point of its plane and its normal toward the walker,
151
+ * if any; asked for each step while collision is on. By default the obstacles in view, read in the depth
152
+ * of the last frame, which waits for the GPU; for a world known on the CPU, a ray cast in every direction.
153
+ * @type {(toward: Cartesian3, key: string) => import('@geoblocks/cesium-obstacles').Obstacle | undefined}
154
+ */
155
+ this.obstacleAhead = (toward, key) => this.obstacleProbe_.ahead(toward, key);
156
+ /**
157
+ * The walker's body: how far from the walls it keeps, in meters, pushed out of any it walks past, sideways
158
+ * or at a corner, where no ray ahead meets it; 0 by default, a walker without a body.
159
+ * @type {number}
160
+ */
161
+ this.radius = 0;
162
+ /**
163
+ * The surface nearest the walker's body, within its radius: a point of it, the surface's normal toward the
164
+ * body, and the point of the body it is nearest, if any; asked after each step while collision is on. None by
165
+ * default, as the obstacles in view tell nothing about what is beside the walker; walkOn gives the mesh's.
166
+ * @type {() => {point: Cartesian3, normal: Cartesian3, origin: Cartesian3} | undefined}
167
+ */
168
+ this.surfaceNear = () => undefined;
169
+ /**
170
+ * The height of the ground under a position, in meters above the ellipsoid, or undefined when unknown
171
+ * yet. The terrain by default, none without a globe; a model's floors otherwise, for a walker on several levels.
172
+ * @type {(position: import('@cesium/core').Cartographic) => number | undefined}
173
+ */
174
+ this.groundHeight = position => viewer.scene.globe?.getHeight(position);
175
+ // whether the walker sprinted on the last tick
176
+ this.sprinting_ = false;
177
+ // the camera controller's settings before walking
178
+ /** @type {Partial<Record<typeof CONTROLLER_SETTINGS[number], boolean>>} */
179
+ this.controllerSettings_ = {};
180
+ // the head bob: how deep, 0 standing to 2 sprinting, along the steps; the landing dip, 0 to 1
181
+ this.bob_ = 0;
182
+ this.stepPhase_ = 0;
183
+ this.landing_ = 0;
184
+ this.handleTickFunction_ = this.handleTick_.bind(this);
185
+ }
186
+ get active() {
187
+ return this.active_;
188
+ }
189
+ /**
190
+ * Whether the walker is sprinting.
191
+ * @return {boolean}
192
+ */
193
+ get sprinting() {
194
+ return this.active_ && this.sprinting_;
195
+ }
196
+ set active(active) {
197
+ if (active === this.active_) {
198
+ return;
199
+ }
200
+ this.active_ = active;
201
+ const controller = this.viewer.scene.screenSpaceCameraController;
202
+ if (this.active_) {
203
+ for (const setting of CONTROLLER_SETTINGS) {
204
+ this.controllerSettings_[setting] = controller[setting];
205
+ controller[setting] = false;
206
+ }
207
+ this.lastTick_ = performance.now();
208
+ this.input.active = true;
209
+ this.viewer.clock.onTick.addEventListener(this.handleTickFunction_);
210
+ this.clampCameraToTerrain_();
211
+ }
212
+ else {
213
+ this.input.active = false;
214
+ this.viewer.clock.onTick.removeEventListener(this.handleTickFunction_);
215
+ this.jumpOffset_ = 0;
216
+ this.jumpVelocity_ = 0;
217
+ this.ground_ = undefined;
218
+ Cartesian3.clone(Cartesian3.ZERO, this.velocity_);
219
+ this.bob_ = 0;
220
+ this.landing_ = 0;
221
+ Object.assign(controller, this.controllerSettings_);
222
+ }
223
+ }
224
+ handleTick_() {
225
+ const timestamp = performance.now();
226
+ const deltaTime = Math.min((timestamp - this.lastTick_) / 1000, MAX_DELTA);
227
+ this.lastTick_ = timestamp;
228
+ const { move, sprint, jump } = this.input.read();
229
+ let forward = move.y;
230
+ let right = move.x;
231
+ // walking diagonally is not faster
232
+ const magnitude = Math.hypot(forward, right);
233
+ if (magnitude > 1) {
234
+ forward /= magnitude;
235
+ right /= magnitude;
236
+ }
237
+ const grounded = this.jumpOffset_ === 0 && this.jumpVelocity_ === 0;
238
+ if (jumpStart(jump, this.jumpHeld_, grounded)) {
239
+ this.jumpVelocity_ = this.jumpSpeed;
240
+ }
241
+ this.jumpHeld_ = jump;
242
+ const airborne = this.jumpOffset_ > 0 || this.jumpVelocity_ > 0;
243
+ const moving = forward !== 0 || right !== 0;
244
+ // forward, no more sideways than diagonally, as in GTA 5
245
+ this.sprinting_ = sprint && forward > 0 && forward >= Math.abs(right);
246
+ const stopped = Cartesian3.equals(this.velocity_, Cartesian3.ZERO);
247
+ if (!moving && stopped && !airborne && this.bob_ === 0 && this.landing_ === 0) {
248
+ // standing: only the terrain refining under the walker moves it
249
+ this.clampCameraToTerrain_();
250
+ return;
251
+ }
252
+ const camera = this.viewer.camera;
253
+ const speed = this.sprinting_ ? this.sprintSpeed : this.speed;
254
+ // walk along the view direction projected onto the ground plane,
255
+ // so that looking down does not push the camera into the terrain
256
+ const normal = this.surfaceNormal_();
257
+ const along = Cartesian3.subtract(camera.direction, Cartesian3.projectVector(camera.direction, normal, forwardScratch), forwardScratch);
258
+ const level = Cartesian3.magnitude(along) > CesiumMath.EPSILON6;
259
+ if (level) {
260
+ Cartesian3.normalize(along, along);
261
+ }
262
+ // the velocity, toward the intended one as fast as the acceleration allows
263
+ const target = Cartesian3.multiplyByScalar(camera.right, right * speed, targetScratch);
264
+ if (level) {
265
+ Cartesian3.add(target, Cartesian3.multiplyByScalar(along, forward * speed, changeScratch), target);
266
+ }
267
+ const change = Cartesian3.subtract(target, this.velocity_, changeScratch);
268
+ const needed = Cartesian3.magnitude(change);
269
+ const allowed = this.acceleration * deltaTime;
270
+ if (needed <= allowed) {
271
+ Cartesian3.clone(target, this.velocity_);
272
+ }
273
+ else {
274
+ Cartesian3.add(this.velocity_, Cartesian3.multiplyByScalar(change, allowed / needed, change), this.velocity_);
275
+ }
276
+ const forwardSpeed = level ? Cartesian3.dot(this.velocity_, along) : 0;
277
+ const rightSpeed = Cartesian3.dot(this.velocity_, camera.right);
278
+ if (forwardSpeed !== 0) {
279
+ this.step_(along, forwardSpeed * deltaTime, "forward");
280
+ }
281
+ if (rightSpeed !== 0) {
282
+ this.step_(camera.right, rightSpeed * deltaTime, "right");
283
+ }
284
+ if (airborne) {
285
+ [this.jumpOffset_, this.jumpVelocity_] = jumpStep(this.jumpOffset_, this.jumpVelocity_, deltaTime, this.gravity);
286
+ if (this.headBob && this.jumpOffset_ === 0) {
287
+ this.landing_ = 1;
288
+ }
289
+ }
290
+ // the head bob, which settles once turned off
291
+ const ease = 1 - Math.exp(-deltaTime / BOB_TIME);
292
+ const bob = this.headBob && moving && !airborne ? (this.sprinting_ ? 2 : 1) : 0;
293
+ this.bob_ += (bob - this.bob_) * ease;
294
+ this.landing_ -= this.landing_ * ease;
295
+ // the last thousandth in one step, so that the camera stops moving
296
+ if (bob === 0 && this.bob_ < 1e-3) {
297
+ this.bob_ = 0;
298
+ }
299
+ if (this.landing_ < 1e-3) {
300
+ this.landing_ = 0;
301
+ }
302
+ this.stepPhase_ += (Cartesian3.magnitude(this.velocity_) * deltaTime / STEP_LENGTH) * CesiumMath.PI;
303
+ this.clampCameraToTerrain_();
304
+ }
305
+ /**
306
+ * Moves the camera a step, stopping at obstacles or sliding along them; a slide is checked against the obstacles
307
+ * ahead of it in turn, so that at a concave corner it stops at the second wall rather than going through it.
308
+ * @param {Cartesian3} direction The unit direction of the step, level.
309
+ * @param {number} step The length of the step, negative backward, in meters.
310
+ * @param {string} kind Which steps these are, for the obstacle looked for last time.
311
+ */
312
+ step_(direction, step, kind) {
313
+ const camera = this.viewer.camera;
314
+ let toward = Cartesian3.multiplyByScalar(direction, Math.sign(step), stepScratch);
315
+ let length = Math.abs(step);
316
+ for (let pass = 0; pass < SLIDE_PASSES && length > 0; pass++) {
317
+ // a slide's look is its own, not the step's: the probe keeps its last look in each direction by its key
318
+ const obstacle = this.collision ? this.obstacleAhead(toward, `${kind}${Math.sign(step)}${pass ? "slide" : ""}`) : undefined;
319
+ const allowed = blockedStep(toward, length, camera.positionWC, obstacle, allowedScratch);
320
+ const same = Cartesian3.equalsEpsilon(allowed.direction, toward, CesiumMath.EPSILON9);
321
+ length = allowed.length;
322
+ toward = Cartesian3.clone(allowed.direction, stepScratch);
323
+ if (same) {
324
+ break;
325
+ }
326
+ }
327
+ if (length > 0) {
328
+ camera.move(toward, length);
329
+ }
330
+ if (this.collision) {
331
+ this.keepClear_();
332
+ }
333
+ }
334
+ /**
335
+ * Pushes the camera level out of the walls the walker's body is in, each in turn.
336
+ */
337
+ keepClear_() {
338
+ const camera = this.viewer.camera;
339
+ for (let pass = 0; pass < CLEAR_PASSES; pass++) {
340
+ const surface = this.surfaceNear();
341
+ if (!surface) {
342
+ return;
343
+ }
344
+ const up = this.surfaceNormal_();
345
+ // level, from the surface to the body; a surface straight above or below it is left to the walker's ground
346
+ const away = Cartesian3.subtract(surface.origin, surface.point, awayScratch);
347
+ Cartesian3.subtract(away, Cartesian3.projectVector(away, up, stepScratch), away);
348
+ const distance = Cartesian3.magnitude(away);
349
+ if (distance >= this.radius) {
350
+ return;
351
+ }
352
+ if (distance > CesiumMath.EPSILON6) {
353
+ Cartesian3.divideByScalar(away, distance, away);
354
+ }
355
+ else {
356
+ Cartesian3.subtract(surface.normal, Cartesian3.projectVector(surface.normal, up, stepScratch), away);
357
+ if (Cartesian3.magnitude(away) < CesiumMath.EPSILON6) {
358
+ return;
359
+ }
360
+ Cartesian3.normalize(away, away);
361
+ }
362
+ camera.move(away, this.radius - distance);
363
+ }
364
+ }
365
+ clampCameraToTerrain_() {
366
+ const camera = this.viewer.camera;
367
+ const terrainHeight = this.groundHeight(camera.positionCartographic);
368
+ if (terrainHeight === undefined) {
369
+ // ground not loaded yet at this position
370
+ return;
371
+ }
372
+ if (this.ground_ !== undefined) {
373
+ // in the air, or off a drop deeper than a step, the walker keeps its height and falls the rest
374
+ const drop = this.ground_ - terrainHeight;
375
+ if (this.jumpOffset_ > 0 || this.jumpVelocity_ !== 0 || drop > this.stepHeight) {
376
+ this.jumpOffset_ += drop;
377
+ if (this.jumpOffset_ <= 0) {
378
+ // on the ground again: landed, or lifted by the ground while still going up
379
+ this.jumpOffset_ = 0;
380
+ if (this.jumpVelocity_ <= 0) {
381
+ this.jumpVelocity_ = 0;
382
+ if (this.headBob) {
383
+ this.landing_ = 1;
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ this.ground_ = terrainHeight;
390
+ const cameraHeight = camera.positionCartographic.height;
391
+ // move along the surface normal, not the camera up vector, which is
392
+ // tilted when the camera is pitched
393
+ const bob = DIP * this.bob_ * Math.abs(Math.sin(this.stepPhase_)) + LANDING * this.landing_;
394
+ const offset = terrainHeight + this.height + this.jumpOffset_ - bob - cameraHeight;
395
+ if (Math.abs(offset) > SETTLED) {
396
+ camera.move(this.surfaceNormal_(), offset);
397
+ }
398
+ }
399
+ /**
400
+ * @return {import('@cesium/core').Cartesian3} The ellipsoid surface normal at the camera position.
401
+ */
402
+ surfaceNormal_() {
403
+ const scene = this.viewer.scene;
404
+ return scene.ellipsoid.geodeticSurfaceNormal(scene.camera.position, normalScratch);
405
+ }
406
+ }
407
+ /**
408
+ * The heights above the floor the walls are looked for at: the knees, the waist and the eyes.
409
+ * @param {number} eye
410
+ * @param {number} step
411
+ * @return {number[]} In meters, from the lowest.
412
+ */
413
+ export function rayHeights(eye, step) {
414
+ return [step + 0.05, (step + eye) / 2, eye];
415
+ }
416
+ /**
417
+ * Walks a CesiumWalk on a triangle mesh of cesium-obstacles: it stands on the highest floor below its knees, up
418
+ * the stairs, under the arches, else on what it stood on before (the terrain); the walls ahead stop it, from rays
419
+ * cast at the knees, the waist and the eyes, the floors and stairs left to the ground below, in every direction;
420
+ * with a radius, its body at those heights is kept that far from the walls beside it too, a step's riser under
421
+ * the knees excepted.
422
+ * @param {CesiumWalk} walk
423
+ * @param {import("@geoblocks/cesium-obstacles").TriangleMesh} mesh
424
+ * @param {{eye: number, step: number, reach: number, radius?: number}} options In meters: the eyes above the
425
+ * floor, the highest step, how far ahead the walls are looked for, the body's radius (none by default).
426
+ */
427
+ export function walkOn(walk, mesh, { eye, step, reach, radius = 0 }) {
428
+ const camera = walk.viewer.scene.camera;
429
+ const fallback = walk.groundHeight;
430
+ const offsets = rayHeights(eye, step).map(height => new Cartesian3(0, 0, height - eye));
431
+ walk.obstacleAhead = meshObstacleAhead(mesh, () => camera.positionWC, { offsets, reach });
432
+ walk.radius = radius;
433
+ if (radius > 0) {
434
+ walk.surfaceNear = () => {
435
+ const position = camera.positionWC;
436
+ const frame = FixedFrameTransforms.eastNorthUpToFixedFrame(position, Ellipsoid.WGS84, frameScratch);
437
+ const up = Ellipsoid.WGS84.geodeticSurfaceNormal(position, upScratch);
438
+ let nearest;
439
+ for (const [k, offset] of offsets.entries()) {
440
+ const origin = Matrix4.multiplyByPoint(frame, offset, bodyScratch);
441
+ const hit = mesh.nearest(origin, radius, { walls: true });
442
+ // under the knees, a step's riser: climbed, not kept from
443
+ if (!hit || (k === 0 && Cartesian3.dot(Cartesian3.subtract(hit.position, origin, awayScratch), up) < 0)) {
444
+ continue;
445
+ }
446
+ if (!nearest || hit.distance < nearest.distance) {
447
+ nearest = { point: hit.position, normal: hit.normal, origin: Cartesian3.clone(origin), distance: hit.distance };
448
+ }
449
+ }
450
+ return nearest;
451
+ };
452
+ }
453
+ const ground = meshGroundHeight(mesh, { below: eye - step });
454
+ walk.groundHeight = cartographic => ground(cartographic) ?? fallback(cartographic);
455
+ }
456
+ //# sourceMappingURL=cesium-walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cesium-walk.js","sourceRoot":"","sources":["../src/cesium-walk.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geoblocks/cesium-walk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "license": "BSD-3-Clause",
5
5
  "type": "module",
6
6
  "repository": {
@@ -8,25 +8,36 @@
8
8
  "url": "https://github.com/geoblocks/cesium-helpers/",
9
9
  "directory": "packages/cesium-walk"
10
10
  },
11
- "main": "cesium-walk.js",
12
- "module": "cesium-walk.js",
13
- "sideEffects": false,
11
+ "main": "dist/cesium-walk.js",
12
+ "module": "dist/cesium-walk.js",
13
+ "types": "dist/cesium-walk.d.ts",
14
14
  "exports": {
15
- ".": "./cesium-walk.js"
15
+ ".": {
16
+ "source": "./src/cesium-walk.js",
17
+ "types": "./dist/cesium-walk.d.ts",
18
+ "default": "./dist/cesium-walk.js"
19
+ }
16
20
  },
21
+ "sideEffects": false,
17
22
  "files": [
18
- "cesium-walk.js"
23
+ "dist",
24
+ "src",
25
+ "!src/**/*.test.js"
19
26
  ],
27
+ "scripts": {
28
+ "build": "tsc -p .",
29
+ "prepack": "npm run build"
30
+ },
20
31
  "publishConfig": {
21
32
  "access": "public"
22
33
  },
23
34
  "dependencies": {
24
- "@geoblocks/cesium-input": "^0.2.0",
25
- "@geoblocks/cesium-obstacles": "^0.4.0"
35
+ "@geoblocks/cesium-input": "^0.3.0",
36
+ "@geoblocks/cesium-obstacles": "^0.6.0"
26
37
  },
27
38
  "peerDependencies": {
28
39
  "@cesium/core": ">=0.1.0",
29
40
  "@cesium/engine": ">=10"
30
41
  },
31
- "gitHead": "df5df0b067cb2c8646428eec912f7157ad8cbd28"
42
+ "gitHead": "a6d8fdfe6b9ad266fd8a4593c38efd24e9a5546b"
32
43
  }
File without changes