モデル

Last-modified: 2009-09-23 (水) 21:27:17

モデル

モデルに関しての説明ページです。モデルはエンティティではpropと付くpoint_entityです。

http://tendon.s35.xrea.com/phpBB/kb.php?mode=article&k=84からの転載後編集

モデルはゲーム中に存在する、ブラシではなく、たるや木、草、などの細かい設置物のことを指します。
ブラシだけを使ってマップを作ることも可能ですが、モデルを追加することにより、細かく、本物らしくなります。ここではこのモデルを説明していきます。

実際にモデルを置いてみる。

実際にモデルを追加するところを再現しています。

モデル変更する

まずはポイントエンティティをおきます。
ポイントエンティティはエンティティツール(Entity Tool)[Shift + E]を使用して設置します。

エンティティツール

entitytool.JPG

最初は画面のように箱で出ない場合があります。(TF2の場合は緑の人(ゴードンモデル)の形になります)
ポイントエンティティを設置したらダブルクリックしてプロパティ変更画面を出してClassをprop_staticに変更して一旦applyボタンを押します。そしてプロパティ設定名のWoludModelをクリックしましょう。すると右上のテキストボックスの下にbrowseボタンが現れます。これを押します。

20081019_130908.jpg

モデルブラウザー

この画面はモデルを検索できるモデルブラウザです。左上はモデルの大まかなグループです。左下はモデルを選びます。右上は選んだモデルのviewerです。右下はモデルのプロパティの変更画面です。これを使いモデルを選びます。

20081019_130938.jpg

モデルを決めます。

今回は左上をprop_lightsの中にlight_cone_farm_32.mdlを選びました。ちなみに右のモデルビューワーではドラッグで回転させることができます。OKボタンを押してください。

20081019_131035.jpg

プロパティ画面です

プロパティ画面はこのようにモデルのアドレスが入ります。
他の設定は今回は変えませんが、変更することにより、スキンを変えることが出来たり、距離が離れたときにモデルの表示をフェードアウトさせたりする設定を付けることが出来ます。

20081019_131044.jpg

モデルが変わります

地面にモデルが出来てしまいました。ここではまずいので、切り取りして3DViewを移動して部屋の天井に持って行きます。

20081019_131051.jpg

貼り付けます

天井に貼り付けました。見えてるところに張り付くのでそのまま横位置を調整すれば簡単に変更できます。
注意 このプロップモデルですが、実際に光は出していませんので、ライティングを追加しないと光りません

20081019_131103.jpg

プロップタイプの概要

上の説明で使われているプロップタイプはprop_staticです。このほかに主な特徴として、動かすことやアニメーションさせることが出来るprop_dynamicや物理計算を行えるprop_physicsなどがあります。このプロップは種類によりゲーム中におけるパフォーマンスのコストが変わります。うまく使うことにより、FPSを上げたりすることになりますのでうまく選択してください。

以下はそのプロップタイプの説明です。

prop_detail

detailジオメトリ - 動かないスタティックモデル。物理データや衝突データは持たない。壊れない。影もない。マテリアルにdetailタイプを割り当てることで自動的に配置できる。描画において一番コストがかからない。ローエンドマシンでは描画すらされないかもしれない。TF2やL4Dでは存在しません。

例:草、石、植物

prop_detail

           マップ内の数: 数万
           常に描画されるか: No
           衝突: No
           ライティング: ポイント
           影: No
           物理: 静的、物理なし、階層構造なし、アニメーションなし

