@soonspacejs/plugin-first-person-controls 2.11.13 → 2.11.15

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/README.md CHANGED
@@ -1,5 +1,5 @@
1
- # @soonspacejs/plugin-transform-controls
2
-
3
- > Transform-controls plugin for SoonSpace.js
4
-
5
- Document: [http://www.xwbuilders.com:8800/plugin/first-person-controls.html](http://www.xwbuilders.com:8800/plugin/first-person-controls.html)
1
+ # @soonspacejs/plugin-transform-controls
2
+
3
+ > Transform-controls plugin for SoonSpace.js
4
+
5
+ Document: [http://www.xwbuilders.com:8800/plugin/first-person-controls.html](http://www.xwbuilders.com:8800/plugin/first-person-controls.html)
@@ -0,0 +1,213 @@
1
+ import { Vector3, Vector2, Intersection, Sphere, Object3D, Box3, Camera } from 'three';
2
+ import SoonSpace, { Position, Rotation } from 'soonspacejs';
3
+ export type ClashCheckAxis = 'front' | 'back' | 'left' | 'right' | 'up' | 'down';
4
+ /**
5
+ * 碰撞对象过滤器
6
+ * @remarks
7
+ * 会在遍历对象时逐个调用该方法
8
+ *
9
+ * @param obj - Object3D 对象
10
+ * @returns true:表示检测该对象的碰撞;false | null | undefined | void:表示不检测该对象的碰撞;
11
+ */
12
+ export type ClashFilter = (obj: Object3D) => boolean | null | undefined | void;
13
+ export interface StartOptions {
14
+ position?: Position | null;
15
+ rotation?: Rotation | null;
16
+ moveSpeed?: number;
17
+ eyeHeight?: number;
18
+ kneeHeight?: number;
19
+ jumpHeight?: number;
20
+ enableClash?: boolean;
21
+ enableGravity?: boolean;
22
+ /**
23
+ * 模型对象的搜索半径的系数
24
+ * @remarks
25
+ * 搜索半径是 clashCheckDistance 的多少倍
26
+ */
27
+ searchRadiusFactor?: number;
28
+ /**
29
+ * 碰撞距离
30
+ */
31
+ clashDistance?: number;
32
+ /**
33
+ * 碰撞检测距离
34
+ */
35
+ clashCheckDistance?: number;
36
+ /**
37
+ * 重力速度
38
+ */
39
+ gravitySpeed?: number;
40
+ /**
41
+ * 重力搜索系数
42
+ * @remarks
43
+ * 重力搜索系数 表示 向下搜索多少个 eyeHeight 的深度
44
+ */
45
+ gravitySearchFactor?: number;
46
+ /**
47
+ * 碰撞对象过滤器
48
+ * @remarks
49
+ * 会在遍历对象时逐个调用该方法
50
+ *
51
+ * @param obj - Object3D 对象
52
+ * @returns true:表示检测该对象的碰撞;false | null | undefined | void:表示不检测该对象的碰撞;
53
+ */
54
+ clashFilter?: ClashFilter;
55
+ /**
56
+ * 碰撞检测的层级
57
+ */
58
+ clashLayers?: number[];
59
+ /**
60
+ * 反向旋转
61
+ */
62
+ reverseRotate?: boolean | null;
63
+ /**
64
+ * 是否开启旋转
65
+ */
66
+ rotate?: boolean | null;
67
+ /**
68
+ * 旋转速度
69
+ */
70
+ rotateSpeed?: number;
71
+ /**
72
+ /**
73
+ * 是否开启水平方向的旋转
74
+ */
75
+ horizontalRotate?: boolean | null;
76
+ /**
77
+ * 是否开启垂直方向旋转
78
+ */
79
+ verticalRotate?: boolean | null;
80
+ /**
81
+ * 开启双击前进
82
+ */
83
+ dblClickForward?: boolean;
84
+ }
85
+ export default class FirstPersonControlsPlugin {
86
+ ssp: SoonSpace;
87
+ viewport: SoonSpace['viewport'];
88
+ controls: SoonSpace['controls'];
89
+ protected camera: Camera;
90
+ enabled: boolean;
91
+ keyCodeMap: {
92
+ moveForward: string[];
93
+ moveBackward: string[];
94
+ moveLeft: string[];
95
+ moveRight: string[];
96
+ moveUp: string[];
97
+ moveDown: string[];
98
+ rotateUp: string[];
99
+ rotateDown: string[];
100
+ rotateLeft: string[];
101
+ rotateRight: string[];
102
+ jump: string[];
103
+ };
104
+ private state;
105
+ /**
106
+ * 移动速度
107
+ */
108
+ moveSpeed: number;
109
+ /**
110
+ * 重力速度
111
+ */
112
+ gravitySpeed: number;
113
+ jumpOffset: number;
114
+ /**
115
+ * 碰撞检测距离
116
+ */
117
+ clashCheckDistance: number;
118
+ /**
119
+ * 碰撞距离
120
+ */
121
+ clashDistance: number;
122
+ eyeHeight: number;
123
+ kneeHeight: number;
124
+ jumpHeight: number;
125
+ enableClash: boolean;
126
+ enableGravity: boolean;
127
+ /**
128
+ * 反向旋转
129
+ */
130
+ reverseRotate: boolean;
131
+ _rotate: boolean;
132
+ /**
133
+ * 是否能旋转
134
+ */
135
+ get rotate(): boolean;
136
+ set rotate(value: boolean);
137
+ /**
138
+ * 旋转速度
139
+ */
140
+ rotateSpeed: number;
141
+ /**
142
+ * 是否开启水平方向的旋转
143
+ */
144
+ horizontalRotate: boolean;
145
+ /**
146
+ * 是否开启垂直方向旋转
147
+ */
148
+ verticalRotate: boolean;
149
+ /**
150
+ * 开启双击前进
151
+ */
152
+ dblClickForward: boolean;
153
+ readonly movement: Vector2;
154
+ /**
155
+ * 碰撞对象过滤器
156
+ * @remarks
157
+ * 会在遍历对象时逐个调用该方法
158
+ *
159
+ * @param obj - Object3D 对象
160
+ * @returns true:表示检测该对象的碰撞;false | null | undefined | void:表示不检测该对象的碰撞;
161
+ */
162
+ clashFilter?: ClashFilter;
163
+ /**
164
+ * 碰撞检测的层级
165
+ */
166
+ clashLayers?: number[];
167
+ /**
168
+ *
169
+ * @param ssp
170
+ * @param camera - 自定义的摄像机,默认会自动生成一个新的摄像机
171
+ */
172
+ constructor(ssp: SoonSpace);
173
+ onKeyDown(event: KeyboardEvent): void;
174
+ onKeyUp(event: KeyboardEvent): void;
175
+ private _dblVector;
176
+ private _dblDeltaVector;
177
+ onDblClick(event: MouseEvent): void;
178
+ private _pointerId;
179
+ onPointerDown(event: PointerEvent): void;
180
+ /**
181
+ * events handler for pointer movement
182
+ */
183
+ onPointerMove(event: PointerEvent): void;
184
+ onPointerUp(event: PointerEvent): void;
185
+ clearClashCache(): void;
186
+ lastDirection: Vector3;
187
+ onClashCheck(origin: Vector3, direction: Vector3): boolean;
188
+ /**
189
+ * 模型对象的搜索半径的系数
190
+ * @remarks
191
+ * 搜索半径是 clashCheckDistance 的多少倍
192
+ */
193
+ searchRadiusFactor: number;
194
+ checkedSphere: Sphere;
195
+ getCheckedObjects(origin: Vector3): Object3D<import("three").Object3DEventMap>[];
196
+ /**
197
+ * 重力搜索系数
198
+ * @remarks
199
+ * 重力搜索系数 表示 向下搜索多少个 eyeHeight 的深度
200
+ */
201
+ gravitySearchFactor: number;
202
+ gravityCheckedObjects: Object3D[] | null;
203
+ gravityCheckedBox: Box3;
204
+ getGravityCheckedObjects(origin: Vector3, dropY: number): Object3D<import("three").Object3DEventMap>[];
205
+ gravityClashCheck(origin: Vector3, dropY: number): Intersection<Object3D<import("three").Object3DEventMap>>;
206
+ setOptions(options: StartOptions): void;
207
+ start(options: StartOptions): void;
208
+ stop(): void;
209
+ gravityInterObject?: Intersection | null;
210
+ kneeInterObject?: Intersection | null;
211
+ eyeInterObject?: Intersection | null;
212
+ update(): void;
213
+ }
@@ -0,0 +1,9 @@
1
+ import { Box3, Object3D, Sphere, Layers } from 'three';
2
+ /**
3
+ * 判断包围合 与 对象的包围盒是否相交
4
+ */
5
+ export declare function boundingIsIntersected(target: Box3 | Sphere, obj: Object3D): boolean;
6
+ export declare function setLayers(layer: Layers, layerNums: number[]): void;
7
+ export declare const EPSILON = 0.00001;
8
+ export declare function approxZero(number: number, error?: number): boolean;
9
+ export declare function approxEquals(a: number, b: number, error?: number): boolean;
package/doc/changelog.md CHANGED
@@ -1,28 +1,28 @@
1
- # 2022年9月13日
2
- ## 原来的问题
3
- 原来存在以下问题
4
- + 在无操作下仍然消耗大量计算资源
5
- + 操作时卡顿更严重
6
- + 只能对上、下、左、右、前、后 几个固定方向进行碰撞检测,无法对任意方向进行碰撞检测
7
- + 在卡顿较严重的情况下,平移会一下子跳很远
8
-
9
- ## 优化
10
- 现在做了以下优化
11
- _以下关于帧率的测试是在 个人性能较差一点的 Mac 笔该本上进行的测试,仅作参考_
12
- + 在无操作下不消耗资源,使其从原来的 18左右 率率优化到 508 左右的帧率,提高到了3倍
13
- + 在旋转操作时,使其从原来的 10 多帧率,优化到了 30 - 40 帧,提高到了2倍多
14
- + 在平移操作时,优化到了 30 - 40 多帧(由于原来的卡顿较严重,暂时测不出原来的帧率)
15
-
16
- ## 新增特性
17
- 现在增加了以下特性
18
- + 可以对任意方向进行碰撞检测,不只是上、下、左、右、前、后 几个固定方向
19
- + 即使在卡顿较严重的情况下,平移也不会一下子跳很远
20
- + 自定义碰撞检测范围、重力检测范围 等,用以实现根据具体场景来个性化优化性能
21
-
22
-
23
- ## 优化手段
24
- + 合并运算:原来需要多次运算才能达到的目的,现在使用数学的方法,合并成了一次运算
25
- + 缩小碰撞检测范围
26
- + 优化碰撞检测逻辑
27
- + 缩小重力检测范围
1
+ # 2022年9月13日
2
+ ## 原来的问题
3
+ 原来存在以下问题
4
+ + 在无操作下仍然消耗大量计算资源
5
+ + 操作时卡顿更严重
6
+ + 只能对上、下、左、右、前、后 几个固定方向进行碰撞检测,无法对任意方向进行碰撞检测
7
+ + 在卡顿较严重的情况下,平移会一下子跳很远
8
+
9
+ ## 优化
10
+ 现在做了以下优化
11
+ _以下关于帧率的测试是在 个人性能较差一点的 Mac 笔该本上进行的测试,仅作参考_
12
+ + 在无操作下不消耗资源,使其从原来的 18左右 率率优化到 508 左右的帧率,提高到了3倍
13
+ + 在旋转操作时,使其从原来的 10 多帧率,优化到了 30 - 40 帧,提高到了2倍多
14
+ + 在平移操作时,优化到了 30 - 40 多帧(由于原来的卡顿较严重,暂时测不出原来的帧率)
15
+
16
+ ## 新增特性
17
+ 现在增加了以下特性
18
+ + 可以对任意方向进行碰撞检测,不只是上、下、左、右、前、后 几个固定方向
19
+ + 即使在卡顿较严重的情况下,平移也不会一下子跳很远
20
+ + 自定义碰撞检测范围、重力检测范围 等,用以实现根据具体场景来个性化优化性能
21
+
22
+
23
+ ## 优化手段
24
+ + 合并运算:原来需要多次运算才能达到的目的,现在使用数学的方法,合并成了一次运算
25
+ + 缩小碰撞检测范围
26
+ + 优化碰撞检测逻辑
27
+ + 缩小重力检测范围
28
28
  + 优化重力检测逻辑
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-first-person-controls",
3
3
  "pluginName": "FirstPersonControlsPlugin",
4
- "version": "2.11.13",
4
+ "version": "2.11.15",
5
5
  "description": "FirstPersonControls plugin for SoonSpace.js",
6
6
  "main": "dist/index.esm.js",
7
7
  "module": "dist/index.esm.js",
@@ -13,8 +13,8 @@
13
13
  ],
14
14
  "author": "xunwei",
15
15
  "license": "UNLICENSED",
16
- "gitHead": "0ecdef9d6546f8cd0e7f8ea38e7eb84fda951e4b",
16
+ "gitHead": "428102fac08e80d838003505c5d52575335f2f90",
17
17
  "peerDependencies": {
18
- "soonspacejs": "2.11.13"
18
+ "soonspacejs": "2.11.15"
19
19
  }
20
20
  }