11 窓を作る


ここでは主に、LinedefとSidedefの設定を使って、『壁のテクスチャをそろえる』やり方を解説します。
それには、『窓』が題材として適しているので、まず、二つのセクターを部屋として作り、その間に窓になるセクターを置くマップを作ってみたいと思います。

その前に、今回はデフォルトのテクスチャを変更してからセクターを作る事にします。
WadCraftでは、セクターを作った時に、テクスチャや床や天井の高さなどの属性は、全てデフォルトの値が使われます。これらの設定は、前回説明した編集ダイアログを呼び出す事によって、後から設定する事も出来ますが、あらかじめ、デフォルトの値の方を変更してからセクターを作る方がいい時もあります。
WadCraftでは、複数のオブジェクトを選択する事は出来ないので、複数のオブジェクトの共通する属性を一括して変更するという事は出来ません。そのため、同じ性質のセクターをいくつか作る時は、デフォルトの値を先に設定しておいた方がいいです。特に壁のテクスチャは、同じセクターの壁ならば、同じテクスチャを使う事が多いので、デフォルトのテクスチャをあらかじめ設定してからセクターを作った方が、後から一つ一つ設定する手間が省けます。

デフォルトの壁のテクスチャを変更するには、ツールバーの中の「デフォルトテクスチャ」ボタン を押すか、または「設定(S)」メニューの中の「デフォルトテクスチャ...」を選択します。
すると、図1のようなダイアログボックスが開きます。



図1 「デフォルトテクスチャ」ダイアログボックス

一番上のUpper Textureというのは、Two-sided Linedefが作られた時に、そのLinedefの左右のセクターの天井の高さが違った時に、段差の部分の壁に適用されるテクスチャの事です(図2)。



図2 壁のテクスチャの3タイプ

Middle Textureは、Normal Textureとも呼ばれ、もしLinedefがTwo-sidedではない場合、つまり一つのセクターだけに面している場合は、このMiddle Textureで指定されたテクスチャが通常の壁のテクスチャになります。
Two-sided Linedefの場合は、通常はMiddle Textureはありません。もしTwo-sided LinedefにMiddle Textureがある場合は、それは『柵』や『格子』のような部分的に透明なテクスチャ(これを以降はMasked Textureと呼びます)になります(図2参照)。ただし、Two-sided LinedefのMiddle Textureにわざと通常の不透明なテクスチャを使って、『通り抜けられる壁』を作ることも出来ます。
Lower Textureは、Upper Textureの『床の段差』版であり、Two-sided Linedefの場合に、左右のセクターの床の高さが違う時の段差の部分の壁のテクスチャになります。

このように、三つのタイプのテクスチャは常に全てがそろっている必要はなく、例えば、Single-sided Linedefの場合はUpper TextureとLower Textureは必要なく、Two-sided Linedefでも隣り合うセクターの床と天井の高さが両方とも同じならテクスチャは全く必要ありません。
WadCraftでは、セクターを作成した時、あるいはセクターの床や天井の高さを変更した時に、これらのテクスチャを適用する必要が生じると、上の「デフォルトテクスチャ」ダイアログボックスで設定されている値を参照して適用します。
Linedefの編集ダイアログ上では、必要がないタイプのテクスチャの欄には、「-」(マイナス記号)だけが書いてある項目が選択されます。
DOOMでは、必要がない部分のテクスチャに何かが指定されていても、無視されるだけで何の問題もありません。しかし、あるべき所のテクスチャに何も指定されていないと、レンダリングエラーを起こします。
オリジナルのソフトウェアによるレンダリングでは、テクスチャが指定されていない壁は、何も描画しません。そうすると、その奥にある物が透けて見えるかというと、そうではありません。オリジナルのDOOMエンジンでは、陰面消去として、手前にある壁や柱の向こう側に隠れているオブジェクトは描画しません。すると結局、何も描画されなかった部分には、フレームバッファに残っている前のフレームで描画された物が映ります。
この状態で、プレイヤーの視線の向きを動かすと、同じ物が少しずつずれて重なって見えます。この現象は、遊園地などにある鏡張りの壁で作った迷路に似ている事から、Hall of Mirrors(HOM)エフェクトと呼ばれます。

それでは今回は、「デフォルトテクスチャ」ダイアログボックスの三つのテクスチャ欄全てに「BRONZE4」という名前のテクスチャを選択してみて下さい。

次に、床と天井のデフォルトテクスチャも変えてみたいと思います。
この場合、床と天井のテクスチャはセクターの属性になるので、デフォルトのセクターの属性を変える事になります。
デフォルトのセクターを変更するには、ツールバーの中の「デフォルトセクター」ボタン を押すか、または「設定(S)」メニューの中の「デフォルトセクター...」を選択します。
すると、図3のようなダイアログボックスが開きます。



図3 「デフォルトセクター」ダイアログボックス

ここでは、Floor FlatとCeiling Flatの両方ともに、「FLAT5_5」という名前のテクスチャを選択して下さい。残りのフィールドは、そのままで構いません。

以上、デフォルトテクスチャとデフォルトセクターの設定は、現在のところ、設定ファイルには保存されないので起動時には元に戻ります。
『デフォルト』という言葉よりも『カレント』という言葉を使った方がいいような気もしますが、使い方が当初の意図とは変わってきてしまったという事もあります。

それでは実際に、この設定でまず二つのセクターを部屋として作ってみますが、その前に、「表示(V)」メニューの「グリッド」から「32」を選択して下さい。
そして、グリッドで横12個分、縦10個分くらいの四角いセクターを、グリッド一つ分空けて、上下(南北)に二つ作って下さい。
次に、その間に幅がグリッド四つ分の、『窓』になるセクターを作ります(図4)。



