@xrift/world-components 0.40.1 → 0.41.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.
- package/dist/components/BillboardY/hooks.d.ts +18 -11
- package/dist/components/BillboardY/hooks.d.ts.map +1 -1
- package/dist/components/BillboardY/hooks.js +65 -92
- package/dist/components/BillboardY/hooks.js.map +1 -1
- package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts +4 -1
- package/dist/components/DevEnvironment/components/PhysicsPlayer.d.ts.map +1 -1
- package/dist/components/DevEnvironment/components/PhysicsPlayer.js +28 -7
- package/dist/components/DevEnvironment/components/PhysicsPlayer.js.map +1 -1
- package/dist/components/DevEnvironment/constants.d.ts +13 -0
- package/dist/components/DevEnvironment/constants.d.ts.map +1 -1
- package/dist/components/DevEnvironment/constants.js +13 -0
- package/dist/components/DevEnvironment/constants.js.map +1 -1
- package/dist/components/DevEnvironment/index.d.ts.map +1 -1
- package/dist/components/DevEnvironment/index.js +34 -3
- package/dist/components/DevEnvironment/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import { type Object3D } from 'three';
|
|
2
2
|
/**
|
|
3
3
|
* Y軸ビルボードフック
|
|
4
|
-
* 対象の Object3D を毎フレームカメラに向けてY
|
|
5
|
-
*
|
|
4
|
+
* 対象の Object3D を毎フレームカメラに向けて Y 軸のみ回転させる。
|
|
5
|
+
* 親のワールド回転を考慮し、ローカル回転として正しい値を設定する。
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* スタック構造で多重ネスト(Mirror + WebXR左右眼)にも対応。
|
|
7
|
+
* 実装方針:
|
|
8
|
+
* - useFrame で renderer.render() の前に rotation を確定する
|
|
9
|
+
* - 1 フレーム中に複数の renderer.render 呼び出しがあっても全て同じ matrixWorld
|
|
10
|
+
* を使うので、複数 BillboardY 同居や opaque/transparent 混在でも安定して動作する
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
* -
|
|
15
|
-
*
|
|
16
|
-
*
|
|
12
|
+
* カメラ真上/真下対応:
|
|
13
|
+
* - target がカメラの真上/真下にあると atan2(0, 0) が暴れるため、水平距離が
|
|
14
|
+
* {@link NEAR_CAMERA_DIST_SQ} 以下のときは「カメラの視線方向 1m 先」を
|
|
15
|
+
* 仮想カメラ位置として使い、そこから target を見ているとして rotation を計算する
|
|
16
|
+
* (視線方向に合わせて billboard が回転する形になる)
|
|
17
|
+
* - 視線が真上/真下のときは forward の XZ 成分が無くなるので前フレームの rotation
|
|
18
|
+
* を保持する
|
|
19
|
+
*
|
|
20
|
+
* 既知の制約:
|
|
21
|
+
* - Mirror(Reflector)の鏡像内では billboard が「鏡カメラに向く」挙動はしない
|
|
22
|
+
* (メインカメラ向きで固定される)。鏡像内でも正しい向きにしたいケースは
|
|
23
|
+
* 別途検討が必要(issue #173 参照)。
|
|
17
24
|
*/
|
|
18
25
|
export declare const useBillboardY: <T extends Object3D>() => import("react").RefObject<T>;
|
|
19
26
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAGd,MAAM,OAAO,CAAA;AAuBd;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,QAAQ,mCAiD/C,CAAA"}
|
|
@@ -1,112 +1,85 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
import { useFrame } from '@react-three/fiber';
|
|
3
|
+
import { Euler, Quaternion, Vector3, } from 'three';
|
|
3
4
|
import { getBillboardYRotation } from './utils';
|
|
4
5
|
const _cameraWorldPos = new Vector3();
|
|
5
6
|
const _targetWorldPos = new Vector3();
|
|
7
|
+
const _cameraForward = new Vector3();
|
|
8
|
+
const _virtualCameraPos = new Vector3();
|
|
6
9
|
const _parentQuat = new Quaternion();
|
|
7
10
|
const _parentPos = new Vector3();
|
|
8
11
|
const _parentScale = new Vector3();
|
|
9
12
|
const _euler = new Euler();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const TRANSPARENT_MATERIAL = new MeshBasicMaterial({
|
|
20
|
-
colorWrite: false,
|
|
21
|
-
depthWrite: false,
|
|
22
|
-
depthTest: false,
|
|
23
|
-
transparent: true,
|
|
24
|
-
opacity: 0,
|
|
25
|
-
});
|
|
13
|
+
/** カメラとターゲットが水平方向にこれ以下に近接していたら「仮想カメラ位置」へ
|
|
14
|
+
* フォールバックする閾値。0.1m = 10cm。
|
|
15
|
+
*
|
|
16
|
+
* 自分の頭上に置く NameTag / TagDisplay のように XZ 座標がカメラと一致するケースで
|
|
17
|
+
* atan2(0, 0) が暴れるのを防ぐ。歩行時の frame ラグ(〜25mm/frame)や
|
|
18
|
+
* 走行時のラグ(〜83mm/frame)もこの範囲に収まる。 */
|
|
19
|
+
const NEAR_CAMERA_DIST_SQ = 0.01; // (0.1m)²
|
|
20
|
+
/** 仮想カメラを実カメラの視線方向何メートル先に置くか */
|
|
21
|
+
const VIRTUAL_CAMERA_DISTANCE = 1.0;
|
|
26
22
|
/**
|
|
27
23
|
* Y軸ビルボードフック
|
|
28
|
-
* 対象の Object3D を毎フレームカメラに向けてY
|
|
29
|
-
*
|
|
24
|
+
* 対象の Object3D を毎フレームカメラに向けて Y 軸のみ回転させる。
|
|
25
|
+
* 親のワールド回転を考慮し、ローカル回転として正しい値を設定する。
|
|
26
|
+
*
|
|
27
|
+
* 実装方針:
|
|
28
|
+
* - useFrame で renderer.render() の前に rotation を確定する
|
|
29
|
+
* - 1 フレーム中に複数の renderer.render 呼び出しがあっても全て同じ matrixWorld
|
|
30
|
+
* を使うので、複数 BillboardY 同居や opaque/transparent 混在でも安定して動作する
|
|
30
31
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* カメラ真上/真下対応:
|
|
33
|
+
* - target がカメラの真上/真下にあると atan2(0, 0) が暴れるため、水平距離が
|
|
34
|
+
* {@link NEAR_CAMERA_DIST_SQ} 以下のときは「カメラの視線方向 1m 先」を
|
|
35
|
+
* 仮想カメラ位置として使い、そこから target を見ているとして rotation を計算する
|
|
36
|
+
* (視線方向に合わせて billboard が回転する形になる)
|
|
37
|
+
* - 視線が真上/真下のときは forward の XZ 成分が無くなるので前フレームの rotation
|
|
38
|
+
* を保持する
|
|
36
39
|
*
|
|
37
|
-
*
|
|
38
|
-
* -
|
|
39
|
-
*
|
|
40
|
-
*
|
|
40
|
+
* 既知の制約:
|
|
41
|
+
* - Mirror(Reflector)の鏡像内では billboard が「鏡カメラに向く」挙動はしない
|
|
42
|
+
* (メインカメラ向きで固定される)。鏡像内でも正しい向きにしたいケースは
|
|
43
|
+
* 別途検討が必要(issue #173 参照)。
|
|
41
44
|
*/
|
|
42
45
|
export const useBillboardY = () => {
|
|
43
46
|
const ref = useRef(null);
|
|
44
|
-
|
|
45
|
-
if (!ref.current)
|
|
46
|
-
return;
|
|
47
|
+
useFrame(({ camera }) => {
|
|
47
48
|
const target = ref.current;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
};
|
|
66
|
-
const restoreRotation = () => {
|
|
67
|
-
const saved = savedRotations.pop();
|
|
68
|
-
if (saved !== undefined) {
|
|
69
|
-
target.rotation.y = saved;
|
|
70
|
-
target.updateWorldMatrix(false, true);
|
|
49
|
+
if (!target)
|
|
50
|
+
return;
|
|
51
|
+
_cameraWorldPos.setFromMatrixPosition(camera.matrixWorld);
|
|
52
|
+
_targetWorldPos.setFromMatrixPosition(target.matrixWorld);
|
|
53
|
+
// 通常はカメラ実位置を使う
|
|
54
|
+
let refPos = _cameraWorldPos;
|
|
55
|
+
const dx = _cameraWorldPos.x - _targetWorldPos.x;
|
|
56
|
+
const dz = _cameraWorldPos.z - _targetWorldPos.z;
|
|
57
|
+
if (dx * dx + dz * dz < NEAR_CAMERA_DIST_SQ) {
|
|
58
|
+
// カメラが target の真上/真下付近 → 視線方向 1m 先を仮想カメラ位置に
|
|
59
|
+
camera.getWorldDirection(_cameraForward);
|
|
60
|
+
_cameraForward.y = 0;
|
|
61
|
+
const fwdLenSq = _cameraForward.x * _cameraForward.x +
|
|
62
|
+
_cameraForward.z * _cameraForward.z;
|
|
63
|
+
if (fwdLenSq < NEAR_CAMERA_DIST_SQ) {
|
|
64
|
+
// 視線が真上/真下 → 前フレームの rotation を保持
|
|
65
|
+
return;
|
|
71
66
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
opaquePreSentinel.onBeforeRender = (_r, _s, camera) => applyRotation(camera);
|
|
78
|
-
const opaquePostSentinel = new Mesh(SENTINEL_GEOMETRY, OPAQUE_MATERIAL);
|
|
79
|
-
opaquePostSentinel.frustumCulled = false;
|
|
80
|
-
opaquePostSentinel.renderOrder = Infinity;
|
|
81
|
-
opaquePostSentinel.onBeforeRender = restoreRotation;
|
|
82
|
-
// transparent リスト用 sentinel
|
|
83
|
-
const transparentPreSentinel = new Mesh(SENTINEL_GEOMETRY, TRANSPARENT_MATERIAL);
|
|
84
|
-
transparentPreSentinel.frustumCulled = false;
|
|
85
|
-
transparentPreSentinel.renderOrder = -Infinity;
|
|
86
|
-
transparentPreSentinel.onBeforeRender = (_r, _s, camera) => applyRotation(camera);
|
|
87
|
-
const transparentPostSentinel = new Mesh(SENTINEL_GEOMETRY, TRANSPARENT_MATERIAL);
|
|
88
|
-
transparentPostSentinel.frustumCulled = false;
|
|
89
|
-
transparentPostSentinel.renderOrder = Infinity;
|
|
90
|
-
transparentPostSentinel.onBeforeRender = restoreRotation;
|
|
91
|
-
const sentinels = [
|
|
92
|
-
opaquePreSentinel,
|
|
93
|
-
opaquePostSentinel,
|
|
94
|
-
transparentPreSentinel,
|
|
95
|
-
transparentPostSentinel,
|
|
96
|
-
];
|
|
97
|
-
// どのカメラのレイヤー設定でも projection を通すため全レイヤーを有効化
|
|
98
|
-
// (sentinel は colorWrite/depthWrite 全 off なので描画自体は無害)
|
|
99
|
-
for (const s of sentinels) {
|
|
100
|
-
s.layers.enableAll();
|
|
101
|
-
target.add(s);
|
|
67
|
+
_cameraForward.normalize();
|
|
68
|
+
_virtualCameraPos
|
|
69
|
+
.copy(_cameraWorldPos)
|
|
70
|
+
.addScaledVector(_cameraForward, VIRTUAL_CAMERA_DISTANCE);
|
|
71
|
+
refPos = _virtualCameraPos;
|
|
102
72
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
73
|
+
const worldRotationY = getBillboardYRotation(refPos, _targetWorldPos);
|
|
74
|
+
if (target.parent) {
|
|
75
|
+
target.parent.matrixWorld.decompose(_parentPos, _parentQuat, _parentScale);
|
|
76
|
+
_euler.setFromQuaternion(_parentQuat, 'YXZ');
|
|
77
|
+
target.rotation.y = worldRotationY - _euler.y;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
target.rotation.y = worldRotationY;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
110
83
|
return ref;
|
|
111
84
|
};
|
|
112
85
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/components/BillboardY/hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import type { MutableRefObject } from 'react';
|
|
2
|
+
import type { PlayerMovement } from '../../../types/movement';
|
|
1
3
|
interface Props {
|
|
2
4
|
moveSpeed: number;
|
|
3
5
|
spawnPosition: [number, number, number];
|
|
4
6
|
respawnThreshold: number;
|
|
5
7
|
allowInfiniteJump: boolean;
|
|
8
|
+
movementRef?: MutableRefObject<PlayerMovement>;
|
|
6
9
|
}
|
|
7
|
-
export declare function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, movementRef, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
8
11
|
export {};
|
|
9
12
|
//# sourceMappingURL=PhysicsPlayer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsPlayer.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PhysicsPlayer.d.ts","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AAY7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAU7D,UAAU,KAAK;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,WAAW,CAAC,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAA;CAC/C;AAED,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GACZ,EAAE,KAAK,2CA0OP"}
|
|
@@ -5,9 +5,8 @@ import { CapsuleCollider, CuboidCollider, RigidBody, } from '@react-three/rapier
|
|
|
5
5
|
import { Vector3 } from 'three';
|
|
6
6
|
import { useSpawnPoint } from '../../../hooks/useSpawnPoint';
|
|
7
7
|
import { LAYERS } from '../../../constants/layers';
|
|
8
|
-
import { PLAYER_HALF_HEIGHT, PLAYER_RADIUS, JUMP_VELOCITY, LINEAR_DAMPING, CAMERA_Y_OFFSET, } from '../constants';
|
|
9
|
-
|
|
10
|
-
export function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, }) {
|
|
8
|
+
import { PLAYER_HALF_HEIGHT, PLAYER_RADIUS, JUMP_VELOCITY, LINEAR_DAMPING, CAMERA_Y_OFFSET, DEV_AVATAR_HEIGHT, } from '../constants';
|
|
9
|
+
export function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allowInfiniteJump, movementRef, }) {
|
|
11
10
|
const rigidBodyRef = useRef(null);
|
|
12
11
|
const avatarGroupRef = useRef(null);
|
|
13
12
|
const headRef = useRef(null);
|
|
@@ -126,16 +125,38 @@ export function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allo
|
|
|
126
125
|
const pos = rb.translation();
|
|
127
126
|
camera.position.set(pos.x, pos.y + CAMERA_Y_OFFSET, pos.z);
|
|
128
127
|
// --- DummyAvatar 位置同期 ---
|
|
128
|
+
camera.getWorldDirection(forwardRef.current);
|
|
129
|
+
const yaw = -Math.atan2(forwardRef.current.x, -forwardRef.current.z);
|
|
130
|
+
const pitch = Math.asin(forwardRef.current.y);
|
|
129
131
|
if (avatarGroupRef.current) {
|
|
130
132
|
avatarGroupRef.current.position.set(pos.x, pos.y + CAMERA_Y_OFFSET, pos.z);
|
|
131
|
-
camera.getWorldDirection(forwardRef.current);
|
|
132
|
-
const yaw = -Math.atan2(forwardRef.current.x, -forwardRef.current.z);
|
|
133
|
-
const pitch = Math.asin(forwardRef.current.y);
|
|
134
133
|
avatarGroupRef.current.rotation.set(0, yaw, 0);
|
|
135
134
|
if (headRef.current) {
|
|
136
135
|
headRef.current.rotation.set(pitch, 0, 0);
|
|
137
136
|
}
|
|
138
137
|
}
|
|
138
|
+
// --- useUsers 用の PlayerMovement を更新(足元基準) ---
|
|
139
|
+
if (movementRef) {
|
|
140
|
+
const m = movementRef.current;
|
|
141
|
+
m.position.x = pos.x;
|
|
142
|
+
m.position.y = pos.y - (PLAYER_HALF_HEIGHT + PLAYER_RADIUS);
|
|
143
|
+
m.position.z = pos.z;
|
|
144
|
+
if (len > 0) {
|
|
145
|
+
m.direction.x = moveX / moveSpeed;
|
|
146
|
+
m.direction.z = moveZ / moveSpeed;
|
|
147
|
+
m.horizontalSpeed = moveSpeed;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
m.direction.x = 0;
|
|
151
|
+
m.direction.z = 0;
|
|
152
|
+
m.horizontalSpeed = 0;
|
|
153
|
+
}
|
|
154
|
+
m.verticalSpeed = vy;
|
|
155
|
+
m.rotation.yaw = yaw;
|
|
156
|
+
m.rotation.pitch = pitch;
|
|
157
|
+
m.isGrounded = isGroundedRef.current;
|
|
158
|
+
m.isJumping = !isGroundedRef.current && vy > 0;
|
|
159
|
+
}
|
|
139
160
|
// --- リスポーン ---
|
|
140
161
|
if (pos.y < respawnThreshold) {
|
|
141
162
|
if (spawnPoint) {
|
|
@@ -154,6 +175,6 @@ export function PhysicsPlayer({ moveSpeed, spawnPosition, respawnThreshold, allo
|
|
|
154
175
|
isGroundedRef.current = true;
|
|
155
176
|
}, onIntersectionExit: () => {
|
|
156
177
|
isGroundedRef.current = false;
|
|
157
|
-
} })] }), _jsxs("group", { ref: avatarGroupRef, children: [_jsxs("mesh", { castShadow: true, ref: headRef, children: [_jsx("boxGeometry", { args: [0.2, 0.1, 0.2] }), _jsx("meshLambertMaterial", { color: "#ffcccc" })] }), _jsxs("mesh", { castShadow: true, position: [0, -
|
|
178
|
+
} })] }), _jsxs("group", { ref: avatarGroupRef, children: [_jsxs("mesh", { castShadow: true, ref: headRef, children: [_jsx("boxGeometry", { args: [0.2, 0.1, 0.2] }), _jsx("meshLambertMaterial", { color: "#ffcccc" })] }), _jsxs("mesh", { castShadow: true, position: [0, -DEV_AVATAR_HEIGHT * 0.55, 0], children: [_jsx("boxGeometry", { args: [0.3, DEV_AVATAR_HEIGHT, 0.1] }), _jsx("meshLambertMaterial", { color: "#ccffcc" })] })] })] }));
|
|
158
179
|
}
|
|
159
180
|
//# sourceMappingURL=PhysicsPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PhysicsPlayer.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"PhysicsPlayer.js","sourceRoot":"","sources":["../../../../src/components/DevEnvironment/components/PhysicsPlayer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -20,4 +20,17 @@ export declare const CROSSHAIR_SIZE = 20;
|
|
|
20
20
|
export declare const CROSSHAIR_THICKNESS = 2;
|
|
21
21
|
export declare const CROSSHAIR_ACTIVE_THICKNESS = 3;
|
|
22
22
|
export declare const HIGHLIGHT_COLOR = "#4dabf7";
|
|
23
|
+
/**
|
|
24
|
+
* DevEnvironment 上のローカルユーザー定数
|
|
25
|
+
* 本番環境では xrift-frontend が UsersProvider に実装を注入するが、
|
|
26
|
+
* DevEnvironment ではダミーのユーザー情報を提供して useUsers を機能させる
|
|
27
|
+
*/
|
|
28
|
+
export declare const DEV_LOCAL_USER_ID = "dev-local-user";
|
|
29
|
+
export declare const DEV_LOCAL_USER_DISPLAY_NAME = "Dev User";
|
|
30
|
+
/**
|
|
31
|
+
* DummyAvatar の見た目に基づく高さ情報
|
|
32
|
+
* eyeHeight はカプセル底面(地面)からカメラまでの距離
|
|
33
|
+
*/
|
|
34
|
+
export declare const DEV_AVATAR_HEIGHT = 1.5;
|
|
35
|
+
export declare const DEV_EYE_HEIGHT: number;
|
|
23
36
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,UAAU,IAAM,CAAA;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,cAAc,MAAM,CAAA;AACjC,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAqB,CAAA;AACjF,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAC/C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;GAEG;AACH,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,eAAe,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AACrC,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,UAAU,IAAM,CAAA;AAC7B,eAAO,MAAM,aAAa,MAAM,CAAA;AAChC,eAAO,MAAM,cAAc,MAAM,CAAA;AACjC,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAqB,CAAA;AACjF,eAAO,MAAM,eAAe,OAAO,CAAA;AACnC,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAC/C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;GAEG;AACH,eAAO,MAAM,cAAc,KAAK,CAAA;AAChC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,eAAO,MAAM,eAAe,YAAY,CAAA;AAExC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,mBAAmB,CAAA;AACjD,eAAO,MAAM,2BAA2B,aAAa,CAAA;AAErD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,eAAO,MAAM,cAAc,QAAuD,CAAA"}
|
|
@@ -20,4 +20,17 @@ export const CROSSHAIR_SIZE = 20;
|
|
|
20
20
|
export const CROSSHAIR_THICKNESS = 2;
|
|
21
21
|
export const CROSSHAIR_ACTIVE_THICKNESS = 3;
|
|
22
22
|
export const HIGHLIGHT_COLOR = '#4dabf7';
|
|
23
|
+
/**
|
|
24
|
+
* DevEnvironment 上のローカルユーザー定数
|
|
25
|
+
* 本番環境では xrift-frontend が UsersProvider に実装を注入するが、
|
|
26
|
+
* DevEnvironment ではダミーのユーザー情報を提供して useUsers を機能させる
|
|
27
|
+
*/
|
|
28
|
+
export const DEV_LOCAL_USER_ID = 'dev-local-user';
|
|
29
|
+
export const DEV_LOCAL_USER_DISPLAY_NAME = 'Dev User';
|
|
30
|
+
/**
|
|
31
|
+
* DummyAvatar の見た目に基づく高さ情報
|
|
32
|
+
* eyeHeight はカプセル底面(地面)からカメラまでの距離
|
|
33
|
+
*/
|
|
34
|
+
export const DEV_AVATAR_HEIGHT = 1.5;
|
|
35
|
+
export const DEV_EYE_HEIGHT = PLAYER_HALF_HEIGHT + PLAYER_RADIUS + CAMERA_Y_OFFSET;
|
|
23
36
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAA;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAA;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAA6B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAA;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAA;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAA;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAAE,CAAA;AACtC,MAAM,CAAC,MAAM,sBAAsB,GAA6B,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAA;AAC/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAA;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAA;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAA;AAExC;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAA;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAAA;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAA;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,GAAG,aAAa,GAAG,eAAe,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAmCpC,MAAM,MAAM,mBAAmB,GAAG,KAAK,CAAA;AAmBvC,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,SAAsB,EACtB,OAAc,EACd,aAAsC,EACtC,gBAAsC,EACtC,aAAa,EACb,gBAAgB,EAAE,mBAAmB,GACtC,EAAE,KAAK,2CAqFP"}
|
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useMemo, useState, useSyncExternalStore } from 'react';
|
|
2
|
+
import { useCallback, useMemo, useRef, useState, useSyncExternalStore } from 'react';
|
|
3
3
|
import { Canvas } from '@react-three/fiber';
|
|
4
4
|
import { PointerLockControls } from '@react-three/drei';
|
|
5
5
|
import { Physics } from '@react-three/rapier';
|
|
6
6
|
import { SpawnPointProvider } from '../../contexts/SpawnPointContext';
|
|
7
|
+
import { UsersProvider } from '../../contexts/UsersContext';
|
|
7
8
|
import { PCFShadowMap } from 'three';
|
|
8
9
|
import { toThreeOutputBufferType } from './utils';
|
|
9
|
-
import { DEFAULT_SPAWN_POSITION, DEFAULT_GRAVITY, DEFAULT_ALLOW_INFINITE_JUMP, DEFAULT_CAMERA_NEAR, DEFAULT_CAMERA_FAR, MOVE_SPEED, RESPAWN_Y_THRESHOLD, } from './constants';
|
|
10
|
+
import { DEFAULT_SPAWN_POSITION, DEFAULT_GRAVITY, DEFAULT_ALLOW_INFINITE_JUMP, DEFAULT_CAMERA_NEAR, DEFAULT_CAMERA_FAR, MOVE_SPEED, RESPAWN_Y_THRESHOLD, DEV_LOCAL_USER_ID, DEV_LOCAL_USER_DISPLAY_NAME, DEV_AVATAR_HEIGHT, DEV_EYE_HEIGHT, } from './constants';
|
|
10
11
|
import { PhysicsPlayer } from './components/PhysicsPlayer';
|
|
11
12
|
import { CenterRaycaster } from './components/CenterRaycaster';
|
|
12
13
|
import { Crosshair } from './components/Crosshair';
|
|
13
14
|
import { PointerLockStatus } from './components/PointerLockStatus';
|
|
14
15
|
import { ControlsHelp } from './components/ControlsHelp';
|
|
16
|
+
const DEV_LOCAL_USER = {
|
|
17
|
+
id: DEV_LOCAL_USER_ID,
|
|
18
|
+
displayName: DEV_LOCAL_USER_DISPLAY_NAME,
|
|
19
|
+
avatarUrl: null,
|
|
20
|
+
isGuest: true,
|
|
21
|
+
};
|
|
22
|
+
const DEV_LOCAL_AVATAR_HEIGHT = {
|
|
23
|
+
height: DEV_AVATAR_HEIGHT,
|
|
24
|
+
eyeHeight: DEV_EYE_HEIGHT,
|
|
25
|
+
};
|
|
26
|
+
const EMPTY_REMOTE_USERS = [];
|
|
15
27
|
const containerStyle = {
|
|
16
28
|
width: '100vw',
|
|
17
29
|
height: '100vh',
|
|
@@ -30,6 +42,25 @@ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shado
|
|
|
30
42
|
const [isHit, setIsHit] = useState(false);
|
|
31
43
|
const isPointerLocked = useSyncExternalStore(subscribePointerLock, getPointerLockSnapshot, () => false);
|
|
32
44
|
const handleHitChange = useCallback((hit) => setIsHit(hit), []);
|
|
45
|
+
// ローカルユーザーの位置情報を保持する ref。PhysicsPlayer が毎フレーム書き込み、
|
|
46
|
+
// useUsers().getLocalMovement() がここから読み取る(再レンダリングは発生しない)
|
|
47
|
+
const localMovementRef = useRef({
|
|
48
|
+
position: { x: spawnPosition[0], y: spawnPosition[1], z: spawnPosition[2] },
|
|
49
|
+
direction: { x: 0, z: 0 },
|
|
50
|
+
horizontalSpeed: 0,
|
|
51
|
+
verticalSpeed: 0,
|
|
52
|
+
rotation: { yaw: 0, pitch: 0 },
|
|
53
|
+
isGrounded: true,
|
|
54
|
+
isJumping: false,
|
|
55
|
+
});
|
|
56
|
+
const usersImplementation = useMemo(() => ({
|
|
57
|
+
localUser: DEV_LOCAL_USER,
|
|
58
|
+
remoteUsers: EMPTY_REMOTE_USERS,
|
|
59
|
+
getMovement: () => undefined,
|
|
60
|
+
getLocalMovement: () => localMovementRef.current,
|
|
61
|
+
getAvatarHeight: () => undefined,
|
|
62
|
+
getLocalAvatarHeight: () => DEV_LOCAL_AVATAR_HEIGHT,
|
|
63
|
+
}), []);
|
|
33
64
|
const gravity = physicsConfig?.gravity ?? DEFAULT_GRAVITY;
|
|
34
65
|
const allowInfiniteJump = physicsConfig?.allowInfiniteJump ?? DEFAULT_ALLOW_INFINITE_JUMP;
|
|
35
66
|
const outputBufferType = toThreeOutputBufferType(outputBufferTypeStr);
|
|
@@ -45,6 +76,6 @@ export function DevEnvironment({ children, camera, moveSpeed = MOVE_SPEED, shado
|
|
|
45
76
|
fov: cameraFov,
|
|
46
77
|
near: cameraNear,
|
|
47
78
|
far: cameraFar,
|
|
48
|
-
}, gl: glProps, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsx(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children:
|
|
79
|
+
}, gl: glProps, children: [_jsx(PointerLockControls, {}), _jsx(CenterRaycaster, { onHitChange: handleHitChange }), _jsx(Physics, { gravity: [0, -gravity, 0], timeStep: "vary", children: _jsx(SpawnPointProvider, { children: _jsxs(UsersProvider, { implementation: usersImplementation, children: [_jsx(PhysicsPlayer, { moveSpeed: moveSpeed, spawnPosition: spawnPosition, respawnThreshold: respawnThreshold, allowInfiniteJump: allowInfiniteJump, movementRef: localMovementRef }), children] }) }) })] }), _jsx(Crosshair, { active: isHit }), _jsx(PointerLockStatus, { isLocked: isPointerLocked }), _jsx(ControlsHelp, {})] }));
|
|
49
80
|
}
|
|
50
81
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DevEnvironment/index.tsx"],"names":[],"mappings":"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"}
|