AREA 021
Featuring AlphaScript

関数リスト 〜その3〜

AlphaScript に用意されている関数を解説しているページです。
ここでは、新しく追加された3D描画機能に関するものを紹介します。

関数名の後のカッコの中は必要な引数を表しています。
同じ関数名でも、引数の数によって処理が変わるものもあります。

引数の中で、画像など数値以外を指定するとされているものは、
正確にはその識別番号を数値で指定する、という意味です。

また、戻り値について説明のない関数は常に 0 を返します。

 

★ 3D描画関連 ★

ClearRenderer各種設定をクリア
SetSurfaceDirectionポリゴンの向きの設定
SetScanDirectionスキャン方向の設定
SetMappingMethodマッピング方法の設定
SetViewportビューポートの設定
SetPerspective遠近感の設定
SetClippingZクリッピング座標の設定
ClearBufferZバッファをクリア
SetTextureテクスチャを指定
SetVertex頂点をセット
SetLight光源をセット
DrawSurfaceポリゴンを描画

 

★ 3D行列 ★

MatrixIdentity行列を初期化
MatrixSize拡大・縮小変換
MatrixMove平行移動変換
MatrixRotateXYZ軸回転変換
MatrixRotateXZY軸回転変換
MatrixRotateYZX軸回転変換
MatrixTransform行列を適用

 

● 3D描画関連 ●

