three.js概論#3
2024/6/9
アニメーション
three.jsにおけるアニメーションはストップモーションアニメーションのように、一定の間隔でシーンの状態を変更し、レンダリングすることで実現される。
PCモニターなどのディスプレイは、一般的に1秒間に60回画面を更新することができる。この更新の間隔をフレームレートと呼び、60fpsの場合、1フレームあたり約16.67msで画面を更新することになる。
しかし、ディスプレイによっては60fps以上のフレームレートのものもあり、逆に60fps未満のものもある。
そのため、フレームレートに関係なくアニメーションを実装するためには、requestAnimationFrame
を使用することが推奨されている。
requestAnimationFrame
requestAnimationFrame
は、引数に指定した関数を次のフレームで実行する。
そして、渡された関数内で再びrequestAnimationFrame
を呼び出すことで、関数が各フレームで実行され続ける。
コンソールにtick
と表示され続け、実行されるフレームレートが高いほど、より高い頻度でtick
が表示される。
つまり、フレームレートによってアニメーションの速度が変わってしまう。
フレームレートに依存しないアニメーション
アニメーションをフレームレートに依存しないようにするためには、前回のフレームからの経過時間を取得し、それをアニメーションの進行度として扱うことが必要となる。
Clock
three.jsでは、Clock
クラスを使用することで、簡単に経過時間を取得することができる。
カメラ
three.jsには様々なタイプのカメラがある。
Camera
CameraCameraクラスはいわゆる抽象クラスで、ほかのカメラに関するクラスはこのクラスを継承している。
StereoCamera
StereoCameraStereoCameraは、私たちが「視差効果」と呼ぶ、脳を奥行きがあるかのように錯覚させる効果を生み出すために、目を模した2つのカメラを通してシーンをレンダリングするために使用される。結果を見るには、VRヘッドセットや赤青メガネなどの適切な機器が必要。
CubeCamera
CubeCameraCubeCameraは、各方向(前方、後方、左方、右方、上方、下方)を向いたレンダーを取得し、周囲のレンダーを作成するために使用。反射用の環境マップやシャドウマップの作成にも使える。
PerspectiveCamera
PerspectiveCameraPerspectiveCameraは、遠近法を使った現実のカメラをシミュレートしたもの。
PerspectiveCameraクラスのインスタンス化
OrthographicCamera
OrthographicCameraOrthographicCameraは、遠近感のないシーンの平行投影レンダリングを作成するために使用。カメラからの距離に関係なく、画面上の要素は同じサイズになる。
視野角の代わりに、カメラが各方向(左、右、上、下)にどこまで見ることができるかを指定する。そして、PerspectiveCameraで行ったように、nearとfarの値を指定。
マウス位置をもとにカメラをコントロール
ビルトインコントロール
公式ドキュメントで見れば分かるが、three.jsにはあらかじめ用意されたコントロールがいくつかある。
OribitControls
OribitControls一番使用する機会が多いであろうコントロール。画面ドラッグやスクロールを使用してカメラをコントロールできるようにする。
OrbitControlsクラスは、標準のTHREE
変数からではなく、新たにインポートする必要がある。
Target
デフォルトではカメラはシーンの中心を見ているが、Target
プロパティで変更することができる。
このプロパティはVector3
でx,y,zプロパティを変更できる。
Dumping
ダンピングは、加速度と摩擦の計算を追加することで、アニメーションを滑らかにする。
正しく動作させるには、各フレームでcontrols.update()
を呼び出して更新する必要がある。
フルスクリーンとリサイズ処理
ビューポートに合わせる
画面をビューポートいっぱいにするために、rendrer.setSize()
に渡す高さと幅に、window.inndrWidth
とwindow.innerHeight
を使用する。
また、デフォルトのスタイルを修正する必要がある。
リサイズ処理
イベントハンドラを設定してリサイズ処理を行う。
デバイスピクセル比の処理
デバイスピクセル比とは
デバイスピクセル比(DPR)とは、論理的な1ピクセル単位に対して、画面上の何個の物理的なピクセルで表示されるかを示す比率。
例えば、DPRが2の場合、1つの論理的なピクセルは物理的に2x2ピクセル(4ピクセル)で表示される。これにより、より高精細な表示が可能となり、画像やテキストがより滑らかに見える。
代表的な例として、AppleのRetinaディスプレイがあり、DPRは2以上で従来のディスプレイよりも高精度な表示が可能となる。
DPRが2であれば、レンダリングするピクセル数は4倍になり、DPRが3であれば、ピクセル数は9倍になる。
そして、DPRが最も高いのは通常、スマートフォンといったモバイル機器であり、フレームレートの低下を招くことになる。
デバイスピクセル比の処理
画面のピクセル比率を取得するには、window.devicePixelRatio
を使用し、レンダラーのピクセル比率を更新するには、renderer.setPixelRatio()
を呼び出す。