Held by the spin. Not by gravity.
spinward.toming.app â walk the inside of a spinning O'Neill cylinder in your browser. No install: Meta Quest browser (WebXR), desktop, or phone.
The city looks ordinary until you look up and see the far side of town hanging overhead. Then you throw a ball and it curves (Coriolis). You jump and the floor slides sideways to meet you. You ride up to the axis and your weight goes away. The physics runs in the inertial frame with Rapier; only the rendering happens in the rotating frame with three.js. The curve, the sideways drift, and the weightlessness are what falls out of that, not scripted effects.
A three-minute tour: throw â jump â 2 Overlook (weaker gravity near the axis) â 3 Axis (zero-g) â 4 Exterior (watch the whole colony turn). Change the spin rate and feel g = ϲR. Turn on rain and watch every drop lag the spin. Share any view with its URL â the link unfurls with that view's own description.
Default habitat is Izma Colony (3.2 km radius, 40 km long, 1 g). What is simulated and what is approximated: docs/whats-real.md. Controls are in the table below; the full VR bindings are in docs/vr-controls.md. Source is under AGPL-3.0-or-later. The rest of this README is in Japanese.
| PC | Quest | Phone | |
|---|---|---|---|
| Move | WASD | left stick (hold grip to climb) | virtual stick on the left |
| Look | click the view to grab the mouse (Esc frees it) · right-drag · arrow keys | head + right stick snap turn | drag on the right · Gyro button |
| Throw | left click (fixed speed) | right trigger (hold to charge) | tap on the right (fixed speed) |
| Jump | Space (hold to keep rising) | A | Jump button (hold to keep rising) |
| Travel | 1 / 2 / 3 / 4 or the Travel menu | B or the wrist menu | Travel menu |
| Spin rate | Spin â/+ buttons or - / = |
wrist menu rpm | Spin â/+ buttons |
| Rain | Rain button or R |
toggle before entering VR | Rain button |
| Free-fly | F |
A | hold Jump |
| Drive | E next to the parked rover |
â | Drive button next to the rover |
| Share | Link L · Photo P |
â | Link · Photo |
Throw: the ball flies straight in the inertial frame and curves on screen. The dashed line is where the same throw would land on a flat Earth.
Try the glowing ring eight metres ahead of the starting point: aim a little high and click or tap. It turns green and chimes when the whole ball passes through. PC and phone start at a repeatable 16 m/s; after a hit, the Speed menu offers Normal / Slow (12 m/s) so you can try a higher arc. The sign compares your result with the dashed Earth trajectory. Choose Ball / Beam / Firework from the visible Throw menu; X is a shortcut. VR keeps its hand-and-trigger throwing controls. Only Ball shots from near the starting point count. The ring is a visual scoring gate, not a solid obstacle. Travel â Surface returns you to the throwing area.
Public buildings with an OPEN · WALK IN sign can be entered. Explore cafes, through-passages and courtyards across the city; look up from a courtyard to see the opposite neighbourhood overhead. Exterior and interior detail stream independently, while walls and doorways keep the same collision shape. Implementation and local preview links.
åè»¢å± äœåºã®äººå·¥éåãã説æã§ã¯ãªã身äœã§çè§£ãã WebXR ãã¢ã
èŠäžãããšå察åŽã®è¡ã空ã«ãããæ©ããšæ®éã®è¡ãªã®ã«ãæããã»è·³ã¶ã»äžå¿è»žãžè¡ããšç©çãå€ã«ãªãââå転ã³ãããŒã®ãæ¯èгããšã人工éåã®éåæãã 3 åã§äœéšããããšãçã£ããSF 奜ãåãã®ç©çå®éšå VR ãã¢ã§ãã
vite + typescript + three.js + rapier ã§æ§æããMeta Quest ã®ãã©ãŠã¶ã»PC ãã©ãŠã¶ã»ã¹ããã® 3 ç°å¢ã§åããŸããRapier ã®æ
£æ§ç³»ã·ãã¥ã¬ãŒã·ã§ã³ãšå転座æšç³»ã®è¡šç€ºå€æãåé¢ãããŸãŸããæãããšæ²ãã(ã³ãªãªãª)ãããžã£ã³ããããšåºãè¿ãã«æ¥ããã軞ã«è¿ã¥ããšéåãæããããå転é床ãå€ãããšäžçã軜ããªãããäœéšã§ããŸãã
åæã¹ããŒã³ã¯ Izma Colony(ååŸ 3.2kmã»å
šé· 40kmã»1g)ã§ããå°ã¹ã±ãŒã«ã§ç©çã詊ãããå Žåã¯ç»é¢äžããã¯ã® preset ããã(VR ã§ã¯ wrist UI)ãã Playground ããªã»ãããžåãæ¿ããããŸããURL ã« ?preset=playground|izma|cooper|elysium ãä»ãããšä»»æã®ããªã»ããã§èµ·åã§ããŸãã
- å°è¡š(Surface) â åçå å£ã®è¡ã«ç«ã€ã空ã®åããã«å察åŽã®è¡ãæ¡å çªã®ã¹ãã©ã€ããäžå¿è»žã®å ãèŠããã
- æããã»è·³ã¶ â ããŒã«ã¯çã£ããé£ã°ãªãããžã£ã³ãäžã¯äœã«ãåŒããããåºã暪ã«ãããŠè¿ãã«æ¥ãã説æã«ãŒããç»é¢äžã«çãåºãŸãã
- 屿å°ç¹(Overlook) â
2ããŒãŸãã¯ç»é¢äžã® Travel ãã¿ã³(VR ã§ã¯ wrist UI)ããã軞ã«è¿ãã»ã©å転é床ãé ããéåãã匱ããèœäžãããšè¡ãæšªãžæµããŠããã - äžå¿è»ž(Axis) â
3ããŒã§è»žç«¯ãžãå転ååŸãŒã=ç¡ééãè¡ã空ã«ãªãã4ããŒã® Exterior ã§ã³ãããŒã®å€æ®»ã®å€ãžåºãŠãåãå šäœãçºããããšãã§ãããå€ã¯ç空: äžçã®é³ããã¹ãŠæ¶ããèªåã®åŒåžãšå¿æã ããæ®ãã - å転é床ãå€ãã â ç»é¢äžã® Spin â/+(VR ã§ã¯ wrist UI ã® rpm)ã§
g = ϲRãäœæããã - éšãéããã â ç»é¢äžã® Rain ãã¿ã³(ãŸã㯠URL ã«
?rain)ãéšã¯å転ã«çœ®ããŠããããŠæãã«éããåŸãã¯é«åºŠã§å€ãããé²ã¯éåã®åŒ±ã軞ä»è¿ã«åŒµãã€ãã®ã§ãAxis ãžåãã£ãŠæã£ãŠãããšéšã®äžã«åºãã
VR ã®å šãã€ã³ããšæå㯠docs/vr-controls.md ã«ãŸãšããŠããŸãïŒåèšèã¯ãå·Šæãé£ã°ãã峿ãäžçã«è§ŠããAïŒäžã»BïŒã¡ãã¥ãŒãïŒã
| æäœ | PC | Quest | ã¹ãã |
|---|---|---|---|
| ç§»å | WASD | å·Šã¹ãã£ãã¯(grip ã§ç»æã¯ã©ãã) | ç»é¢å·Šã®ä»®æ³ã¹ãã£ã㯠|
| èŠç· | ç»é¢ã¯ãªãã¯ã§ããŠã¹è¿œåŸ(Esc ã§è§£é€) / å³ãã©ãã° / ç¢å°ã㌠| é + å³ã¹ãã£ã㯠snap turn | ãã©ãã° / Gyro ãã¿ã³ã§ãžã£ã€ã |
| æãã | å·Šã¯ãªãã¯(äžå®éåºŠã»æååŸã«Normal / Slowéžæ) | å³ããªã¬ãŒ(ãã£ãŒãžå¯) | å³åŽã¿ãã(PCãšåãéåºŠéžæ) |
| åŒŸçš®åæ¿(Ball / Beam / Firework) | Throw ã¡ãã¥ãŒããŸã㯠X / å³ã¯ãªã㯠| â(éVRç»é¢ã§åæ¿) | Throw ã¡ãã¥ãŒ |
| ãžã£ã³ã | Space(æŒãã£ã±ãªãã§äžæç¶ç¶) | A ãã¿ã³(å·Šå³ã©ã¡ãã§ã) | Jump ãã¿ã³(é·æŒãã§äžæç¶ç¶) |
| ã¯ãŒã | 1 / 2 / 3 / 4(å°è¡š / 屿 / 軞 / ã³ãããŒå€)ããŸã㯠Travel ãã¿ã³ | 峿 B / wrist UI ã® Travel | Travel ãã¿ã³(Surface / Overlook / Axis / Exterior) |
| å転é床 | Spin â/+ ãã¿ã³ããŸã㯠- / = ã㌠|
wrist UI ã® rpm | Spin â/+ ãã¿ã³ |
| éš | Rain ãã¿ã³ãR ããŒããŸã㯠URL ã« ?rain |
â(VR å ¥å Žåã«éVRç»é¢ã§åæ¿) | Rain ãã¿ã³ |
| å ±æ | Share: Link(ãã®èŠç¹ã®URLãã³ããŒã»L ããŒ) / Photo(PNGä¿åã»P ããŒ) |
â | Share: Link(å ±æã·ãŒã) / Photo |
| æäœã¬ã€ã | CONTROL ãããã«ãã㌠/ ã¯ãªã㯠| å·ŠæéŠã® watch UI(å·Š B ã§ãªã»ã³ã¿ãŒ) | CONTROL ããããã¿ãã |
| é¢éž(free-fly) | F | A(ãžã£ã³ã) | Jump é·æŒã |
éVRç°å¢ã§ã¯ç»é¢äžã« 1 æ¬ã®ããã¯ãåžžæåºãŸã: å·Šã« CONTROLã»presetã»ã¹ããŒã¿ã¹ããã(felt g / Ï rpm / mode / balls)ã»Throw ã¡ãã¥ãŒãå³ã« Travelã»Spinã»(察å¿ç°å¢ãªã)VR ãã¿ã³ã茪ãéããš Ball çšã® Speed ã¡ãã¥ãŒãçŸããŸããã¹ããã¯ããã« Jump / Drive / Gyro ã®ãã¿ã³åãåºãŸããiOS ã§ã¯ãžã£ã€ãäœ¿çšæã« Gyro ãã¿ã³ããèš±å¯ãã€ã¢ãã°ãåºãŸãã
bun installbun run devPC åŽã§ https://<PCã®IPã¢ãã¬ã¹>:5173 ãéããç¶æ
ã«ãªããŸããQuest ãã©ãŠã¶ã§éãã«ã¯ãPC ãš Quest ãåããããã¯ãŒã¯ã«çœ®ããŠã¢ã¯ã»ã¹ããŠãã ããã
bun run build
bun run preview -- --host 0.0.0.0æ¬çªã¯ static-assets-only Worker(wrangler.jsoncãWorker ã¹ã¯ãªãããªã)ã§ãVite ã dist/ ã«ãã«ãããææç©ã Cloudflare ããã®ãŸãŸé
ä¿¡ããŸããæ¬çª URL 㯠https://spinward.toming.app/ ã§ãã
ãããã€ã¯ Cloudflare Workers Builds(Cloudflare åŽã§ GitHub ãªããžããªã«æ¥ç¶)ãæ
ããŸããmain ãžã® push ã§ãã«ãïŒæ¬çªãããã€ãèªåå®è¡ãããPR ã§ã¯æ€èšŒçšãã«ããèµ°ããŸã(PR ã® Workers Builds: spinward ãã§ãã¯)ãGitHub Actions(.github/workflows/ci.yml)㯠bun test ãš bun run build ã®å質ã²ãŒãã®ã¿ã§ããããã€ã¯ããŸããã
æå ããæåã§åæ ãããå Žå:
bun run deploy # = bun run build && wrangler deployåå㯠wrangler login(ãŸã㯠CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID ãç°å¢å€æ°ã«èšå®)ããŠãã ãããWorker name 㯠wrangler.jsonc ã® spinward ã§ãã
OGP 㯠index.html ã®ã¡ã¿ã¿ã°(og:/twitter:ãcanonical 㯠https://spinward.toming.app/)ãš public/og-2026-09.jpgïŒæ®åœ±ã¯ ~/spinward-bench/shoot-og.mjsïŒcompose-og.pyã»ãã¡ã€ã«åã®æ¥ä»ã¯SNSåŽã®OGPãã£ãã·ã¥åé¿ã®ããå·®ãæ¿ãæã«å€ããïŒ(1200Ã630 ã®ãœãŒã·ã£ã«ã«ãŒã)ã»public/favicon.png ã§æ§æããŠããŸããã«ãŒãç»åã¯å®ã²ãŒã ã®ããŒããŒã·ã§ããã«ã¯ãŒãããŒã¯ãåæãããã®ã§ããããã·ã¥ä»ãã¢ã»ãã(/assets/*)ã«ã¯ public/_headers ã§ immutable ãã£ãã·ã¥ãå¹ãããŠããŸãã
- WebXR ã®
immersive-vr㯠HTTPS ãå¿ èŠã§ãã - Vite ã®éçºãµãŒããŒã¯èªå·±çœ²åèšŒææžãªã®ã§ãQuest åŽã§èšŒææžèŠåãåºãå ŽåããããŸãã
- 確å®ã« VR ãã¿ã³ãæå¹åããããªãã
dist/ãæå¹ãª HTTPS èšŒææžãæã€ãã¹ãã£ã³ã°ã«é 眮ããŠãã ããã
- VR: 峿ã ããççæãšææ²ãæ åœããŸããäœããªã空éã§å³ããªã¬ãŒãåŒããšæå ã«çãçæãããã®ãŸãŸæŽã¿ãŸãã
- VR: ãã³ã¢ãŒã·ã§ã³ã¯ãå·ŠæïŒç§»åã峿ïŒäžçãAïŒäžã»BïŒã¡ãã¥ãŒ(äž¡æå ±é)ããå šãã€ã³ããšæå㯠docs/vr-controls.md ãåç §ã
- VR:
groundedäžã¯å·Šã¹ãã£ãã¯ã§æ©ããŸããå·Š grip ãæ¡ã£ãŠæãå£é¢ã«æ²¿ã£ãŠåãããšãã¯ã©ããã§ç»æïŒåŒãå¯ãã§ããŸã(æå ã«åºãå°ããªè»žãšã©ã€ã³ãçžå¯Ÿå ¥åã瀺ããŸã)ãA ãã¿ã³(å·Šå³ã©ã¡ãã§ã)ã§free-flyãžé¢éžããŸãã - VR:
free-flyäžã¯å·Šããªã¬ãŒ(å·Šã³ã³ãããŒã©ã®æãæ¹åãžãã¢ããã°ã»ã¹ãããã«)ãšå·Šã¹ãã£ãã¯ã§æšé²ããA é·æŒãã§äžæããŸããåãã¯å³ã¹ãã£ãã¯ã® snap turn ã§å€ããŸãã - VR:
free-flyäžã¯å·Š grip ãæ¡ããšåæ¢(ã¢ããã°ã®ãã¬ãŒã)ããŸããæ¢ããã®ã¯çŽç·ããªããã ãã§ãèªè»¢ Ï ã¯ä¿æãããããã³ãããŒã¯èŠçã§åããå®å®ãããŸãŸã§ãã - VR: å·ŠæéŠã«ã¯ wrist UI ãåžžæè¡šç€ºãããŸãã峿ã¬ãŒã¶ãŒã§çããå³ããªã¬ãŒã§
rpm / radius / throw / jetpack / reattachã倿Žã§ããŸãã - VR: wrist UI(PC ã§ã¯
?debugã® GUI)ããjetpack thrustã調æŽã§ããŸãã - VR: wrist UI ãã
Playground / Izma / Cooper / Elysiumpreset ã峿é©çšã§ããŸããé©çšæã¯ habitat ãš Rapier scale ãåæ§ç¯ããçãã¯ãªã¢ããŠå å£äžå€®ãž respawn ããŸãã - VR: wrist UI ã® Travel ãã
Surface / Overlook / Axis / Exteriorã® 4 å°ç¹ãžã¯ãŒãã§ããŸãã - VR: wrist UI ã¯
-- / - / + / ++ã® 4 ãã¿ã³ã§ fine/coarse ãåããŠããŸããrpm㯠3 æ¡æå¹ãradiusã¯å€§ã㪠habitat ã§ãæå¹æ¡ããŒã¹ã§ step ãèªåã§å€ãããŸãã - VR: å³ã¹ãã£ãã¯å·Šå³ã®
snap turnã¯grounded/free-flyã®äž¡æ¹ã§å¹ããŸãã峿ã®ããªã¬ãŒ(ææ²ã»UI)ãšã¯ç¬ç«ã§ãã - VR: çã®ããªã¬ãŒãé¢ããšæŸããŸããæãé床ã¯å³æã®çžå¯Ÿéåãšåæ¹ãã£ãŒãžããæ±ºããŸãã
- VR: çã¯ããªã¬ãŒé·æŒãã§åæ¹ãã£ãŒãžãããçæŒãã§ã¯ãã¬ãŒã€ãŒã«å¯ŸããŠçžå¯Ÿé床 0 ããå§ãŸããŸãã
- VR: çãæ¡ã£ãŠããéã¯ããã£ãŒãžéã«å¿ããŠè²ããªã¬ã³ãžããæ°Žè²ãžå€ãããŸãã
- VR/PC: çã¯å»ºç©ã«åœãããšè·³ãè¿ããŸã(建ç©ã¯å転系ã§éæ¢ããŠããã®ã§ãå転系ã®çžå¯Ÿé床ã§åå°ããŸã)ã
- VR/PC: çã¯ã·ãªã³ããŒéå£éšããå€ãžæããããŸãã
- VR/PC: ãã¬ã€ã€ãŒãç«¯ã§æ¢ãŸããããã®ãŸãŸéå£éšã®å€ãžåºãããŸãã
- VR/PC:
free-flyäžã§ããå å£ãžäœéã§æ»ãã°èªç¶æ¥è§Šã§groundedã«æ»ããŸãã - VR/PC:
free-flyäžã¯ãæå¯ãã®å å£ãããã³ã°äœçœ®ãžäŒžã³ã in-world guide ãåºãŸããreadyã§ç·ããã以å€ã¯éã§ãã - PC: ãã£ã³ãã¹å·Šã¯ãªãã¯ã§çãåæ¹ãžæããŸãã
- PC:
Spaceã§ãžã£ã³ãããŸãã空äžã§ã¯äœãåŒããªãã®ã§ãåºã®ã»ããæ²ãã£ãŠè¿ãã«æ¥ãŸããçå°ãããšèªåã§groundedã«æ»ããŸããå©èµ°ã®éåéã¯ãžã£ã³ãåŸãä¿åãããŸãã - VR/PC: 空äžã§ã¯ãã«ã«ãè¡çªããŸãããã«ã®å±äžã«ã¯çå°ã§ããå±äžã®äžããã®ãŸãŸæ©ããŸããçžããèžã¿åºãã°èªç±èœäžã§ãã
- VR/PC: çå°æã¯èœäžé床ã«å¿ããŠèŠç¹ãæ²ã¿èŸŒã¿ãããã§æ»ããŸã(èã®ã¯ãã·ã§ã³)ã
- PC:
1 / 2 / 3 / 4ã§ å°è¡š / 屿å°ç¹ / 軞端 / ã³ãããŒå€ ãžã¯ãŒãããŸã(ç»é¢äžã® Travel ãã¿ã³ã§ãåã)ã - PC: Throw ã¡ãã¥ãŒã§ Ball / Beam / Firework ãéžã¹ãŸãã
XãŸãã¯å³ã¯ãªãã¯ã§ãåãæ¿ããããŸããBall ã¯ã¯ãªãã¯ã§éåžž16m/sã茪ãéããåŸã¯ Speed ã¡ãã¥ãŒã§12m/sã® Slow ãéžã¹ãŸãã - PC:
Fã§å£ããé¢éžããŠfree-flyã«å ¥ããŸãã - PC: å
å£ã«ããéã¯
WASDã§æ©è¡ããŸããfree-flyäžã¯ KSP 颚ã®èŠç·åºæº 6DOF ãžã§ããããã¯ã§ãWASDã§ååŸå·Šå³ãSpaceã§äžæãShiftã§äžéããŸããQ/Eã®ããŒã«ã¯è§é床ããŒã¹(æŒããšå転ãç«ã¡äžãããé¢ããŠãæ°æ§ã§åãç¶ãã)ã§ãBã§ãã®ããŒã«ãæ¢ããããŸããgroundedã«æ»ããšèŠç¹ã¯èªåã§æ°Žå¹³ãžæ»ããŸãã - PC: ç»é¢ãå·Šã¯ãªãã¯ãããšããŠã¹ãèŠç·ã«è¿œåŸããŸã(Esc ã§è§£é€ã
?lock=0ã§ç¡å¹å)ãå³ãã©ãã°ãŸãã¯ç¢å°ããŒã§ãåããŸãã - éVR: ç»é¢äžã®ããã¯ã«ãã¹ãŠã®æäœ UI ãéçŽãããŠããŸããå·Šã¯ã©ã¹ã¿ã CONTROL(ãã㌠/ ã¿ããã§æäœã«ãŒããæ°ç§è¡šç€ºãããŠæ¶ãã)ã»preset ããããããŠã³ã»ã¹ããŒã¿ã¹ããããå³ã¯ã©ã¹ã¿ã Travel(Surface / Overlook / Axis / Exterior)ã»Spin â/+ã»ãã«ã¹ã¯ãªãŒã³ã»VR ãã¿ã³ã§ãã现ããèšå®(ååŸã»å
šé·ã»ã¹ããŒã»ãžã§ããããã¯ã»ãªã¢ã¿ããã»æŒå€ãµã€ã¯ã«é·ãªã©)ã¯
?debugã® GUI ã«ç§»ããŸããã - ã¹ãã: ç»é¢å·ŠåŽã®ã¿ãããããŒãã£ã«ã¹ãã£ãã¯(æ©è¡ / free-fly æšå / é転)ãå³åŽã®ãã©ãã°ã§èŠç·ãå³åŽã¿ããã§ææ²ã§ããäžéšã®ãã¿ã³åã« Jumpã»Drive(è»ã®è¿ãã§åºçŸãä¹è»äžã¯ Exit ãš Brake)ã»Gyro(ãžã£ã€ãèŠç¹)ã䞊ã³ãTravel ãš Spin ã¯ããã¯ã®ãã¿ã³ã䜿ããŸãã
- ã¹ãã: æç»ã¯ã¢ãã€ã«å質(pixelRatio äžé 1.75ãå»ºç© 6000 æ£ãé² 50%)ã«èªå調æŽãããŸããçå°ãè¡çªã§è»œãæ¯åãã£ãŒãããã¯ãå ¥ããŸã(Android)ãããŒã ç»é¢ã«è¿œå ããã°ãã«ã¹ã¯ãªãŒã³ã® PWA ãšããŠèµ·åããŸãã
- HUD ã¯ããã¯å·Šã¯ã©ã¹ã¿ã®ãããåã§ã: preset(ã¿ããã§åæ¿)/ felt gã»é床 / Ï rpm / mode / balls / Throw ã¡ãã¥ãŒ / æååŸã® Speed ã¡ãã¥ãŒ / free-fly äžã®ã¿ reattach è·é¢ãPCã®ç®ç·ã¯1.8mãã¹ããã¯1.6mã§ãããããã°æ°å€ãèŠãããšã㯠URL ã«
?debugãä»ããŸãã - é³é¿(å
šåæãã¢ã»ãããªã):ããã¿ããã®ç°å¢é³ãã¹ããŒ/ããŠã³ã/ãžã£ã³ã/çå°/UIã¯ãªãã¯ã®SFXãååæäœã§æå¹åããã
Mã§ãã¥ãŒãã§ããŸããããŒã«ã®ããŠã³ãé³ã¯è¡æãšè·é¢ã§æžè¡°ããŸãã - èµ·åæã«ã¯ã¹ãã©ãã·ã¥(SPINWARD)ãåºãŠãããŒãå®äºã§ãã§ãŒãã¢ãŠãããŸã(åæåã«å€±æããå Žåã¯ã¹ãã©ãã·ã¥äžã«ãšã©ãŒãš RELOAD ãã¿ã³ãåºãŸã)ãlil-gui ã®ãããã°ããã«ã¯ URL ã«
?debugãä»ãããšãã ã衚瀺ãããŸãã - GUI(
?debug):radius,rpm,surface g,span,simScale,preset,throw scale,jetpack,reattachéŸå€ãå³äžã§ç¢ºèª/調æŽã§ããŸãã - GUI:
observerã§colony-fixed / inertial-fixedãåãæ¿ããããŸããinertial-fixedã¯çŸåš PC åãã§ãXR äžã¯èªåã§colony-fixedã«æ»ããŸãã - GUI:
trail modeã§Rotating / Inertial / Bothãåãæ¿ããããŸãã - GUI:
frame errã¯å転系é床差åããèŠç©ãã£ãå é床ãšãæ¬äŒŒåèšç®ã®ãºã¬èŠåãããå€ã§ãã - HUD:
free-flyäžã¯ reattach ãããã«ãå å£åæ¥å°ãŸã§ã®æ®ãè·é¢ãšreadyç¶æ ãåºãŸãã - GUI(
?debug): 远跡çã«ã€ããŠv_inertial,v_rot,a_fictitious,a_rot_est,errã確èªã§ããŸãã誀差ããããå€ãè¶ ãããšFrame mismatch!ãåºããŸãã - å·Šæã¯ locomotion å°çšã§ãççæãšææ²ã¯å³æã«éçŽããŠããŸãã
- ã¹ããŒã³ã®é£ã«è»ãé§è»ããŠããŸããè¿ã¥ããŠ
Eã§ä¹è»ãW/Så æžéã»A/Dã¹ãã¢ã»Spaceãã¬ãŒãã»Eéè»ã - è»ã¯ãã¬ã€ã€ãŒã®ãããªãå£ãžã®åŒµãä»ããã§ã¯ãªããæ £æ§ç³»ã®åäœãšããŠå転å£ããã«ã«ä¹ãã人工éå(å ±å転ã®é å¿å)ã§èªç¶ã«æ¥å°ããŸãã
- ã°ãªããã¯æ³ç·è·éã«æ¯äŸ(
grip = g/9.8)ããŸããã¿ã€ã€ã®å éã»å¶åã»æåã»æšªæ»ãæå¶ãã¹ãŠã衚é¢éåã§ã¹ã±ãŒã«ãããããèµ°è¡äžã« RPM ãäžãããšã°ãªãããæããŠæ»ãåºããŸãã空äžã§ã¯ã¿ã€ã€ã¯ç¡åã§ãã - é§è»äžã¯ããããã£ãã¯å ±å転ãé転äžã®ã¿åçããã£ã«ãªããŸãã建ç©ãšã®è¡çªã¯ç°¡æ(æŒãåºã+æžé)ã§ããVR ããã¯çŸç¶èгè³ã®ã¿(é転㯠PC)ã
- ã·ãªã³ããŒäžå¿è»žãšé·ææ¹åã¯
+YãååŸæ¹åã¯XZå¹³é¢ã§ãã - è§é床ãã¯ãã«ã¯
Ω = (0, Ï, 0)ã§ãã - 人工éåã®ç®å®ã¯
g = Ï^2 Rã§ãã - ããã§ã®
1Gã¯ãå å£äœçœ®ã§ã®å±æçãªé å¿å é床ã®å€§ãããã§ããå°ååŸã»é«rpmã§ã¯ Earth ã®äžæ§éåãšã¯èŠãæ¹ãããªãéããã³ãªãªãªã匷ãåºãŸãã - Rapier world ã¯æ £æ§ç³»ã§åãããŠããŸãã
- å転座æšç³»ã¯è¡šç€ºãå ¥åè§£éããããã°å¯èŠåã®ããã®å€æå±€ã§ãã
- èšå®ã HUD ã«åºã寞æ³ã¯
realã¡ãŒãã«ç³»ã§ãã - Rapier world ã«æž¡ãäœçœ®ãé床ãcollider 寞æ³ã¯
sim = real * simScaleã§ãã - æç»ãšå転座æšç³»å€æã¯
realåŽã§çµ±äžããŠããŸããRapier å¢çã ããsimãæ±ããŸãã - åäœå€æã¯ src/units/units.ts çµç±ã®ã¿ã§ãã
- Rapier ãšã®å¢ç㯠src/physics/rapierBoundary.ts ãžéçŽããŠããŸãã
- runtime åŽã§ã¯ raw
simScaleãçŽæ¥ã°ãæãããUnitsContextãçæã㊠boundary API ãžæž¡ããŸãã - çãš
free-flyãã¬ã€ã€ãŒã®å éšç¶æ ã¯æ £æ§ç³»ã§ä¿æããæç»æã«åè»¢ç³»ãžæ»ããŠããŸãã groundedãã¬ã€ã€ãŒã ãã¯å 壿æããžãã¯ã䜿ããŸãã- Trail 㯠2 系統ãããŸãã
Rotating: ã³ãããŒèŠ³æž¬è åºæºãªã®ã§æ²ãã£ãŠèŠããŸããInertial: æ £æ§èŠ³æž¬è åºæºãªã®ã§ã壿¥è§Šããªããã°çŽç·ã«è¿ãèŠããŸãã- å転座æšç³»ã§äœ¿ãèŠããã®å é床ã¯ä»¥äžã§ãã
a_c = -2 (Ω à v)
a_cf = -(Ω à (Ω à r))
- Playground Colony: ååŸ
18m, å šé·120m,5rpm,simScale 1 - Izma Colony: ååŸ
3200m, å šé·40000m, åšæ113.5s,0.5286rpm,simScale 0.02 - Cooper Station: ååŸ
3200m, å šé·32000m,0.5rpm,simScale 0.02 - Elysium: ååŸ
30000m, ãªã³ã°åã¿2000m, åšæ348s,0.1724rpm,simScale 0.005 - Elysium ã¯çŸåšã® traversal ãš collider ãä¿ã€ãããèŠãç®ãšæ¥è§Šã¯ãçã axial band ãæã€ ring è¿äŒŒããšããŠæ±ã£ãŠããŸãã
Surface: åçäžå€®ã®å å£ãã©ã¶ãžæ»ããgroundedã§éå§ããŸããOverlook: ãã©ã¶äžç©º(ååŸã® 1/2ã8ã60m ã«ã¯ã©ã³ã)ãžå ±åè»¢ç¶æ ã§åºãŸãã匱ãé å¿ãéåãã§ãã£ããèœäžããçå°ãããšèªåã§groundedã«æ»ããŸããAxis: cylinder ã§ã¯å®å®æž¯ã®ãã âY 端(ãã©ãŒã®æ ¹æ¬åŽ)ã®å転軞äžãring ã§ã¯ãªã³ã°äžå¿ãžæ»ããfree-fly0g ã§éå§ããŸããExterior: ã³ãããŒå€æ®»ã®å€(å ±å転ã»free-fly)ãžåºãŠãæ¡å çªãšãã©ãŒãåããå転äœã®å šæ¯ãçºããŸãããžã§ããããã¯ã§ãã®ãŸãŸè¹å€éæ³³ã§ããŸãã
- O'Neill åã« 3 æ¬ã®å°è¡šã¹ããªãããš 3 æ¬ã®æ¡å çªã¹ããªããã亀äºé 眮ããã¹ããŒã³å°ç¹åšèŸºã¯ãã©ã¶ãšããŠç©ºããŠããŸãã
- æ¡å
çªã¯æ¬ç©ã®éå£ã§ããå
å£ã·ã§ã«ããçªã®å匧ãåãæã(
subtractArcIntervals)ãçªè¶ãã«æç©ºãšãå€åŽã® 3 æã®å€ªéœãã©ãŒãèŠããŸãããã©ãŒã¯ Island Three æ¹åŒã§ãçåŽã®ç«¯éšã«ãã³ãžããŠè»žã«å¯Ÿã㊠45° ã«åŸããé·å€§ãªãã¿ã«ã§ã(軞æ¹åã«å±ã倪éœå ã 90° æ²ããŠçªãžå ¥ãã configuration ã§ãçªäžå¿æ¹äœããã®å€ªéœå DirectionalLight ãšæŽåããŸã)ãã·ã§ã«ã®é«åå²ã¢ãŒã¯ã¯éååãããã©ãŒã«ã¹è§ã§åæ§ç¯ããUV ã¯çµ¶å¯Ÿè§åºŠã§ãã€ã¯ããã®ã§ç¶ãç®ãªãã°ãªãããç¶ããŸãã - 倪éœå ã¯çªããå·®ããŸããçªã®äžå¿æ¹äœããå åãã® DirectionalLight Ã3(ã³ãããŒåºå®)ã§ã建ç©ã«çªç±æ¥ã®é°åœ±ãã€ããŸãã
- 建ç©ã¯åŽé¢ã«çªæãããã¯ã¹ãã£(emissiveMapã屿 ¹ã¯ç¡å°)ãæã¡ãå€ã®è¡åºãèªç¶ã«å ããŸãã
- è¿æ¯å»ºç©ã¯ Blender è£œã®æ¥æ¬éœåžããã:æžå»ºãŠã»äžå±€äœå®
ã»è€åã¹ã©ãã»ã¿ã¯ãŒã®4系統ã GLB ããäžåºŠã ãèªã¿èŸŒã¿ãLOD0(ãã©ã³ãã»åºã»çªæ Œåã»å®€å€æ©ã»çžŠçæ¿ã»å±äžèšå)ãš LOD1(ç°¡ç¥ã·ã«ãšãã)ãã¢ãŒãã¿ã€ãåäœã® InstancedMesh ã§é
眮ããŸããGLB ãèªããªãå Žåã¯æç¶ãçæå»ºç©ãžèªåãã©ãŒã«ããã¯ããŸããç·šéãœãŒã¹ã¯
assets/blender/spinward-buildings.blendãåçæã¹ã¯ãªããã¯assets/blender/build_spinward_buildings.pyã - çŽ æåçã¯åœ¢ãšå¯åºŠã®è³æãšããŠäœ¿ããåçãã¯ã¹ãã£ã¯çŽæ¥è²ŒããŸãããå®åšåºèã»äœæãé¿ããæ¶ç©ºã®äœã³ã³ãã©ã¹ãçæ¿ãšãæ¢åã®æç¶ãçæå€å£ãçµã¿åãããå埩ããæ±ãã人ç©ãå€å£ãžçŒãä»ãäžå¿«ããé²ããŸãã
- ãšã¢ãããŒã¹ãã¯ãã£ã:
FogExp2ãååŸé£åã®æ¿åºŠã§é©çšããå察åŽã®è¡ãéã¿ãŸã(æç©ºã»ãã©ãŒã¯ fog 察象å€)ãã¬ã³ãã©ã¯ ACES Filmic ããŒã³ãããã³ã°ã - æŒå€ãµã€ã¯ã«(ããã©ã«ã 180 ç§/åšãGUI ã®
day cycle (s)ã§å€æŽã»0 ã§åæ¢):æŒã¯ãã©ãŒãèŒããŠçªãã倪éœå ãå·®ããå€ã¯ãã©ãŒãéãæ²ã¿ã建ç©ã®çªæãããšè¡ç¯ã䞻圹ã«ãªããŸããé§ã»èæ¯è²ã»è»žã¹ãã€ã³ãé£åããŸãã - é²:å°è¡šããã®é«åºŠããŒã¹(å°åããã¿ããã§ã¯ååŸæ¯ã倧åã§ã¯é«åºŠ ~1.1ã1.9km ã«ã¯ã©ã³ã)ã§åå¹³ãªé²å¡ãæµ®ãã³ããã£ããå°è¡šã«å¯ŸããŠæµããŸã(InstancedMeshãæ±ºå®è«ã·ãŒãé 眮)ã
- åå°è¡šã¹ããªããã«ã¯ é路網ãæç¶ãçæ ããŸãã軞æ¹åã®ã¢ããã¥ãŒãšåšæ¹åã®ã¯ãã¹ã¹ããªãŒããè¡åº(ãããã¯)ãåºåãã建ç©ã¯åãããã¯ã®å€åšã«ãéè·¯ã«é¢ããŠã䞊ã³ãŸã(ããªã¡ãŒã¿ãŒãããã¯æ¹åŒ)ãéè·¯ã°ãªããã¯æ§é çã«æ±ºãŸãã建ç©é 眮ã ãã seed äŸåã§ããéè·¯ã¯å¹¹ç·(6ã24m)ãšç掻éè·¯(4ã8m)ã®2éå±€ã§ã絶察ã¡ãŒãã«ã«ã¯ã©ã³ãããçŸå®çãªå¹ ã§ã(ã¹ããªãã端+äžå®ééã®éè·¯ãå¹¹ç·ãè¡ç¯ãšçªãæž¡ãæ©ã¯å¹¹ç·ã«åŸããŸã)ãè·¯é¢ã¯ã¬ãŒã³ããŒãã³ã°ä»ãã®ã¢ã¹ãã¡ã«ã(å¹¹ç·=çœãšããžã©ã€ã³+é»è²ã»ã³ã¿ãŒã©ã€ã³+ç Žç·ã¬ãŒã³ç·ãçæŽ»=ãšããžã©ã€ã³ã®ã¿)ã§ãUV ãéè·¯æ¹åã«ãã€ã¯ããŠå®å¯ž 12m åšæã§ããŒãã³ã°ãæµããŸããæ©ã®ãããã«ãå¹¹ç·ããŒãã³ã°ãä¹ããŸããã¹ããŒã³ã®ããŒã«ãŒã¯éãçæ¿ããæ§ãããªã·ã¢ã³ãªã³ã°ã®è·¯é¢ã€ã³ã¬ã€ã«å€æŽã
- è¿æ¯å»ºç©ã¯å°åºããšã®å»ºç¯èšèªãæã¡ãŸã: æ§åžè¡(枯端)㯠Kenney City Kit Commercial ã®ã¬ã³ã¬ã»åºä»ãäœå±€(æ·å°ãžäŒžçž®ã»LODãã¢å梱)ãéå€ã®æžå»ºãŠã¯ Kenney City Kit Suburban(ãã£ããŒã«ä¿è·ã®ããçæ¹ã¹ã±ãŒã«+æ·å°å
ã»ã³ã¿ãŒ=äœçœãåºã«ãªã)ãCBD ã¯åŸæ¥ã® Blender è£œæ¥æ¬ãããããããã CC0(kenney.nl)ã§
public/assets/buildings/kenney/ãGLB æ¬ ææã¯æ¥æ¬ãããâæç¶ãçæãžèªåãã©ãŒã«ããã¯ããŸãã - ãã¬ã€ã€ãŒåšèŸº(ç«¯æ« Tier ã§ 130ã240m)ã®è·¯é¢ã«ã¯ Kenney City Kit (Roads) ã®ã¿ã€ã«ãªãŒããŒã¬ã€(CC0ã
public/assets/roads/ãã¯ã¬ãžãã: kenney.nl)ãæ·ããŸããçžç³ã»æ©éã»è»ç·ä»ãã®çŽç·ã¿ã€ã«ã«å ãã亀差ç¹ã¯ãœã±ããç §åã§ åå/Tå/è§ ãéžãã§å転é 眮ã(å¹¹ç·ã®æ¥ç¶éšã¯ãŒãã©ã¿ã€ã«)ãåç(Ξ,z)ãã¡ã€ã³ã«åãããŠåšæ¹åã®èµ°è¡ã¯ãµãžãã¿ãèŠããªããããã«åå²ããŸããå¡è£ è·¯é¢ã¯å šåã®é æ¯ LOD å Œãã©ãŒã«ããã¯ãšããŠãã®ãŸãŸæ®ããæ²çãåã€å°åŸãã©ã (ååŸ 300m æªæº)ã¯ãªãŒããŒã¬ã€ãæ·ããŸããã - ã¹ããŒã³åšèŸº 260m ã ããæ¥æ¬çãªããŒããŒè¡åºãšããŠæ±ããçæŽ»éè·¯ã«é»æ±ã»å€å§åšã»3æ¬ã®ããã¿é»ç·ã远å ããŸããå šåžãžå±éãããé æ¯ã§ã®ç·ã®ã¡ãã€ããš Quest ã®æç»è² è·ãæããŸãã髿¶éè·¯ã®ç®±æ¡äžé¢ã«ã¯ãé£ç¶ããäœããªãŽã³ã®èšåé 管ã1ãããã§è¿œå ããŸãã
- ããŒããŒè¡åºã®ãã¡è¿æ¯ 180m ã§ã¯ãBlender 補ã®åºèã·ã£ãã¿ãŒã»ã¬ã©ã¹åºèã»èªè²©æ©ã»å®€å€æ©/é 管ã»èªè»¢è»ã»ãã©ã³ã¿ãŒè·¯å°ãå®åšããéè·¯åŽã®å»ºç©åã ãã«æå€§96çµé 眮ããŸããLOD0 ãšäžç·ã«æ¶ãã6ãããã® InstancedMesh ãšããé æ¯ãžçްç©ãã°ããŸããæ¥æ¬ã®è¡è·¯å¯åºŠãåºããŸããã¹ããã¯LOD0ã120mã»æå€§96æ£ãLOD1ã260mã»æå€§320æ£ã«å¶éããŸãã
- äžå¿éšãšåšçžéšã®å¯åºŠåŸé ã¯æå³çã«æ¥µç«¯ã§ããã³ã³ãã¯ã㪠CBD ã¯è¡åºå ã4éã®å»ºç©åã§åããé«å±€åã»é«å å¡«çãåæã«æããŸããéå€ã¯2ã3åãæå€çžã¯é路沿ã1åã®äœå±€ã ããæ®ãã蟲å°çãæå€§78%ãŸã§äžããŸããé路網ã¯é£ç¶ãããŸãŸãªã®ã§ã屿å°ç¹ãããéœå¿ã®å¡âçãªåšçžããèªããŸãã
- 建ç©LODã¯æ¹äœè§ã ãã§ãªããåšæ¹åè·é¢ãšè»žæ¹åè·é¢ãåãããå°è¡š2次å è·é¢ã§å€å®ããŸããè¿æ¯GLBãç°¡ç¥GLBãæç¶ãçæã¢ãŒãã¿ã€ããé æ¯ç®±ãããã®4段éã§ã12%ã®ãã¹ããªã·ã¹ãšç«¯æ«å¥ã€ã³ã¹ã¿ã³ã¹äžéãæã¡ãŸããé æ¯ã®ç»é¢ãµã€ãºã«ãªã³ã°ã¯åçå ã® chord è·é¢ãšè»žæ¹åè·é¢ã§å€å®ããŸãã
- 建ç©ã®é«ã㯠1G 垯ã«ã¯ã©ã³ã:人工éåã¯
g(h) = gâ(1 â h/R)ã§é«åºŠãšãšãã«åŒ±ãŸããããåžžçšå»ºç¯ã¯å°è¡šè¿ãã«åŒµãä»ãã¯ãã§ãã建ç©é«ããæå€§ 78m ã«çµ¶å¯Ÿã¯ã©ã³ããã巚倧ããã¿ããã§ã衚é¢éåã®æ° % 以å ã«åãŸããŸãã倧å建ç©ã¯é«å¯åºŠã®çªãã¯ã¹ãã£ã䜿ããçªã巚倧åããŸããã - 建ç©ã®ããªãšãŒã·ã§ã³:æç¶ãçæåŽã¯ç®± / 段ç¶ã»ãããã㯠/ å «è§åœ¢ã¿ã¯ãŒ / ãã©ããã屿 ¹ã®äœå±€ / ããã£ãŠã ä»ãã¹ã©ã / L忣ãæã¡ãçš®é¡ããšã« InstancedMesh ãããå(å£=çªãã¯ã¹ãã£ã»å±æ ¹=ç¡å°ã®ãããªã¢ã«ã°ã«ãŒã)ãè¿è·é¢ã§ã¯å¯Ÿå¿ãã Blender ã¢ãŒãã¿ã€ããžå·®ãæ¿ãããŸãã
- å€éãªã³ã°é 眮:è¡åºã¯å€åšããäžå¿ãžåãã1ã4ãªã³ã°ã®å»ºç©åãè·¯å°ãæãã§å ¥ãåã«ãªããæ®ã£ãäžåºã¯ç·å°ã«ãªããŸãããªã³ã°æ°ã¯éœåžåçã«é£åããã¹ããªãã䜿çšç 94%ãå¯åºŠäžé 12000 æ£ã
- ãããã¯çšéåã:è¡åºã®äžéšã¯æ±ºå®è«çã«å ¬å(ç·å°+instanced ã®æš¹æš)ã蟲å°(äœç©ã¹ãã©ã€ã)ã«ãªããäœå® åºã¯ãããŸã§éãéè·¯ã«é¢ãã建ç©ã䞊ã³ãŸãã
- è¡ç¯:ã¢ããã¥ãŒæ²¿ãã«æè²ã®ç¯ããçééã«æµ®ãã³ãŸã(InstancedMeshãäžéãã)ã
- 屿ã¿ã¯ãŒ:ãã©ã¶èã« Overlook ã¯ãŒãé«åºŠã®ããäžãŸã§å±ã芳枬å¡(ããã+ã¢ã¯ã»ã³ããªã³ã°)ãæ©è¡ã»ããŒã«è¡çªä»ãã§ãOverlook ããã®èœäžæã®èŠèŠåºæºã«ããªããŸãã
- 軞ãšã¬ããŒã¿ãŒã±ãŒãã«:åå°è¡šã¹ããªãããã軞ã¹ãã€ã³ãž 2 æ¬ãã€ã±ãŒãã«ã䌞ã³ãå°è¡šãšè»žãã€ãªãã¹ã±ãŒã«æãåºããŸãã
- 端éšãã£ãã:䞡端éå£éšã«ãªã ãªã³ã°+ãããªã³ã°+æŸå°ã¹ããŒã¯ã®ãããã³ã°æ§é ãäžå€®ã¯éãããŸãŸãªã®ã§å€ãžã¯åºãããŸãã
- å®å®æž¯(âY端=ãã©ãŒã®æ ¹æ¬åŽ):å転é床ãŒãã®è»žã§ãããããã³ã°ã§ããªãããšããåè»¢å± äœåºã®å¿ ç¶ããã®ãŸãŸæ¯èгã«ã軞äžã®ãããã¥ãŒã(倧åããã¿ããã§ã¯å éšã«å ¥ããå°çãã€+èªå°ç¯ã¹ããªãã)ã4æ¬ã®ãããã³ã°ã¢ãŒã ã人éã¹ã±ãŒã«(å šé·18m)ã®ã·ã£ãã«2æ©ãæ¥è·ã1æ©ãè»žã«æ²¿ã£ãŠãã£ããé²å ¥ããŠããŸããããã©ã€ããç¹æ» ããŸããâ¢Axis ã¯ãŒãã®å°çå°ããã®æž¯ã§ãã
- äžå¿è»žã«ã¯çºå ã¹ãã€ã³(軞æ§é ç©)+ãªã³ã°æ§é ãèµ°ãããäžãèŠããšå察åŽã®è¡ãã匷調ããŸãã
- æ©è¡äžã®å»ºç©è¡çªã¯è¡šé¢2D空éã®è§£æå€å®(
resolveCitySurfaceCollision)ã§åŠçããéè·¯ã¯æ©è¡å¯èœã§ããããŒã«ã¯å転系ã§ã®çâOBBè§£æè¡çª(collideSphereWithBuildings)ã§å»ºç©ã«åœãã£ãŠè·³ãè¿ããŸã(屿 ¹ã»åŽé¢ã»åŠ»é¢ãã¹ãŠ)ã - æ§ã»å€æ¯ãšããã·ããã¯ã¹ãã£(Night Surface / far-field)ã¯å®å»ºç©ã®è¡ã«çœ®ãæããããæ€å»æžã¿ã§ãã
nearLayerã«è¿æ¯ãskyLayerã«æç©ºãåããäž»å å£ã¯ near/far shell ãšããŠæç»ããŸããfarLayerã¯å°æ¥ã®é æ¯è¡šçŸçš scaffold ãšããŠæ®ããŠããŸãããéåžžãã¬ã€ã§ã¯äœ¿ã£ãŠããŸããã- å å£ shell ã«ã¯ procedural ã® surface texture ã貌ã£ãŠããŠãçŽ 10m çŽã®ããã«ç¶ãç®ãš 40m çŽã®å€§åºç»ãç¹°ãè¿ã衚瀺ããŸããã¢ã»ãããå¢ããããæ¥å°é¢ã®è·é¢æãåºãæå³ã§ãã
- äž»å å£ã®æç»ã¯ near/far shell ã«åããŠããŸãããã¬ãŒã€ãŒåšèŸºã®å å£ã¯é«åå²ãé æ¹ã¯äœåå²ã® shell ã«ããŠãè¿æ¯ãåªå ãã€ã€é æ¹ã³ã¹ããæããŠããŸãã
- åºå®ç© collider ã¯çŸåšã»ãŒäœ¿ã£ãŠããŸãããäž»å
å£ã¯çãš
free-flyãã¬ãŒã€ãŒã®è§£ææ¥è§Šãäž»ã«äœ¿ããŸãã
real: èšå®ãããªã»ãããHUDãGUIãwrist UIãæç»ãå転系/æ £æ§ç³»å€æã§äœ¿ãã¡ãŒãã«åºæºsim: Rapier world ã«æž¡ãäœçœ®ãé床ãcollider 寞æ³ã§äœ¿ãç©çåºæº- 倿ã¯
src/units/units.tsãšsrc/physics/rapierBoundary.ts以å€ã§ã¯è¡ããŸããã rpm / omega / period / surface gã®çžäºå€æãsrc/units/units.tsã«éçŽããŠããŸãã
simScaleãå€ãããææ²ã ã匱ããªã/匷ããªã: throw åæãrealã§ãªãsimã«æŒããŠããå¯èœæ§ããããŸããbun testã® throw/units ç³»ã確èªããŠãã ããã- preset ãå€ããã respawn äœçœ®ã ãããã: Rapier pose ãžã®æžã蟌ã¿ã boundary ãéã£ãŠããªãå¯èœæ§ããããŸããrespawn ç³»ãã¹ãã確èªããŠãã ããã
- observer mode ã trail ã厩ãã:
å転系/æ
£æ§ç³»ã®å€æåã«
simãæ··ããŠããå¯èœæ§ããããŸããæç»ãš frame transform ã¯åžžã«realåæã§ãã
- ã·ãªã³ããŒå å£ã¡ãã·ã¥ãšç°¡æã°ãªãã
- å å£ã®ã©ã³ãŠã§ã€é¢šã©ã€ã³
- éå£éšã®å€ã«èŠããå€ç©ºãšãå転æãåºãããã®å€éšæç©ºã®éå転衚瀺
- å転座æšç³»ã®äººå·¥éåãšã³ãªãªãª
- çã®ææ²ãäºéè»è·¡è¡šç€ºã30ç§ã§ã®èªåç Žæ£
- Rapier ã«ããçã®æ £æ§ç³»ã·ãã¥ã¬ãŒã·ã§ã³ãšãå転ããå å£ãžã®æ¥è§ŠåŠç
- çã ãã¯éå£éšããå€ãžåºãããã·ãŒã ã¬ã¹ãªå å€é·ç§»
- ãã¬ã€ã€ãŒã®
grounded / free-flyç¶æ åæ¿ãèªç¶æ¥è§Šã§ã®åã¢ã¿ãããå€åŽã§ã® Rapier ããŒã¹ hand-aim jetpack ç§»å - free-fly ãã¬ãŒã€ãŒã®
capsule + foot platecollider - å·Šæ wrist UIã峿 UI ã¬ãŒã¶ãŒãéVRç»é¢äžã®ããã¯(HUD ããã+Travel / Spin)
- å å£ shell ã® procedural texture
- æç¶ãçæã®åçéœåž(é路網+éè·¯ã«é¢ãã建ç©ãæ¡å çªã¹ããªããã軞ã¹ãã€ã³)
Playground / Izma / Cooper / Elysiumpreset ãšreal / simScaleåé¢Surface / Overlook / Axis / Exteriorã® 4 å°ç¹ã¯ãŒããšBall / Beam / Fireworkã®æå°åæ¿colony-fixed / inertial-fixedã® observer mode- å転系é床差åãšæ¬äŒŒåèšç®ã®æŽåãèŠã verification HUD
bun testã«ããã·ãã¥ã¬ãŒã·ã§ã³æ žã®åäœãã¹ã
GNU AGPL-3.0-or-later © 2026 tomingtoming.
Hobby project. Issues welcome, PRs not accepted: that keeps relicensing simple while there is a single copyright holder.
Third-party assets and libraries keep their own licenses: the road and vehicle models are by Kenney (CC0, License.txt beside each set), three.js is MIT, and Rapier is Apache-2.0.