3Dの解説はどうしても専門用語が多くなってしまいます。(-_-;
なので、各用語の意味を簡単に書いておきます。
もっと詳しい&正確な説明は、それ系のサイトを参照してくださいね〜。

レンダラ: 3D描画をするシステムのこと
ポリゴン: 3Dオブジェクトの「面」のこと
テクスチャ: ポリゴンに貼り付ける画像のこと
Z座標: 手前〜奥の位置のこと(数値が多くなるほど遠い)
※ ポリゴンは、関数名では polygon ではなく surface(サーフェス)としています。
英語の polygon は本来「多角形」という意味だったりします。


ClearRenderer ( )

レンダラの各種設定を初期状態にします。


SetSurfaceDirection ( dirc )

ポリゴンの向きを設定します。  ポリゴンは、裏側からは見えない(=描画しない)ので、その向きを判定する基準があります。  dirc がプラス値なら各頂点を辿ったとき時計回りになれば表、マイナス値なら反時計回りが表になります。  dirc を 0 にした場合は、表裏関係なく描画されます。  初期状態では「時計回り」になっています。(たぶん、普通はそうです)


SetScanDirection ( dirc )

ポリゴンを描画する際のスキャン方向を設定します。  dirc が 0 なら横、それ以外なら縦になります。  スキャン方向は、描画速度やテクスチャの歪みなどに影響します。  基本的には、横長で描かれるポリゴンは横スキャン、縦長で描かれるポリゴンは縦スキャンが適していると言えます。  初期状態では、横スキャンになっています。


SetMappingMothod ( method )

テクスチャマッピングの方式を指定します。  これは、テクスチャ付きのポリゴンを描画する際に影響します。  method にマイナス値を指定すると「適当モード」となり、最も高速に描画できますが、各頂点の遠近によってテクスチャが歪みます。  method に 0 を指定すると「線補間モード」となり、スキャン方向が横(縦)の場合に向きが水平(垂直)なポリゴンを正確&高速に描画できます。  method にプラス値を指定すると「完全モード」となり、速度は遅いですが、テクスチャをなるべく正確に描画します。  初期状態では「完全モード」になっています。

なお、特に「線補間モード」と「完全モード」では、描画の精度に限界があるため、 画像を拡大し過ぎるとマッピングが不正確になり、見た目が粗くなったりします。


SetViewport ( pt )

ポリゴン描画の際のビューポート(またマニアックな用語が^^;)を設定します。  簡単な例を言えば、pt で指定した値が 2.0 であれば、描画される3Dモデルのサイズが2倍になります。  デジタルカメラのズーム機能を想像すればわかりやすいと思います。  初期設定では 1.0 になっており、これはカメラのすぐ手前にあるポリゴンのサイズがそのままピクセル数になる状態です。


SetPerspective ( ps )

遠近感を設定します。  具体的には、ps に「大きさが半分に見える位置のZ座標」を指定します。  初期設定では 1.0 になっており、これだとスケールの大きい3Dモデルは小さすぎて見えなくなりますので、 モデルの大きさと位置を考慮し、適切な値に変更してください。  この値をものすごく大きくすれば、限りなく遠近感の無い3Dにすることもできます。


SetClippingZ ( clipZ )

描画の対象となるZ座標の限界値を clipZ で指定します。  ここで指定した値より遠くにあるものは描画されません。  初期状態では、どんなに遠くにあっても描画されます。


ClearBufferZ ( )

ポリゴンを描画する際のZ座標の前後関係をクリアします。  3Dで画面を描き直す前に必ず実行するのが基本です。  描画範囲が指定されている場合、その範囲内のみが対象になります。  また、手前にあるポリゴンを描いた後に、手前のポリゴンに隠れる位置にあるポリゴンを描いても、通常は奥のほうのポリゴンは描画されません。  しかし、手前のポリゴンを描いた後にこの関数を呼び出せば、その後に描いた奥のポリゴンも表示させることができます。(3D的にはおかしくなりますが)


SetTexture ( img )

描画するポリゴンに貼り付ける画像を img に指定します。  画像の幅・高さがそれぞれ 2 の n乗 だと、描画が高速になります。  また、透過ピクセルがあれば、その部分は描画されません。  img に無効なID( -1 など)を指定すると、テクスチャ設定を解除できます。  初期状態では、テクスチャは設定されていません。


SetVertex ( list )

ポリゴンの描画に使用する「頂点」を設定します。  この頂点を結ぶことでポリゴンを表現することになります。  各頂点の内容は、list の中身によって決まり、最大で 100 個までの頂点を指定できます。

頂点は「X座標, Y座標, Z座標, テクスチャX座標, テクスチャY座標」の5つの値によって表現され、list はこれを並べた配列、ということになります。  例えば、3つの頂点を設定したければ、上記の要素を3回繰り返した計15個の値を指定する必要があります。 (この関数は設定した頂点の個数を返しますが、要素の個数が余った場合、エラーとなり -1 を返します)

X座標とY座標の意味は、2D描画と同じです。(一般的な3Dシステムでは「Y座標が大きい=高い位置」となっていたりしますが、混乱しそうなのでこうしました)  座標の単位は「 1.0 = スクリーン上の1ピクセル 」が基本となっています。  テクスチャの座標は、それぞれ 0.0 が画像の左端(上端)、1.0 が画像の右端(下端)になります。  マイナス値や 1.0 より大きい値を指定するとテクスチャを繰り返し並べた模様のようにすることもできますが、 指定できる座標は -4.0 〜 4.0 までで、範囲が大きくなるほどマッピングが粗くなるかもしれません。  また、四角形のポリゴンの場合、各頂点で指定されている座標によっては、画像が歪むことになり、この場合は正確に描画されないことがあります。


SetLight ( list )

ポリゴンの描画に使用する「光源」を設定します。  搭載されている光源システムは簡易なものなので、生活の中の光とはだいぶ違いますが、これが無いとレンダラという感じがしないので、ご用意しました。  この光源がポリゴンの明るさに影響するため、これを設定しなければポリゴンが真っ黒になります。  また、光源が複雑に設定されるほどポリゴンの描画に時間がかかります。  ポリゴンの数が少ない立体では、思ったような効果を得られない場合があります。  各光源の内容は、list の中身によって決まり、最大で 100 個までの光源を指定できます。

光源は「X座標, Y座標, Z座標, 色R, 色G, 色B, 最大距離, ハイライト距離、有効角度」の9つの値によって表現され、list はこれを並べた配列、ということになります。  例えば、2つの光源を設定したければ、上記の要素を2回繰り返した計18個の値を指定する必要があります。  (この関数は設定した光源の個数を返しますが、要素の個数が余った場合、エラーとなり -1 を返します)

色RGBは、光源の赤緑青の光の輝度ををそれぞれ 0.0 〜 1.0 の間で指定します。(すべてゼロだと全く影響しない光になります)  「最大距離」は光が届く最大の距離(ものすごく大きな値にすれば全体を照らす)で、 「ハイライト距離」は光の明るさが最大になる範囲を最大距離に対する割合(0.0〜1.0)で指定します。  「有効角度」は -1.0 〜 1.0 の間で指定し、 1.0 ならポリゴンがどんな角度でも100%の光になり、 -1.0 ならポリゴンが光源に対して正面を向いていても全く照らされなくなります。


DrawSurface ( list )

ポリゴンを指定し、描画対象となっているイメージに描画します。  ポリゴンは3つまたは4つの頂点を結んで作ります。  描画面積の大きいポリゴンや、テクスチャが指定されているポリゴンのほうが描画処理が重いです。  各ポリゴンの内容は、list の中身によって決まり、最大で 1000 個までのポリゴンを指定できます。  2D用の描画モードの設定などは適用されません。

ポリゴンは「頂点1, 頂点2, 頂点3, 頂点4, 色R, 色G, 色B 」の7つの値によって表現され、list はこれを並べた配列、ということになります。  例えば、5つのポリゴンを描画したければ、上記の要素を5回繰り返した計35個の値を指定する必要があります。 (この関数は描画したポリゴンの個数を返しますが、要素の個数が余った場合、エラーとなり -1 を返します)

頂点4をマイナス値にすると、3つの頂点によるポリゴンになります。  各頂点は、SetVertex で指定した頂点のID( 0 から順に番号が付きます)が1周するように指定します。  頂点が1つでも無効だったり、表向きになっていなければ、そのポリゴンは描画されません。  色RGBは、ポリゴンが受け付ける光の輝度をそれぞれ 0.0 〜 1.0 の間で指定するので、 この値によっては SetLight で光源を指定しても、光を吸収してしまうので無効です。  テクスチャが指定されていない場合、ここで指定する色で塗りつぶされたポリゴン、ということになります。

 

● 3D行列 ●

MatrixIdentity ( mtx )

行列を初期化(何も変換しない状態に)します。

行列は3D上の点(頂点や光源)を一括で移動したり大きさを変えたりするのに便利です。  例えば、「カメラの位置と向き」を動かすには、実際には空間に存在するすべての物を水平方向に動かしたり回転したりしなければなりませんが、 行列を使えば、位置や角度を設定した後、関数を1回呼び出すだけでまとめて変換することができます。  行列は変換の順番も考慮されるため、拡大した後に移動してからまた拡大する、のような変化でもOKです。

AlphaScript では「行列」を16個の要素を持つ配列で表現します。  この関数も含め、行列に関する関数は引数に mtx を指定しますが、ここには行列として扱う16個の要素を指定してください。  mtx の要素の数が16個でなければ、これらの関数は何も行いません。  また、mtx に指定した配列の中身は各関数を実行するたび変化しますが、それを意識する必要はないです。


MatrixSize ( mtx, x, y, z )

mtx で指定した行列に、X方向に x 、Y方向に y 、Z方向 z の拡大・縮小を設定します。  例えば、x に 2.0 、y に 0.5 、z に 1.0 を指定すると、行列を適用した後、頂点の座標は X が 2倍、Y が半分になります。


MatrixMove ( mtx, x, y, z )

mtx で指定した行列に、X方向に x 、Y方向に y 、Z方向 z の平行移動を設定します。  例えば、x に 100.0 、y に 0.0 、z に -100.0 を指定すると、行列を適用した後、頂点の座標は X が +100、Z が -100 されます。


MatrixRotateXY ( mtx, angle )

mtx で指定した行列に、Z座標を軸とした angle の分だけの回転を設定します。  例えば、angle に 45 を指定すると、X座標とY座標が45度回転変換されます。


MatrixRotateXZ ( mtx, angle )

mtx で指定した行列に、Y座標を軸とした angle の分だけの回転を設定します。  例えば、angle に -90 を指定すると、X座標とZ座標が-90度回転変換されます。


MatrixRotateYZ ( mtx, angle )

mtx で指定した行列に、X座標を軸とした angle の分だけの回転を設定します。  例えば、angle に 180 を指定すると、Y座標とZ座標が180度回転変換されます。


MatrixTransform ( mtx, ary, opt )

mtx に指定した行列を使い、配列 ary の中の座標を変化させます。  ary はX座標・Y座標・Z座標が並んで繰り返される形式になっている必要があります。  ary の中に含まれる全ての座標に、これまで行列に設定した全ての変換が同時に適用されます。

opt には座標データの後にある無関係な要素の個数を指定できます。  例えば、頂点のデータを格納した配列は、座標以外に2つの変数が用意されているため、 opt に 2 を指定すれば「頂点の座標を変換する」という処理を直接行えます。  この関数は処理した座標の個数を返しますが、opt の数も含めて要素が余ったりすると、変換は行わず -1 を返します。

このようなオプションは、配列でいろんなものを表現する AlphaScript 特有のもので、 他の開発環境ではこういうやり方をすることは全くないかもしれません。(^^;  また、このようなデータの区切りの指定を間違えると、結果がメチャクチャになってしまう可能性があるのでご注意を!

 

ページ一覧に戻る

Copyright (c) Rabit 2005-2012 all rights reserved.