図4 『窓』となるセクターを作る

この時、四つの頂点は既存のLinedef上にスナップさせます。セクター描画モード中は、カーソルをLinedefの上に持っていくと、そのLinedefの色が赤色に変わりますので、その時にクリックして下さい。
ただし、Linedefにスナップさせた時は、たとえグリッドへのスナップが有効になっていても、Linedefへのスナップの方が優先されるので、頂点が格子点の上には乗らない場合があります。そのような時は、セクターの作成後に、頂点をドラッグアンドドロップでわずかに移動させてから離すと、格子点に吸着させる事が出来ます。

次に、作り終わった『窓』になるセクターを選択して、編集ダイアログボックスを呼び出して下さい。そこで、Floor Heightを32、Ceiling Heightを80に変更して下さい。
また、二つの部屋の違いを多少出すために、下(南)側のセクターと『窓』セクターのLight Levelを255まで上げてみて下さい。

最後に、下(南)側のセクターの真ん中あたりに、Thingの「Player 1 start」を置いて下さい。
この状態で「マップをプレイ」コマンドを実行してみて下さい。

おそらく、マップ内を観察すると、窓の上の部分と下の部分のテクスチャの位置が、横のテクスチャと合っていない事に気づかれると思います。
これは、DOOMのデフォルトでのテクスチャの貼られ方が、Middle TextureとLower TextureではトップダウンUpper Textureではボトムアップになるからです(図5)。



図5 デフォルトでのUpper、Middle、Lower Textureの貼られ方

これを修正するには、まず『窓』セクターと下(南)側のセクターとの両方に面しているLinedefを選択して、編集ダイアログボックスを呼び出します。
そこで、「Flags」と書かれたグループボックスの中の「Upper Unpegged」と「Lower Unpegged」にチェックを入れて下さい。

「Upper Unpegged」とは、Upper Textureの貼り方をデフォルトのボトムアップからトップダウンに変える事を指定するフラッグです。
一方、「Lower Unpegged」はMiddle TextureとLower Textureの両方のテクスチャの貼り方を指示しますが、両者では解釈の仕方が異なります。
まず、Middle Textureに適用されると、単純にデフォルトのトップダウンをボトムアップに変更します。
Lower Textureの場合は、セクターの高さがテクスチャの高さと同じでない、あるいは整数倍でない時に、単にトップダウンをボトムアップに変えただけでは、隣の壁のMiddle Textureとは揃いません。そこで、Lower TextureにUnpeggedが適用された場合は、面しているセクターの天井がテクスチャ座標の始点になるような座標位置で貼られます。こうする事によって、セクターの高さがテクスチャの高さの整数倍になっていない場合でも、隣の壁のMiddle Textureと揃うようになります。

これで、プレイヤーがいる部屋に面している窓の上下の壁のテクスチャは揃いましたが、まだ、窓の側面の壁の部分が隣り合った壁と合っていません。
この部分は壁のテクスチャの縦方向が、途中から始まって途中で終わっているので、Unpeggedを適用しただけではうまくいきません。
このような時は、Sidedefの属性であるテクスチャのオフセット機能を利用します。
まず、窓の側面の壁の部分にあたるLinedefを選択して、編集ダイアログボックスを呼び出して下さい。この部分はSingle-sided Linedefになるので、「Right Sidedef」と書かれたタブが一つだけあるはずです。
その中の「Y offset」と書かれたエディットボックスに、48を入力して下さい。
このタブの中にあるX offsetとY offsetは、テクスチャを描画する時に、壁の左上隅での開始点が、テクスチャ座標でいくつの位置になるかを指定します。ただし、テクスチャ座標でのY方向は、上から下へ向かうのが正の方向である事に注意して下さい。
ここでは、部屋セクターの天井の高さが128、窓セクターの天井の高さが80なので、その差の48を入力する事により、窓の側面の壁のテクスチャのY座標が48から始まるようになります。

以上の設定が終わったら、もう一度マップをプレイしてみて下さい。今度は図6のように、窓の周りのテクスチャが揃って見えるはずです。



図6 修正後のマップの状態

ちなみに、テクスチャに関する属性であるUpper UnpeggedとLower Unpeggedが、SidedefではなしにLinedefの属性になっているのは少しわかりづらい気もしますが、結局、Upper TextureやLower TextureはLinedefの片面にだけしか現れないので、Sidedefで指定するよりも無駄がないという事だと思います。

最後に、Two-sided LinedefのMiddle Textureに『柵』などのMasked Textureを使った時の注意点を述べておきます。
まず、Two-sided Linedefの両側のセクターの床の段差が24以下、あるいは床が高い方のセクターから低い方のセクターに行く時、天井の高さもプレイヤーが入って行ける分の高さがあると、柵などのMiddle Textureがあっても、そのままでは通り抜ける事が出来てしまいます。
これを防ぐには、Linedef編集ダイアログボックスの「Flags」グループボックスの中にある「Impassable」にチェックを入れます。
もう一つ、Two-sided LinedefにMiddle Textureを適用する時に注意する点は、通常はテクスチャが貼られる壁のスペースがそのテクスチャよりも大きかった場合は、タイル状に繰り返して貼られますが、Two-sided LinedefのMiddle Textureだけは、上下方向には繰り返しません。
図7は、DOOMUのMAP01のスタート地点付近の光景ですが、『手すり』のテクスチャは空いているスペースがあっても、上下には繰り返していない事がわかると思います。
また、この場合はLower Unpeggedを適用してボトムアップにする必要もあります。



図7 DOOMUのMAP01のスタート地点付近