====== 奥行きソートとシェーディング ====== === 奥行きソート法 === * **画家のアルゴリズム(ペインタアルゴリズム)** * 奥にある物体から順に描いていく手法 * 後ろの物体を先に描くことで、前の物体が「上書き」され、自然に隠面が消える * 処理が簡単だが、物体の交差や入れ子構造に弱い === レイトレーシング法(Ray Tracing) === * **Ray = 光線(放射線) ⇒ x-Ray(X線)** * 光の経路を逆にたどって、視点から物体への光線を追跡 * 実際の光の反射・屈折・影などをシミュレーションできる * 現実に近い画像表現が可能で、**隠面消去法の中で最も理論的** * 特徴: * 影、映り込み、透明、屈折などが自然に表現可能 * 欠点:**計算コストが高い** ---- ====== シェーディング ====== === 影の種類 === * **陰影 (Shade)**:光の当たり方による明暗の表現 * **影 (Shadow)**:光が遮られてできる影(自己影や他の物体による影) === 光源の種類 === * 平行光源:無限遠から来る太陽光のような光源 * 点光源:ある一点から放射される光(例:電球) * 線光源:線状に配置された光源(例:蛍光灯) * 面光源:面を持つ光源(例:曇り空) === 光の分類 === * **直接光**:光源から物体へ直接届く光 * **間接光**:他の物体に反射してから届く光 ---- === シェーディングモデル === * シェーディングのための光の計算式 * 主に3要素で構成される: ^ 項目 ^ 内容 ^ | **環境光(Ambient)** | 周囲からの間接的な光。全体を少し明るくする | | **拡散反射光(Diffuse)** | 光が表面に当たり、全方向に散乱する光 | | **鏡面反射光(Specular)** | 光沢やハイライトのような反射成分 | === 合成光の式 === * 全体の色(光の強さ)を以下のように計算する: I(rgb) = Id(rgb) + Is(rgb) + Ia(rgb) * I:最終的な光の強さ(色) * Id:拡散反射光 * Is:鏡面反射光 * Ia:環境光 ---- === 環境光の計算式 === I(r,g,b) = Ka(r,g,b) * Ia(r,g,b) * Ka:環境光反射率(マテリアルの特性) * Ia:環境光の強さ === 拡散反射の計算 === Id = kd * I * cos(α) * kd:拡散反射係数 * α:光の入射角と法線との角度 === 鏡面反射(フォンモデル) === Is = W(α) * I * cos^n(γ) * γ:視線ベクトルと反射ベクトルのなす角 * n:光沢の強さ(指数項) ---- ====== シェーディングモデルの改良系 ====== * **ブリン(Blinn)モデル**:微小面の集まりでよりリアルな反射を計算 * **クック・トランスモデル**: * 金属表現に強い * 波長や入射角による反射率の変化も考慮 * **BRDF(双方向反射分布関数)**: * 一般化された反射モデル * 入射方向と出射方向の関係から反射率を定義 ---- ====== レイトレーシングの利点と限界 ====== * 表現が自然: * 映り込み(反射)、透明(透過)、屈折などが可能 * Zバッファなどのラスタライズ法では、これらは工夫しないと表現できない === 屈折 === * **スネルの法則**で屈折角を計算 * 光が媒質を通るときに屈折する現象をシミュレートできる ---- ====== シェーディングの手法(塗り方) ====== * 理論上は「面単位」で色をつけるが、実際は「頂点単位」で計算して補間する ^ 方法 ^ 特徴 ^ | [0] コンスタントシェーディング | 面ごとに一定の色で塗る。簡単だが不自然に見える | | [1] グロー(グーロー)シェーディング | 頂点で計算した色を、面内で線形補間する。滑らかだがハイライトが不自然 | | [2] フォン(Phong)シェーディング | 面内で法線を補間し、ピクセル単位で反射計算を行う。より自然で滑らか | ---- ====== ノンフォトリアリスティック表現とプロシージャル技術まとめ ====== === ノンフォトリアリスティック表現(NPR) === * **ハッチング(Hatching)** * 線やドットで陰影を表現する手法。 * 遠くから見るとグレースケールや階調に見える。 * 写実的ではなく、イラストや絵画のような表現に向いている。 * **デジタルハーフトーニング(Digital Halftoning)** * 少ない色数(2値など)でも、パターンで密度を変えることで疑似的に中間色を表現。 * プリンタやディスプレイの色再現に使用される。 * **疑似カラー(Pseudo Color)** * グレースケール画像に、色を割り当てて情報を視覚的に分かりやすくする。 * 熱分布や標高マップなど、科学可視化の分野で多用。 --- ====== プロシージャル技術(手続き型生成) ====== === Proceduralとは? === * 「決まった手順に従って処理する」意味。 * 主に以下のような手順: 1. データを取得する 2. データから特性(範囲など)を分析する 3. 特性に応じて色や形などを生成する 4. それを毎フレーム、またはリアルタイムで行う \=== プロシージャルの応用例 === * **プロシージャル生成(Procedural Generation)**: * 地形・街並み・雲・木などを自動的に作成。 * **プロシージャルテクスチャ**: * 数式やアルゴリズムで模様を生成。 * 無限に拡大しても解像度を維持できる。 * **プロシージャルモデリング**: * 手作業でなく、アルゴリズムにより形状を作成。 * パラメトリック建築や自然物生成に有効。 * **プロシージャルアニメーション**: * スクリプトや数式で動きを定義。 * 群衆・波・風になびく木など、リアルな動きを生成。 \=== 自然現象のシミュレーション === * **対象**:炎、煙、水、霧、爆発、雲など * **手法**: * パーティクルシステム(粒子法) * 流体力学:ナビエ・ストークス方程式(有限要素法など) * **AIとの連携**: * 動物の挙動・群衆の動きをAIで自動生成 === L-System === * 植物の成長過程を再帰的に記述できる形式言語。 * フラクタル的な形状の生成に適している。 --- \====== キャラクターアニメーション技術 ====== \=== FFD(自由形状変形) === * Free-Form Deformation:モデル全体を囲む空間を変形させ、形状を間接的に変形。 * 曲げる、ねじるなど複雑な変形を簡単に制御可能。 === スケルトンアニメーション === * **骨(スケルトン)**:関節を持つ階層構造 * **スキン**:骨に影響を受ける外形(メッシュ) === キネマティクス === * **FK(フォワードキネマティクス)**:根本から順に動かして最終位置を決定 * **IK(インバースキネマティクス)**:手先の位置から関節の角度を逆算 === リギング(Rigging) === * モデルに骨(ボーン)を仕込み、アニメーション制御しやすくする設定作業 * ウェイト調整・IK設定・ボーン構造の設計などを含む * 担当者を **リガー(Rigger)** と呼ぶ === パスアニメーション === * 移動軌跡(パス)を与え、スプライン補間で滑らかな動きを作る === モーションキャプチャ === * **光学式**:マーカーをカメラで追跡 * **機械式**:加速度センサーなどを使って動きを記録 === モーションブレンド === * 2つのモーションの間を補間して、滑らかな遷移を作る * 例:歩く→走る、ジャンプ→着地 --- ====== 特殊なアニメーション技術 ====== === 表情アニメーション === * ばねモデルなどで筋肉の動きを再現 * **リップシンク**:音声と口の形を同期(AIで自動生成も可能) === 布のアニメーション === * クロスシミュレーション:布の挙動をばねと質点でモデル化 === 髪の毛(ファー) === * 多数の細いパーティクル * 個別の髪+全体の動き(流体的)をシミュレーション === 群衆(フロック) === * 群れのような集団の動きをアルゴリズムで制御 === 物理ベースアニメーション === * **剛体**:変形しない物体(ボールなど) * **弾性体**:伸び縮みする物体(ロープ、へびなど) * 数値計算(例:オイラー法)で物理運動を再現 === 衝突判定(Collision Detection) === * 物体同士が接触したかを調べる処理 * **バウンディングボックス(Bounding Box)**: * AABB:軸平行の箱 * OBB:軸に沿わない箱 --- ====== 合成・実写技術とCG ====== === 実写とCGの合成 === * **ダブルバッファリング**:フレームバッファを2枚使って滑らかに表示 === VR・ARでの合成 === * 実世界の映像とCGをリアルタイム合成 * **プログラマブルシェーダ**:GPUのシェーディングをカスタマイズ可能 === ゲーム物理 === * ゲーム内の世界に物理ルールを導入 * 衝突、摩擦、重力などを物理エンジンで再現