prop_detailの特徴:

  • 一つのマップに数万おくことができる。
  • .MDL、スプライトのどちらも可能。スプライトの方が.MDLよりずっと高速。
  • ハンマーエディタ内で配置することも、.vmtファイルのマテリアルプロパティに%
  • detailtypeを加えることでvbspによって特定のマテリアルの上に自動的に生成することもできる。(説明は以下)
  • 衝突しない。
  • 一定の色で照らされている。(最適化のため)
  • 世界のライトマップに影響しない。
  • プレイヤーから一定の距離離れると自動的にフェードアウトする。(コンソール変数cl_detaildistとcl_detailfadeによって制御される)
  • ローエンドマシンでは描画されない可能性がある。
  • .qcファイルに$staticpropを指定してコンパイルされたモデルを使う必要がある。
  • ネットワーク負荷無し&とても少ないメモリ使用量
  • 実際のエンティティではなく、インプット、アウトプットを持たない。
  • アニメーションを持てない。
  • 他のエンティティと階層構造を持てない。
  • 可視性では、点として扱われる。

prop_static

スタティックジオメトリ - 動かないモデル。衝突に関して以外の物理データを持たず、壊れない。ジョイントやアニメーションを持てない。ライトマップによる影を持つ。描画コストは安い。

例:パイプ、照明器具、岩、電柱

prop_static

           マップ内の数: 数千
           常に描画されるか: Yes
           衝突: Yes
           ライティング: 頂点
           影: 静的(ライトマップ)
           物理: 静的、物理なし、階層構造なし、アニメーションなし

prop_staticの特徴:

  • マップ内に数千配置できる。
  • ハンマーエディタ内で配置できる。
  • 衝突データを持つ。
  • 世界のライトマップに影響を与え、ライトマップの影を持つ。
  • 通常のスタジオモデルのように頂点が照らされる。
  • LODシステムを使う。
  • このプロップがローエンドマシンで描画されるかユーザが選べる。
  • フェードアウトの距離をハンマーエディタ内で設定できる。
  • .qcファイルに$staticpropを指定してコンパイルされたモデルを使う必要がある。
  • 実際のエンティティではなく、インプット、アウトプットを持たない。
  • アニメーションを持てない。
  • 他のエンティティと階層構造を持てない。
  • 可視性の最適化において、オブジェクトの凸胞を利用する。

prop_dynamic

階層構造、ジョイントを持つことができ、アニメーション再生も行えるモデル。十分なダメージを受けた場合に壊れるようにも設定できる。他のオブジェクトと階層構造で接続することができる。動的な影を持てる。スタティックなジオメトリよりは高価だが、物理ジオメトリよりは安価である。

例:ロボットの腕、機械、カットシーンでアニメーションを行うモデル

prop_dynamic

           マップ内の数: 数百
           常に描画されるか: Yes
           衝突: Yes
           ライティング: 頂点
           影: 動的(投影)
           物理: 階層構造+アニメーション

prop_dynamicの特徴:

  • マップ内に数百配置できる。
  • ハンマーエディタ内で配置できる。
  • 衝突データを持つ。
  • 世界のライトマップに影響を与えないが、動的な影を持つ。
  • 通常のスタジオモデルのように頂点が照らされる。
  • LODシステムを使う。
  • ローエンドマシンにおいても存在する。
  • フェードアウトの距離をハンマーエディタ内で設定できる。
  • $staticpropなしでコンパイルされたモデルも使用できる。
  • アニメーションを持てる。
  • 低い(しかし非ゼロの)ネットワーク負荷、高めのメモリ使用量(他のエンティティと同じ)
  • インプット、アウトプットを持つ本物のエンティティである。
  • 他のエンティティと階層構造で接続できる。
  • 可視性の最適化において、オブジェクトの凸胞を利用する。
  • 可視性において、箱というように扱われる。

prop_physics

あらかじめ組み込まれた物理属性を持ったモデル。剛体物理システムを使って動き、衝突を行う。ヒンジや他のコンストレイントを使って他の物理オブジェクトと制約することができる。十分なダメージをうけたら壊れるようにも設定できる。動的な影を持つ。動かすのと、描画、そして動かすコストは高価である。

例:ドラム缶、小さい瓦礫、家具

prop_physics

           マップ内の数: 数十から数百
           常に描画されるか: Yes
           衝突: Yes
           ライティング: 頂点
           影: 動的(投影)
           物理: 階層構造+アニメーション+物理

prop_physicsの特徴:

  • 複雑さに依存して、マップ内に数十から数百まで置くことができる。
  • ハンマーエディタ内部で配置できる。
  • 衝突データを持つ必要がある。
  • 世界のライトマップに影響を与えないが、動的な影を持つ。
  • 通常のスタジオモデルのように頂点が照らされる。
  • LODシステムを使う。
  • フェードアウトの距離をハンマーエディタ内で設定できる。
  • 設定を変えない場合ローエンドマシンにおいて早くフェードアウトする。
  • $staticpropなしでコンパイルされたモデルも使用できる。
  • アニメーションを持てる。
  • 低い(しかし非ゼロの)ネットワーク負荷、高めのメモリ使用量(他のエンティティと同じ)
  • インプット、アウトプットを持つ本物のエンティティである。
  • 他のエンティティと直接階層構造で接続することができない。
  • 物理制約エンティティによって他のエンティティと制約することができる。
  • 可視性の最適化において、オブジェクトの凸胞を利用する。
  • 可視性において、箱というように扱われる。
  • 追加特徴?

prop_ragdoll

ラグドール物理スケルトンをもった物理プロップ。物理プロップの特性全てに加え、複数の衝突、や体を曲げることができる剛体ラグドール物理システムを使用できる。描画、動かすコストは非常に高価である。

例:死体、多くの面を持つ段ボール箱、マットレス

prop_ragdoll

           マップ内の数:10以下
           常に描画されるか: Yes
           衝突: Yes
           ライティング: 頂点
           影: 動的(投影)
           物理: 階層構造+アニメーション+ラグドール物理

prop_ragdollの特徴:

  • prop_physicsと同様だが、ラグドール物理のためにスケルトンを持つことができる。
  • 非常に高いネットワーク負荷。

prop_physics_multiplayer

マルチプレイヤーのために設計された単純化した物理衝突システムを使う物理プロップ。通常の物理プロップに比べ、帯域が制限されたマルチプレイヤー環境に向けて、ネットワーク負荷が小さくなっている。

prop_physics_override

モデルに組み込まれている物理属性を上書きするために使われる特別なプロップタイプ。コストはprop_physicsと同一である。

prop_dynamic_override

prop_staticとしてデザインされたモデルを変換してprop_dynamicの属性を与える特別なプロップタイプ。コストはprop_dynamicと同一である。

注釈

  • マップ内の数:許容できるパフォーマンスを保つのに許されるマップ内における典型的な数
  • 常に描画されるか:オブジェクトからとても離れていてもいつもそのプロップは描画されるか?
  • 衝突:このプロップタイルは他のオブジェクトと衝突できるのか?
  • ライティング:オブジェクトへのライティング/影の方法
  • 影:このプロップタイプはライトマップの影を持つのか、動的な投影の影を持つのか?
  • 物理 このプロップタイプは物理システムやアニメーションシステムと干渉するのか?

マテリアルからのprop_detailsの自動生成

prop_detailの種類のモデルをあるマテリアルが適用された表面からランダムに生成することができます。detail.vbspファイルにdetailプロップグループを記述します。それぞれのdetailプロップグループはどのprop_detailモデルがそのグループから生成されるか指定します。.vmtファイルに以下の行を加えることで、マテリアルにどのdetailプロップグループを割り当てるかを示すことができます。

Code:

%detailtype = "detail_group_name"

detail_group_nameにdetail.vbspに書かれたdetailプロップグループの一つの名前を書きます。

以下がdetail.vbspファイルで定義されたdetailプロップグループの単純な例です:

Code:

  swamp_grass_and_rocks
  {
     "density" "800.0"
     Group1
     {
       "alpha" "1.0"
       Model1
       {
          "model" "models/junk/rock1.mdl"
          "amount" "0.3"
       }
       Model2
       {
          "model" "models/junk/rock2.mdl"
          "amount" "0.3"
       }
     }
     Group2
     {
       "alpha" "0.0"
       Model1
       {
          "model" "models/foliage/Grass_tuft_003a.mdl"
          "amount" "0.1"
       }
       Model2
       {
          "model" "models/foliage/Grass_tuft_004b.mdl"
          "amount" "0.3"
       }
     }
  }

