スキンの各レコードには次のような項目がある。
(1) スキン ID: これを使ってスキンを参照する。
(2) スキン・フラグ: 複数指定されると、スキンはメッシュのこのモーフ・キー/フレームを使う。
(3) 胴体メッシュ。
(4) 下肢メッシュ(左)。
(5) 腕メッシュ(左)。
(6) 頭部メッシュ。
(7) 顔キー群(リスト)。
(8) 髪メッシュのリスト。
(9) 髭メッシュのリスト。
(10) 髪テクスチャのリスト。
(11) 髭テクスチャのリスト。
(12) 顔テクスチャのリスト。
(13) 音声のリスト。
(14) スケルトン名。
(15) 大きさ(まだ完全には機能しない)。
(16) 血の粒子 1(デフォルトの粒子を使いたい場合は、これを追加しないこと)。
(17) 血の粒子 2(デフォルトの粒子を使いたい場合は、これを追加しないこと)。
(18) 顔キーの制約(使いたくない場合は、これを追加しないこと)。
module_skins.py では、兵種(troop)と勇者(hero, 主人公、コンパニオンなど)の全てのスキン、つまり顔や肌や髪の外見が定義されます。これらは性別だけでなく、様々な種族にも使われるので、新しいスキンの兵種を作りたい場合、常に このファイルを変更することになります。header_troops.py で指定される最大 16 個の異なるスキンを持つことができ、それ以上 増やすことはできません [1]。
troop_type_mask = 0x0000000f
tf_hero = 0x00000010
各種族に男女があるなら、16 の半分、最大 8 つの種族が存在できることになります。マルチ・プレイヤーでは 2 つの種族しか実行できないことに注意して下さい。理由は、ネットコード(ゲーム側の同期処理)が、男性女性に通常使われるスキンに 1 ビットしか割り当てないからです [2]。
スキンの新規追加
新しい種族を作成せずに済ますことができる場合があることに注意して下さい。胴体のメッシュ、顔の形状、雄叫び、断末魔の叫び、血の効果、それらのいずれかを変更する場合は新種族が必要ですが、そうでない(いずれも変更しない)なら不要です。単に顔テクスチャを追加し、顔コードをうまく使えばよく、とても簡単に済みます。どうしても(種族を増やさずに)顔の形状を変えたい場合は、メッシュと頂点アニメーションを自分で作り、新しいメッシュにひげを適合させ、異なるマッピングを使って たくさんの新しいテクスチャを作る必要があることに注意して下さい [3]。
Native のモジュール・システムでは、module_skins.py の最終行付近にある undead(アンデッド)のレコードの行頭に付いている # を削除して そのスキンを有効にするか、または それを削除せずに残したまま その下(ただし最後の ] より前)に次のような数行を追加します [4]。
(
"<race>", 0,
"<race>_body", "<race>_calf_l", "<race>_handL",
"<race>_head", <race>_face_keys,
[],
[],
[],
[],
[("<race>face_a",0xffffffff,[]),("<race>face_b",0xffcaffc0,[]),], #face textures
[], #voice sounds
"skel_human", 1.0,
),
ここで <race> の箇所には新しい種族とモデルの名前を入れます。ここから参照するモデルを body_meshes.brf 内に含めておきます。skel_* は、この種族のスケルトンを指定します。ドワーフ、ゴブリン、ホビット、巨人などを追加したい場合、恐らく そこを変更し、独自のスケルトンを用意する必要があるでしょう。また、header_troops.py に新しいスキン・フラグを追加します。同ファイル内の冒頭付近にある次のような行を見つけて下さい。
#Troop flags
tf_male = 0
tf_female = 1
##tf_undead = 2
(訳注: モジュール・システム v1.171 では この「#」は無く、アンデッドが初めから有効です。)
新しい種族を追加する場合は、コメントアウトされた undead の後に追加するか、undead の行を捨てて置き換える必要があります。右辺の値は一意である必要があることに注意して下さい(undead はコメントアウトされているので、2 を使えます)。 つまり、下記のようになります。
tf_dwarf = 3
tf_hobbit = 4
(訳注: 上記、原文は 2 と 3 ですが、v1.171 では上述の通り tf_undead = 2 が有効なので、ここでは 3 と 4 にずらしてあります。)
これで、新しいスキンを持つ必要があるすべての兵種エントリに新しい兵種フラグ tf_xxxx を使えるようになりました。次に、プレイヤーの種族を選択できるようにしたい場合は、module_game_menus.py を開いて ("start_male" のレコードを探します。その下に下記レコードがあります。
("start_female",[],"Female",
[
(troop_set_type, "trp_player", 1),
(assign, "$character_gender", tf_female),
(jump_to_menu, "mnu_start_character_1"),
]
),
更にその下の ("go_back",[],"Go back", の手前に、例えば下記のようなレコードを追加します。
("start_<race>",[],"<race>",
[
(troop_set_type, "trp_player", 3),
(assign, "$character_gender", tf_<race>),
(jump_to_menu, "mnu_start_character_1"),
]
),
"trp_player" の後の 3 は、header_troops.py 内で定義した番号を参照していることに注意して下さい。
(訳注: 上記も、原文はコードと説明は 2 ですが、v1.171 では上述の通り tf_undead = 2 が有効なので、ここではコードも説明も ずらして、新設した tf_dwarf の 3 に変更してあります。)
スキン・フラグとモーフ・キー
レコードの(1 から数えて)2 番目の項目、「スキン・フラグ」は、そのスキンに どのモーフ・キーが使われるかを決めます。基本的に、ゲーム・エンジンは このビットを使って、スキン(ほとんどの場合、種族)に身体の変形が必要かどうかを知ります。これは女性の鎧の肩や胸部が細いのと同じ仕組みです。OpenBRF を使って女性化される鎧を見ると、女性用の形がアニメーションの時間 10、フレーム番号 2 にあることがわかります (訳注: OpenBRF について詳細は「BRF バイナリ・リソースの扱い」のページを。)。特定の種族について この頂点アニメーション・フレームと時間を使うようにゲームに指示するには、フレームの時間が 10 なら skf_use_morph_key_10 を使います。同様に、skf_use_morph_key_20 から skf_use_morph_key_70 までの独自の新しいフレームを作って特定の種族に割り当てることができます [5]。header_skins.py 内に使用可能なフラグがあり、8 つを超えるモーフ・キーをフレームに設定できないことになります。
異なるスケルトンを使う種族ごとに異なる頂点アニメーション・フレームを使う必要がありますが(OpenBRF を使用して鎧を再スケルトン化し、フレームを追加できます。再スケルトン化の項(未作成)と 頂点アニメーション の項を参照して下さい)、ゲーム・エンジンはそのようなフレームが与えられた時だけ そのモーフ・キーを使います [6]。頂点アニメーションのフレームが指定されない、別のスケルトンを持つ種族の兵種(troop)に対し、鎧 [7] を割り当てると、ゲーム・エンジンはデフォルトのものを使います。
顔キー・コード
各「顔コード」は、人物のあらゆる特徴(髪の色、年齢、ひげの種類など)を定義する特定の順序の 16 進数群で構成されます。これら「特徴」の値は一定の範囲にあります(例えば瞼なら、00 は ほぼ閉じた状態、ff は大きく開いた状態、その他 そのあいだの数値) [8]。
顔コードについて(Yoshiboy, random face code generator)
顔キー文字列の説明(Dusk Voyager, Modding Q&A, と k61824, Modding Q&A)
年老いた顔を得るには、顔のマテリアルに年寄りバージョンのテクスチャを diffuseB として指定し、年寄りバージョンの法線マップを鏡面反射(スペキュラ)として指定する、という方法がある。(dunde, Modding Q&A)
(訳注: 上記 DiffuseB は、OpenBRF のマテリアルの設定項目。例えば、Warband の CommonRes フォルダにある materials.brf を OpenBRF で開くと、左端のマテリアル一覧の右に DiffuseA, DiffuseB, Bump などの入力欄が現れます。このファイルの場合、建物など ほとんどのマテリアルの DiffuseB は空ですが、例えば hair_blonde には DiffuseB として「白髪」のテクスチャが指定されています。初めは DiffuseA, DiffuseB, Bump などが混在して表示され、DiffuseB という青い見出しを選ぶと、DiffuseB だけ表示されます。混在表示に戻るには右上の Back を選びます。)
遠目には顔が白いのに、近づくと通常の顔になる、という問題が発生する場合がある。これはメッシュだけでなく .LOD マテリアル(大文字であることに注意)が必要だから。他の様々なことが どのように設定されるべきかについては、materials_face_gen を。(Somebody, Modding Q&A と Modding Q&A)
顔キーは文字列なので、文字列レジスタに入れる際、0x を付けないよう注意(両方のキーを設定するか、デフォルトの命令を使うことも忘れずに)。(kalarhan, Modding Q&A)。
(str_store_string, s1, "@000000000a00000136db6db6db6db6db00000000001db6db0000000000000000"),
顔キー関連(dstn, Mount & Blade Modding Discord)
肌の色
(訳注: 原文は "Skin Colour"。ここでの skin は 3D 用語のスキンでなく「肌」。)
ここに投稿まとめ。(Yoshiboy, Modding Q&A)
頂点の着色(GetAssista, Modding Q&A)
兵の肌の色(Somebody, Modding Q&A)
肌の色(Somebody, Modding Q&A)
胴体の頂点色(Somebody, Modding Q&A)
前腕部(肘から先)の頂点色(Somebody, Modding Q&A)
肌の色のメッシュ(jacobhinds, Mount & Blade Modding Discord)
顔の色コード(Leonion (credit), Modding Q&A)
髪に、デフォルト以外のマテリアルを使う(xPearse, Modding Q&A)
スキン・モジュールの説明(snouz (credit), Modding Q&A)
顔キー・レジスタ(マルチ・プレイ用)(cmpxchg8b, [WB] Warband Script Enhancer v3.2.0)
スキンに関すること(jcsm130988(credit), Body-Head Color Tone Mismatch)
大きさの伸縮の問題
レコード内の(1 から数えて)15 番目、「大きさ(スケール)」は興味深い項目ですが、残念ながら完全には機能しません。このスケール係数は あらゆるものを何倍かにするので、スケルトン、ヒット・ボックス、および全てのメッシュが、各スキン・フラグを持つ兵種(troop)によって使われます。だから、ドワーフや巨人を作るのが簡単になるようです。低身長の種族の歩行サイクルは速くなり、高身長の種族では遅くなります。これは大抵の場合は望ましいことです。ただし、スケールにはいくつか欠点があります。ある兵種が飛び道具の攻撃を受けた場合、そこに刺さった飛翔物は同じ係数で伸縮されます [9]。また、サイズが 1 より大きい係数に設定されている場合、スケール・アップのバグ、つまりラグドールの問題が発生する可能性があります。ただし、この問題は、死傷アニメーションで当該エージェントがラグドールに変わるまでの時間を遅らせたり [10] 関連するヒット・ボックスを修正することで修正できる可能性があります [11]。
より詳細な説明については、Khamukkamu 氏が実施したスケール実験の報告書を読むことをお勧めします。様々なテスト、説明、要約が含まれています [12]。 Viking Conquest でスケール係数がどのように使用されているかを調べることもお勧めします。開発者は、最も高身長の人物(Tall)が標準(スケール = 1)サイズになるようにし、そこから、各スキンのスケールを縮小しました(平均的な身長 = 0.9、低身長 = 0.85、子供 = 0.75 など)。彼らは、低身長や平均身長の人物の歩行サイクルが速いことが、上述の他の問題を回避する うまい方法であることを見つけました。
馬のスキン
馬のスケルトンを新しく追加することはできません [13]。ただし、スケールは変更できます。module_items.py で、より大きな馬ならエントリ horse_scale(110) を使い、小さな馬なら horse_scale(90) を使いします。いろいろ試してみるとよいです。例えば、horse_scale(30) なら、馬のスケルトンとアニメーションで「猫」をアニメーション化できます [14]。 アニメーション一式は どの実装でも同じであることに注意して下さい。ただ、いくつかの解決策はあります。例えば、未来風のオートバイを実現するために 1 つのボーンに実装し、馬のような動きを無くすことは可能です [15]。
馬のスケルトンの姿勢制御(dynamic positioning)(Norwood Reaper, Modding Q&A)
ボーン(骨)リスト
ボーンのリストは 2 種類あり、1 つは人間のエージェント用、もう 1 つは馬のエージェント用で、header_common.py の一部のモジュール・システムで定義されています [16]。ただし、常にそうとは限りません。Native はそれらを全く定義しないし、Viking Conquest や Napoleonic Wars では人間のエージェントのボーン・リストが見つかります。これらのリストをモジュール・システムに追加する必要はありませんが、番号だけでなく名前でもボーンを参照したい場合は追加する必要があります。下記のように、両ボーン・リストの間に、全てのボーン位置がわかるような画像が表示されます [17]。
#Human bones
hb_abdomen = 0
hb_thigh_l = 1
hb_calf_l = 2
hb_foot_l = 3
hb_thigh_r = 4
hb_calf_r = 5
hb_foot_r = 6
hb_spine = 7
hb_thorax = 8
hb_head = 9
hb_shoulder_l = 10
hb_upperarm_l = 11
hb_forearm_l = 12
hb_hand_l = 13
hb_item_l = 14
hb_shoulder_r = 15
hb_upperarm_r = 16
hb_forearm_r = 17
hb_hand_r = 18
hb_item_r = 19
#Horse bones
hrsb_pelvis = 0
hrsb_spine_1 = 1
hrsb_spine_2 = 2
hrsb_spine_3 = 3
hrsb_neck_1 = 4
hrsb_neck_2 = 5
hrsb_neck_3 = 6
hrsb_head = 7
hrsb_l_clavicle = 8
hrsb_l_upper_arm = 9
hrsb_l_forearm = 10
hrsb_l_hand = 11
hrsb_l_front_hoof = 12
hrsb_r_clavicle = 13
hrsb_r_upper_arm = 14
hrsb_r_forearm = 15
hrsb_r_hand = 16
hrsb_r_front_hoof = 17
hrsb_l_thigh = 18
hrsb_l_calf = 19
hrsb_l_foot = 20
hrsb_l_back_hoof = 21
hrsb_r_thigh = 22
hrsb_r_calf = 23
hrsb_r_foot = 24
hrsb_r_back_hoof = 25
hrsb_tail_1 = 26
hrsb_tail_2 = 27
訳注
上図は、脚注の投稿で Dalion 氏が「quick reference」と言っているように、説明のために番号を付けてあるようです。OpenBRF(や OpenBRF Redux)の実際の表示は下記のようなもので、番号表示機能は無いように見えます。この例では CommonRes 下の skeletons.brf を取り込み、左欄から skel_human を選んで、中央パネルの一覧で 6 番の「foot.R」つまり右足の足首から先を選んであります。あまり目立ちませんが、プレビューの選択箇所(右足の先)が若干強調されています。
衝突検出には、ボーン自体でなく、周囲にある球状のヒット・ボックスが関係します [18]。ゲーム・エンジンは、ターゲットのヒット・ボックスの 1 つと、右側のアイテムのボーンに取り付けられたカプセル(ボーン番号 19 の hb_item_r)との衝突をチェックします [19]。 ここで大事なのは、既存のボーンの順序は変更できない、ということです。ゲーム・エンジンは、ダメージ計算、ヘッド・ショット、メッシュの付加など、至る所でハード・コーディングされたインデックスを使用します [20]。
血の粒子
新しい種族の血についての公開質問(Khamukkamu, Modding Q&A)
エージェントの血(Jacobhinds, Putting blood on agents)
血の粒子(パーティクル)(K700, [WB] Warband Script Enhancer v4.8.0 for 1.174)
防具から血を取り除く(GetAssista and Somebody, Modding Q&A) or troop(Specialists, Modding Q&A)
スキン/性別/種族に基づく音声
レコードの項目(1 から数えて)13 番、「音声のリスト」は新しいスキンを追加するときに見落とされがちです [21]。Native の男性のスキンのエントリ(レコード)を見ると、エージェントがダウンした時、何かが当たった時、叫び声を上げた時、勝利の歓声を上げた時など、様々な場面で次のようなサウンド・エントリが使われます。
[(voice_die,"snd_man_die"),(voice_hit,"snd_man_hit"),(voice_grunt,"snd_man_grunt"),(voice_grunt_long,"snd_man_grunt_long"),(voice_yell,"snd_man_yell"),(voice_stun,"snd_man_stun"),(voice_victory,"snd_man_victory")], #voice sounds
Native の女性のスキンのエントリと比べると、下記のように女性のほうが少ないのがわかります。[22]
[(voice_die,"snd_woman_die"),(voice_hit,"snd_woman_hit"),(voice_yell,"snd_woman_yell")], #voice sounds
header_skins.py を調べると、MOD 開発者が使用可能な音声イベントがわかります(下記)。
voice_die = 0 # Agent dies
voice_hit = 1 # Agent gets hit
voice_grunt = 2 # Unmounted agent attacks with a weapon
voice_grunt_long = 3 # Unmounted agent attacks powerfully with a weapon
voice_yell = 4 # Unmounted AI-agent comes close or readies an attack in a team fight, or player holds attack after sprinting
voice_warcry = 5 # Unused
voice_victory = 6 # Agent makes a victory cheer
voice_stun = 7 # Agent gets stunned
- 脚注と出典:
- [1] dunde, Modding Q&A.
- [2] cmpxchg8b, Modding Q&A.
- [3] jacobhinds, Modding Q&A.
- [4] ここから lllew 氏の投稿に続く。 Modding Q&A.
- [5] La Grandmaster, Modding Q&A.
- [6] dunde, Modding Q&A.
- [7] モーフ・キーは胴体の防具(WSE を使うなら足(ブーツ)と兜(ヘルメット))のみで機能する。 cmpxchg8b, Modding Q&A.
- [8] Lord Szentgyorgyi, Modding Q&A.
- [9] DtheHun, Modding Q&A.
- [10] dunde, Modding Q&A.
- [11] Maelubiyet, Modding Q&A.
- [12] Khamukkamu, Of Trolls, Orcs, and Elves: Experiments using SCALE from module_skins.py.
- [13] GetAssista, Modding Q&A, and dune, Modding Q&A.
- [14] NPC99, Modding Q&A.
- [15] dunde, Modding Q&A.
- [16] このリストは _Sebastian_ 氏による。 Modding Q&A
- [17] OpenBRF は一部のボーン番号のヒット・ボックスを表示しないが、コード的には機能することに注意。情報と参考画像は Dalion 氏の Mount & Blade Modding Discord から引用。dstn 氏によると、「ボーン 3 は馬のヒット・ボックスに表示されない。これは 0 のヒット・ボックスで覆われているからで、より良い選択かもしれないが、後部セクションのボーンは静的な原点ボーンから来ていると思う」とのこと。 Mount & Blade Modding Discord.
- [18] Norwood Reaper, Modding Q&A. (訳注: リンク先に Norwood Reaper 氏という投稿者は見当たらず、Mike Hawk 氏が投稿)
- [19] cmpxchg8b, [WB] Warband Script Enhancer v3.2.0.
- [20] cmpxchg8b, Suggestions/requests thread -- post yours here. 彼がゲーム・エンジンを詳しく調べたところ、開発者は明らかにエージェントごとのアクション・セットを計画していたが、何らかの理由でコードを削除することなくそのアイデアを破棄した、ということも明らかになった。
- [21] 後続の注意は nema, How to resolve problem with silent troops から抜粋、new infobits が更新。
- [22] これは、女性の勝利の歓声が問題として頻繁に報告される理由でもあり、これが機能するための voice_victory エントリが単に欠落している。