【Three.js】現実時間と連動した、うちの子の日常【JavaScript, TypeScript】
| 空の色 | 太陽の色 |
|---|---|
操作方法
「タイムマシン」で指定した時間に変更できます。
季節の変化や特定のイベント(ねるなど)をすぐ見たい時に使ってください。
マウス(スマホの場合はタップ)でカメラを自由に動かせます。
マウス
右クリックしながらマウスを動かす:カメラの角度を変える
Shiftを押しながら右クリックしながらマウスを動かす:カメラの角度は変えずに位置を移動する
ホイール:カメラの位置を前後に移動する(拡大縮小)
タップ
指1本をスライドさせる:カメラの角度を変える
指2本をスライドさせる:カメラの角度は変えずに位置を移動する
指2本で広げたり縮めたりする:カメラの位置を前後に移動する(拡大縮小)
説明
これは、私の内面世界を形にした作品です。
現実時間と連動し、昼夜が移り変わる世界で、
私のオリジナルキャラクター(うちの子)が、日常を過ごします。
イメージとしては、キャラが生活している世界を、私たちがのぞき込んでいる?
「環境映像」、現実でも全国各地にある「ライブカメラ」に近いかもしれません。
タイトル
やさしくかがやく環境 - Gently Radiant Environment
スケジュール
07:00 おきる
09:00 ~ 09:40 あさごはん
17:00 ~ 18:00 よるごはん
19:00 ~ 20:00 おふろ
21:00 ねる
太陽
球面三角法を利用し、日時、緯度、赤緯から太陽の天頂角(高度角)と方位角を計算しています。
方位角は0°が北です。天頂から見て時計回りに0~360の値を取ります。
ただし、あくまで簡略化しており、現実とは誤差があります。
太陽、地球ともに完全な球体としています。
太陽と地球の距離は無限としています。
大気の屈折は考慮していません。
均時差は考慮していません。
歳差は考慮していません。
経度は0°固定にしました。時差はないものとしています。表示される時間は日本時間です。
経度は、季節ごとの太陽の高度の変化に影響を及ぼしません。
太陽の色 空の色
太陽の高度により空の色が変化します。
色は私のフィーリングで決めています。物理学的な計算はしていません。
表示されているのはHSV色空間での数値です。
H(色相)は0~360、S(彩度)は0~1、V(明度)は0~1の値を取ります。
太陽と環境光以外のライト
3つあります。
2つは太陽の高度が0°未満になったらつきます。もう1つは太陽の高度が-18°未満になったらつきます。
※太陽の高度が-18°未満になったら、太陽はオフになります。
負荷を減らすため、シーン内で同時に灯るライトは3つ(環境光を含むと4つ)までにしています。
-18°な理由は、それが空が完全に暗くなる高度らしいからです。
参考サイト:薄明 - Wikipedia アクセス日時: 2025/06/05 19:30
天分薄明 - Astronomical Twilight 高度: -18°~-12°
航海薄明 - Nautical Twilight 高度: -12°~6°
市民薄明 - Civil Twilight 高度: -6°~50'
空の色の仕組み
空の色は「天頂 中間 地平線付近」の3色のグラデーションになっています。
それらの色は、太陽の高度に応じて、変わります。
具体的には、それぞれの高度の閾値に色が設定されています。
現在の高度から、 どの色同士を混ぜるかを調べ、その色同士、色1と色2をどの割合で混ぜるか(係数)を決めます。
最終的な色は係数(factor)に応じた加重平均です。
例えば、以下はVer.0.2のでんきのくにの空色です。(HSV表記)
| 日の出 | 朝 | 昼 | 夕方 | 日の入り | 夜 |
|---|---|---|---|---|---|
| 0° | 12° | 90° | 12° | 0° | -18°以下 |
206, 0.45, 0.40 |
222, 0.60, 1.00 |
220, 0.70, 1.00 |
220, 0.60, 1.00 |
194, 0.55, 0.40 |
240, 0.20, 0.20 |
230, 0.40, 0.80 |
210, 0.40, 1.00 |
210, 0.55, 1.00 |
205, 0.40, 1.00 |
203, 0.49, 0.77 |
235, 0.25, 0.25 |
312, 0.30, 1.00 |
200, 0.05, 0.95 |
205, 0.30, 1.00 |
192, 0.05, 0.95 |
017, 0.36, 1.00 |
233, 0.30, 0.40 |
現在の太陽高度が朝の3°だとしましょう。
この時、混ぜる色は「日の出」と「朝」になります。
係数の計算式は正規化するのと同じです。
元の高度から、最小高度を引き、それを範囲(range)で割ります。
(高度 - 日の出の高度) / (朝の高度 - 日の出の高度)
(3 - 0) / (12 - 0) = 0.25
係数は0.25です。
したがって、日の出の色を75%、朝の色を25%で混ぜます。
天頂色の計算(RGBに直してから計算します。)。中間と地平線付近も同じようにやります。
56 * 0.75 + 102 * 0.25 = 67.5(68)
82 * 0.75 + 147 * 0.25 = 98.25(98)
102 * 0.75 + 255 * 0.25 = 140.25(140)
| ミックスRGB |
|---|
| 朝 3° |
HSV ( 215, 0.51, 0.54 ), RGB ( 68, 98, 140 ) |
HSV ( 224, 0.40, 0.85 ), RGB ( 130, 152, 217 ) |
HSV ( 309, 0.22, 0.97 ), RGB ( 249, 193, 240 ) |
その他
※-18°~0°の帯域は、係数を2乗しています。イージングをかけています。
元の係数が0.5の時は、0.5 * 0.5 = 0.25といったように、係数が小さくなります。暗くなりやすいようにしています。
私が現実の空を観測した結果のバランス調整です。
太陽
太陽の色も、3色のグラデーションから単色になった部分以外は、空の色と同じ仕組みです。
ただし、閾値が違います。 閾値(高度)は [-18, -0.5, 0.5, 90] です。
| 日の出 | 朝 | 昼 | 夕方 | 日の入り | 夜 |
|---|---|---|---|---|---|
| -0.5° | 0.5° | 90° | 0.5° | -0.5° | -18°以下 |
15, 0.5, 0.5 |
15, 0.4, 1.0 |
20, 0.2, 1.0 |
20, 0.4, 1.0 |
20, 0.5, 0.5 |
00, 0.0, 0.0 |
太陽では、日の出日の入りの瞬間に急激に明るさを変化させています。
(日の入りしても、太陽の明るさは急に0にはしていません。
現実でも、日の入りしても、しばらくはその方角からの光がまぶしいです。
今回のアプリでは、サンライトの明るさを調整することでそういう表現をしています。)
今後の予定、アイデア
時間イベントを増やす
キャラクターを増やす
背景を増やす
色などを美しくする
幻想的な...夢のような...。
天気を実装する
晴れ、曇り、雨、雪、雷、台風、砂嵐など...。
星、星座を実装する
現実の星空をマッピングできたら良いかもしれません。季節や緯度によって見える星は違う。
月を実装する
月の位置、満ち欠けを再現する。
月時計も実装する。 参考サイト: [こかげ] 月時計
ちゃんと空に月が見えるように、カメラの角度などを調整する。
音楽や効果音を鳴らす
音声ファイルは容量が重いので、midiで鳴らす。
時間帯、天気、季節などによって変える。トラック事に分ける。
お正月、ひな祭り、クリスマスなどの特定の日限定の演出を追加する
音楽も、ひな祭りの時はひな祭り、クリスマスの時はジングルベルなどのクリスマス曲を流す。
時報
キャラクターの行動パターンを増やす
キャラクターの反応
例えば...キャラをクリックしたら、そのキャラが気づいてこっちに来る。
英語に対応する
意外と海外からのアクセスも多いので、重要でしょう。
情報
解像度
全体 1024x576 16:9
それぞれ16の倍数(結果的に8,4,2の倍数でもある)です。
フレームレート
24fps
※このアプリでは、負荷を軽減するため、24fpsに制限しています。
しかし、requestAnimationFrame(webがアニメーションを実行する関数)が、
大体の場合で60fpsなため、
録画する際は60fpsの設定を推奨します。カクカクを防ぎます。
Q/A
実況したりファンアートを描いても良いですか?
常識的な範囲内であればOKです。
ソースコードは公開していますか?
GitHubに公開しています。
yukiyamane/3d_gently_radiant_environment
ぜひ、参考にしてください。しかし、無断転載はしないでください。
アップデート履歴
2025/05/29 制作開始
2025/06/06 Ver.0.1
初公開。
1週間で作るチャレンジでしたが、実際は9日かかりました(2日オーバー)。
※事前にJavaScriptやThree.jsの多少の知識はありました。
内容
・キャラ2人 ・太陽の動きの変化 ・起きる 食事 寝る等のイベント
コードはスパゲッティで、バグも多いと思います。
2025/06/17 Ver.0.2の制作開始
2025/07/15 Ver.0.2
思った以上に実装する要素が多く、時間がかかってしまいました。
国、ワールドマップ、ふきだし、UI修正、フェードインフェードアウト(コールバック関数)、等...。
変更内容
風景
・風景のオブジェクトを増やしました。
・国(でんきのくに、こおりのくに)を追加しました。
・「でんきのくに」は、都会で電気がたくさんある国です。
キラキラ光る時計機能付きの観覧車(横浜にあるコスモクロックを参考にしました。)がランドマークでしょう。
・「こおりのくに」は、年中、氷におおわれている、極地方にある国です。
緯度が高く、白夜と極夜もあります。今後のバージョンで雪をたくさん降らせたいです。
・日時計を追加しました。国ごとに異なる種類の日時計です。
・日時計を解説するロボットを追加しました。クリックすると説明してくれます。
・ワールドマップを追加しました。国を切り替える時に使用します。
スケジュール
・スケジュールに「おふろ」を追加しました。キャラがお風呂に入ります。
・トイレのオブジェクトを追加しました。しかし行きません。
その他
・空をグラデーションを2色から3色に増やしました。
・UIをサイバーパンク調、レトロなSci-Fi調にしました。
・UIの文字を大きくしました。実況動画などにした際に見やすくなったでしょう。
・カメラのデバッグモードをonにするボタンを廃止しました。ワールドマップ中以外では常にカメラを動かせるようにしました。
次回、Ver.0.3の案
音楽や効果音を鳴らす
ひとまず、これを最優先にしようと思います。音声ファイルではなく、MIDIを読み込み、Web Audio APIを使ってピコピコなシンセ音を鳴らそうと目を付けています。
使用ツール
- プログラミング言語:HTML, CSS, JavaScript, TypeScript
- Webで3DCGを表示するためのライブラリ:Three.js
- テキストエディタ:Visual Studio Code
- 2Dグラフィック:Clip Studio Paint
- 3Dモデリング:Blender
- アシスタント:Microsoft Copilot
...等
検索用キーワード
threejs, three js, 作品, 優しく輝く, オリジナル, 自作, ケモノ, 動物