南側から見た図
北側から見た図
SCASM のソース
1 Header( 1 N35:15 N35:00 E137:00 E136:45 ) 2 LatRange( N30:00 N40:00 ) 3 4 Area( 5 N35:12:46 E136:54:58 10 ) 5 PerspectiveCall( :Sub ) 6 Jump( : ) 7 8 :Sub 9 Perspective 10 Refpoint( 7 :No_object 1 N35:12:46 E136:54:58 ) 11 12 Points( 1 13 -4 0 -6 ;point 1 14 -4 4 -6 15 0 5 -6 16 4 4 -6 17 4 0 -6 18 2 0 -6 19 2 3 -6 20 -2 3 -6 21 -2 0 -6 ;point 9 22 -4 0 6 ;point 10 23 -4 4 6 24 0 5 6 25 4 4 6 26 4 0 6 ;point 14 27 ) 28 29 SurfaceColor( 04 F0 ) 30 ConcavePoly 31 Poly( a 1 2 3 4 5 6 7 8 9 ) ; 南側の壁 32 Poly( a 1 2 11 10 ) ; 西側の壁 33 Poly( a 10 11 12 13 14 ) ; 北側の壁 34 Poly( a 5 4 13 14 ) ; 東側の壁 35 Poly( a 2 3 12 11 ) ; 西側の屋根 36 Poly( a 3 4 13 12 ) ; 東側の屋根 37 38 :No_object 39 Return 40 41 EndA先程の例にくらべるとちょっと複雑になっていますが、良く見ると 変わったのは 12 から 36 行目の部分だけです。以下、これを説明していきます。
先程のハンガーの図を見てください。角の部分に番号がついていますね。 これが「点の番号」です。SCASM では、オブジェクトを作るさい、まず点を定義 しておき、つぎにその点を繋いだりしてオブジェクトを作成していきます。
点の定義を行っているのが 12 行目から 27 行目の部分です。 Points 命令が点の定義を開始する命令です。その直後に書いてある 1 という 数字はこれから定義を開始する最初の点の番号です。
そのあとの行で点の定義を行っています。3つの数値を一組にして点を一つ 定義しています。ここでは 14 個の点を定義しています。最初の点の番号が 1 ですから、ここでは 1 番から 14 番の点を定義しています。この番号は 先程のハンガーの図の角の番号に対応します。
点を定義するときは、「RefPoint からの相対座標」で値を定義します。 また、値は3つ組みで、順に X座標、Z座標、Y座標です。X 座標は東方向、 Y 座標は北方向、Z 座標は上方向になります。 たとえば、一番の点の定義は -4 0 -6 になっていますが、これは RefPoint の西 4 m, 南 6 m, 上に 0 m の点になります。(なお、これは RefPoint の スケーリングファクタが 1 の場合です。)
まず、29行目でこれから描画する面の色を設定します。ここでは 白色に指定しています。色についてはあとで詳しく述べます。
次に南側の壁を描きます。29 行目の ConcavePoly は、これから描く 面が凹型の面であることを指定しています。これがないとうまく表示されません。
そして 31 行目で面を描きます。Poly がポリゴンを描く命令で、1番から 9番までの点を順につないで、囲まれた面を塗りつぶしています。 同様にしてすべての壁と屋根を描画します。なお、南側の壁以外は凹型の面 ではないので、ConcavePoly は必要ありません。
ところで、このようにしてすべての面を描いてしまったら隠れている面も 描かれてしまう、と思うかもしれませんね。たとえば、南側からハンガー を見ている場合は北側の壁は見えないはずです。
実はこのような心配はいりません。なぜなら、すべてのポリゴンは 表側からしか見えないからです。表と裏の指定は SCASM を使えば ほぼ自動でやってくれます。それが、Poly 命令の1番目の引数の "a" (Auto の意味)で、これを指定しておけば表裏の判定を自動でやってくれます。
詳細は次の「隠面処理について」で説明します。
00 black 01 dark gray 02 gray 03 light gray 04 white 05 red 06 green 07 blue 08 orange 09 yellow 0A brown 0B beige 0C orange/brown 0D green/gray 0E blue/marineなお、上に挙げた色は時刻や光の当たり具合によって色が変わります。 こんな感じです。
それに対して以下の色は変化しません。主にイルミネーションに使用します。
0F red 10 green 11 blue 12 dark green/blue 13 orange 14 yellow 15 white (high intensity) 16 white/light gray (low intensity)
色の指定を行う場合は、この値のあとに 'F0' をつけて使います。 たとえば青色なら "07 F0" と指定します。
なお、F0 を後ろにつける F0 カラーの他に、68 カラーや 69 カラーと いったものがあります。 68 カラーは FS のパレット番号を直接指定するもの、69 カラーは 半透明色(影の描画などに使っているもの)を指定するようです。 でも普通は F0 カラーが使えれば十分でしょう。