"Density"(密度)はこのdetailプロップグループを使うマテリアルの表面のどのくらいのポイントからランダムに生成するかを設定します。大きい数字であるほど多くのdetailプロップが生成されます。

それから、好きなだけ多くのdetailプロップグループを指定することができます。ディスプレイスメントサーフェスではない表面のマテリアルは一つのグループしか使いませんが、ディスプレイスメントサーフェスにおいては複数のグループを使うことができます。それぞれのグループはランダムに生成されるモデルのリストを持ちます。上のモデルフィー絵独活がどのスタジオモデルを使うかを示し、"amount"フィールドはリスト中の他のモデルと比べて相対的にどのくらいの量を生成するかを示します。上級ユーザへ: もしひとつのグループ内の全てのモデルのamountの合計が1より少ない場合、システムは"density"で指定された最高モデル数より少ない数を生成します。

"alpha"フィールドはディスプレイスメントサーフェスのみで使われます。二つのテクスチャをブレンドしているディスプレイスメントサーフェスの場合、alphaがそれぞれのテクスチャをどの程度使用するかを示します。detailシステムはalphaの値をみてどちらのグループからモデルを選ぶか決定します。例えば、道(alpha=1)と草(alpha=0)二つのテクスチャを持つディスプレイスメントサーフェスがあったとします。この例では、道の上には岩が生成され、草の上には草の束が発生します、というのも"alpha"が"1"のグループは岩のモデルを含み、"alpha"が"0" のグループは草のモデルを含んでいるからです。好きなだけ多くのグループを作ることができます。"alpha"が"0.5"のグループを追加し、ディスプレイスメントの岩と草が混ざる間のところにそのグループのモデルを置くこともできます。

.MDLを使ったdetailプロップシステムは実際のところ現在のDirectXに存在するモデルごとにかかる負荷のせいでかなりコストがかかるものです。これを避けるために、detailプロップシステムにスプライトを使うこともできます。これはモデルごとにかかる負荷がなく、.MDLを使うより常に最低でも10倍は早いものです。以下の例はdetailスプライトを使うdetailモデルグループの指定方法です。:

Code:

Group1
{

  "alpha" "1"
  Model1
  {
     "sprite" "288 0 128 128 512"
     "spritesize" "0.5 0.0 19 25"
     "spriterandomscale" "0.2"
     "amount" "0.2"
     "detailOrientation" "2"
  }
  Model2
  {
     "sprite" "0 0 128 128 512"
     "spritesize" "0.5 0.0 23 30"
     "spriterandomscale" "0.2"
     "amount" "0.1"
     "detailOrientation" "2"
     }

}

Detailスプライトに使用するテクスチャは"detailsprite.vtf"の一部分である必要があります。

上にある"sprite"フィールドの最初の二つの数字はdetailsprite.vtfテクスチャのどの部分にスプライトがあるのか、ということをスプライトの左上の(X,Y)座標をしめしています。次の二つの数字はスプライトの幅と高さを指定します。最後の数字はdetailsprite.vtfのサイズをピクセル数で示しています。

"spritesize"行の最初の二つの数字は正規座標におけるdetailスプライトの回転中心を指定しています。(0,0)は左下を、(1,1)は右上を示します。上の例では、回転中心はスプライトの下端の中心です。"spritesize"行の最後の二つの数字は描画される際の幅、高さをユニットで指定しています。

"spriterandomscale"はdetailスプライトの幅と高さのスケールをランダムに変化させる量を指定します。(この例では、スプライトは"spritesize"で指定したサイズの80%から120%になります。)

最後に"detailOrientation"はdetailスプライトがどのように動くかを指定します。値が0だと回転しないことを示します。1だと常にカメラの方向を向き、2はカメラに向くようにZ軸中心に回転します。