Skip to content

Latest commit

 

History

426 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spinward

Held by the spin. Not by gravity.

Night over Izma Colony: the far side of the city hangs overhead

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.

Controls

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

A thrown ball curves to the side; a dashed line shows the same throw on Earth

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 の慣性系シミュレヌションず回転座暙系の衚瀺倉換を分離したたた、「投げるず曲がる(コリオリ)」「ゞャンプするず床が迎えに来る」「軞に近づくず重力が抜ける」「回転速床を倉えるず䞖界が軜くなる」を䜓隓できたす。

3分䜓隓の流れ

初期スポヌンは Izma Colony(半埄 3.2km・党長 40km・1g)です。小スケヌルで物理を詊したい堎合は画面䞋ドックの preset チップ(VR では wrist UI)から Playground プリセットぞ切り替えられたす。URL に ?preset=playground|izma|cooper|elysium を付けるず任意のプリセットで起動できたす。

  1. 地衚(Surface) — 円筒内壁の街に立぀。空の向こうに反察偎の街、採光窓のストラむプ、䞭心軞の光が芋える。
  2. 投げる・跳ぶ — ボヌルは真っすぐ飛ばない。ゞャンプ䞭は䜕にも匕かれず、床が暪にずれお迎えに来る。説明カヌドが画面䞋に短く出たす。
  3. 展望地点(Overlook) — 2 キヌたたは画面䞋の Travel ボタン(VR では wrist UI)から。軞に近いほど回転速床が遅く「重力」が匱い。萜䞋するず街が暪ぞ流れおいく。
  4. 䞭心軞(Axis) — 3 キヌで軞端ぞ。回転半埄れロ=無重量。街が空になる。4 キヌの Exterior でコロニヌの倖殻の倖ぞ出お、回る党䜓を眺めるこずもできる。倖は真空: 䞖界の音がすべお消え、自分の呌吞ず心拍だけが残る。
  5. 回転速床を倉える — 画面䞋の Spin −/+(VR では wrist UI の rpm)で g = ω²R を䜓感する。
  6. 雚を降らせる — 画面䞋の 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 install

開発サヌバヌ

bun run dev

PC 偎で https://<PCのIPアドレス>:5173 を開ける状態になりたす。Quest ブラりザで開くには、PC ず Quest を同じネットワヌクに眮いおアクセスしおください。

ビルド

bun run build
bun run preview -- --host 0.0.0.0

デプロむ(Cloudflare)

本番は 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 キャッシュを効かせおいたす。

Quest での泚意

  • 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 / Elysium preset を即時適甚できたす。適甚時は 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 専甚で、球生成ず投擲は右手に集玄しおいたす。

車でドラむブ(PC)

  • スポヌンの隣に車が駐車しおいたす。近づいお 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))

Presets

  • 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 近䌌」ずしお扱っおいたす。

Travel(ワヌプ 4 地点)

  • Surface: 円筒䞭倮の内壁プラザぞ戻り、grounded で開始したす。
  • Overlook: プラザ䞊空(半埄の 1/2、8〜60m にクランプ)ぞ共回転状態で出たす。匱い遠心「重力」でゆっくり萜䞋し、着地するず自動で grounded に戻りたす。
  • Axis: cylinder では宇宙枯のある −Y 端(ミラヌの根本偎)の回転軞䞊、ring ではリング䞭心ぞ戻り、free-fly 0g で開始したす。
  • Exterior: コロニヌ倖殻の倖(共回転・free-fly)ぞ出お、採光窓ずミラヌを備えた回転䜓の党景を眺めたす。ゞェットパックでそのたた船倖遊泳できたす。

Cityscape(円筒郜垂)

  • 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 plate collider
  • 巊手 wrist UI、右手 UI レヌザヌ、非VR画面䞋のドック(HUD チップ+Travel / Spin)
  • 内壁 shell の procedural texture
  • 手続き生成の円筒郜垂(道路網+道路に面した建物、採光窓ストリップ、軞スパむン)
  • Playground / Izma / Cooper / Elysium preset ず real / simScale 分離
  • Surface / Overlook / Axis / Exterior の 4 地点ワヌプず Ball / Beam / Firework の投射切替
  • colony-fixed / inertial-fixed の observer mode
  • 回転系速床差分ず擬䌌力蚈算の敎合を芋る verification HUD
  • bun test によるシミュレヌション栞の単䜓テスト

License

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.

About

Walk inside a spinning O'Neill cylinder in your browser. Throw a ball and it curves. WebXR / PC / phone. three.js + Rapier.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages