5章 Lua拡張命令
著者:梅谷 武
語句:ToposNote, Lua, 描画機構, 照明, シェーディング, Lua拡張命令, tn命令, dx命令
Lua拡張命令の仕様について述べる。
作成:2009-12-26
更新:2011-03-08
 ToposNoteにはLuaインタプリタを拡張したものが組み込まれています。ToposNoteを使うにあたって必ずしもLuaの知識は必要ありませんが、Luaを習得することによってさらに便利なツールとなります。
 Lua言語については、文献[1,2,3]のような解説書や多数のWebコンテンツがありますから、本マニュアルではToposNote向け拡張機能についてのみ述べることにします。
 Luaを使う際の注意事項として、Luaは日本語に対応していないということがあります。LuaスクリプトはすべてASCIIコードで書かなければなりません。スクリプト中で参照するファイル名、フォルダ名も例外ではありません。
 このため、ToposNoteをインストールするフォルダ名、ToposNoteに貼り付けるさまざまなデータを含むフォルダ名もASCIIコードで書かれている必要があります。
 Luaは汎用のスクリプト言語であり、標準ライブラリには入出力機能やOSのシステムコールを呼び出す機能を備えていますから、コンピューター内のファイルを自由に操作できます。したがって、その実行には危険性が伴うことに注意しなければなりません。
 ToposNoteでは、初期状態ではLuaスクリプト実行時にダイアログボックスで確認するようになっていますが、これはユーザーに対して注意を喚起することを目的としています。出所不明のLuaスクリプトを実行する際には、事前に処理内容を確認するようにしてください。
Luaスクリプト実行確認
 このダイアログボックスは[メニュー]→[動作]→[Lua]のチェックボックスをチェックすることで表示しないようにすることができます。
 ToposNoteに貼り付けられた物体はプログラム内部では、トポスオブジェクトの連想配列としてオブジェクトの種類に固有な方法で格納されています。
 ToposNoteはユーザーやシステム環境から送らてくるさまざまなメッセージを優先的に処理し、そのアイドル時間に連想配列に登録されたトポスオブジェクトを順番に描画していきます。
 Lua拡張命令によって定義された図形オブジェクトも上の連想配列に登録されて順番に描画されますが、Lua拡張命令はデータではなく、中間言語形式の命令列として保存されており、描画時にこの命令列が順番に実行されていきます。この機構は他のトポスオブジェクトの処理機構とは別になっているため、Lua拡張命令で定義された図形は移動、拡大縮小、削除は可能ですが、トポスオブジェクトのようにコピーができません。
 移動可能な白色平行光源が定義されています。
環境光 ( 0.6, 0.6, 0.6, 1.0 )
拡散光 ( 1.0, 1.0, 1.0, 1.0 )
鏡面光 ( 0.8, 0.8, 0.8, 1.0 )
 初期状態でグーローシェーディングに設定されています。
 Luaによる作図法はToposNoteに組み込まれたLua拡張命令と、Luaにより記述された外部の幾何ライブラリを併用して行なわれます。この章ではLua拡張命令の仕様を記述し、次の章で幾何ライブラリの仕様を記述します。
 これらを使った作図法の詳細やその基礎となる幾何学については次の文献を参照してください。
 ToposNoteをインストールしたディレクトリがカレントディレクトリとなり、相対パス指定はこれを基準とします。相対パス指定したい場合は、作業ディレクトリをインストールディレクトリ下に置いてください。そうで無い場合は、絶対パス指定してください。
 なお、パス指定に日本語は使えませんので注意してください。
 ToposNoteにおけるLua拡張命令には、tn命令とdx命令の二種類があります。tn命令はToposNote本体に対する動作指示で、Luaインタプリタで解釈された時点で実行されます。dx命令はDirectXに対する命令で、Luaインタプリタでの解釈時には、中間言語に変換されてdx命令バッファに格納されるだけです。tn命令:tnNewObject()が実行されたときに、dx命令バッファ全体が新しい図形オブジェクトとして生成され、dx命令バッファが消去されます。
Lua拡張命令の実行機構

tnOKBeep

引数 無し
機能 Windowsにおける一般警告音を発する。

tnNGBeep

引数 無し
機能 Windowsにおけるシステムエラー音を発する。

tnRender

引数 無し
機能 命令実行時のトポスオブジェクト連想配列を描画する。

tnSleep

引数 待ち時間[msec]
機能 指定時間だけ処理を停止する。

tnOutput

引数 文字列
機能 指定文字列をLua出力ダイアログに表示する。

tnCursor

引数(1) Cx, Cy, Cz
引数(2) Cx, Cy, Cz, Lat, Lng, Zoom, Proj, Coord
機能 カーソルを指定位置に移動する。引数にカーソル中心位置、カメラ緯度、カメラ経度、ズーム番号、投影法(0:平面/1:立体)、座標系(0:幾何/1:測地)を指定することができる。

tnCursorGeo

引数 Lat, Lng, Alt
機能 tnCursorにおいて、位置を緯度・経度・標高で指定するときに使う。

tnLoadObject

引数(1) 名前, ファイル名
引数(2) 名前, GPSファイル名, r, g, b, LineWidth
引数(3) 名前, ファイル名, Mx, My, Mz, Yaw, Pitch, Roll, Scale[,Flag]
機能 指定ファイルから指定名の新しいトポスオブジェクトを生成する。引数で連想配列に登録するときの名前、位置座標、オイラー角、拡大縮小係数、[表示フラグ]を指定することができる。GPSファイルにより、GPS軌跡を生成するときは表示線色と線幅を指定する。

tnLoadObjectGeo

引数 名前, ファイル名, Lat, Lng, Alt, Yaw, Pitch, Roll, Scale[,Flag]
機能 tnLoadObjectにおいて、位置を緯度・経度・標高で指定するときに使う。

tnSetTrajectory

引数(1) 名前, 運動軌跡数, 運動軌跡配列
引数(2) 名前, GPSファイル名
機能 指定名のトポスオブジェクトに運動軌跡を設定する。GPS軌跡ファイルからも運動軌跡を設定することができる。

tnSetAssosiation

引数 名前, ファイル名
機能 指定名のトポスオブジェクトにファイルを関連付ける。

tnSetDispSW

引数 名前, Flag
機能 指定名のトポスオブジェクトの表示フラグ(0:非表示/1:表示)を設定する。

tnNewObject

引数(1) 無し
引数(2) 名前
引数(3) 名前, Mx, My, Mz, Yaw, Pitch, Roll, Scale[,Flag]
機能 dx命令バッファから新しいトポスオブジェクトを生成し、dx命令バッファを消去する。引数で連想配列に登録するときの名前、位置座標、オイラー角、拡大縮小係数、[表示フラグ]を指定することができる。

tnNewObjectGeo

引数 名前, Lat, Lng, Alt, Yaw, Pitch, Roll, Scale[,Flag]
機能 tnNewObjectにおいて、位置を緯度・経度・標高で指定するときに使う。

dxSetRenderState

引数 デバイス状態名, 状態値
機能 デバイス状態名と状態値の詳細については、MSDNのIDirect3DDevice9::SetRenderStateの項目を参照のこと。幾何ライブラリ(DirectX.lua)にはDirectXのすべてのデバイス状態名と状態値が定義されている。

dxSetMaterial

DirectX内部において材質はD3DMATERIAL9構造体で表現される。
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse;        // 拡散反射色(Dr,Dg,Db,Da)
D3DCOLORVALUE Ambient;        // 環境反射色(Ar,Ag,Ab,Aa)
D3DCOLORVALUE Specular;       // 鏡面反射色(Sr,Sg,Sb,Sa)
D3DCOLORVALUE Emissive;       // 発光色(Er,Eg,Eb,Ea)
float Power;                  // 鏡面反射係数
} D3DMATERIAL9;
引数 Dr,Dg,Db,Da,Ar,Ag,Ab,Aa,Sr,Sg,Sb,Sa,Er,Eg,Eb,Ea,power
機能 D3DMATERIAL9構造体により材質を設定する。

dxSetColor

引数(1) R成分, G成分, B成分
引数(2) R成分, G成分, B成分, A成分
機能 RGB表色系により材質を設定する。

dxSetColorHSV

引数(1) H成分, S成分, V成分
引数(2) H成分, S成分, V成分, A成分
機能 HSV表色系により材質を設定する。

dxSetTexture

引数 ファイル名
機能 指定ファイルの画像をテクスチャとして設定する。

dxSetLinePattern

引数 破線パターン
機能 破線パターンを設定する。

dxSetLineWidth

引数 線幅
機能 線幅を設定する。

dxSetLinePatternScale

引数 破線拡大縮小係数
機能 破線拡大縮小係数を設定する。

dxPushMatrix

引数 無し
機能 変換行列スタックを一段下に押し下げる。最上位行列はそのまま保持されるので、最上位と二段目には同じ行列が格納される。

dxPopMatrix

引数 無し
機能 変換行列スタックを一段上に押し上げる。最上位行列は破棄され、二段目の行列が最上位に格納される。

dxMultMatrix

引数 (4,4)行列(C言語形式の16個の数列)
座標系 左手系
機能 変換行列スタックの先頭に指定行列を右から乗ずる。

dxRotate

引数 角度,x,y,z
座標系 左手系
機能 原点から指定座標までのベクトルを軸とし、指定した角度だけ回転させる行列を、変換行列スタックの先頭に右から乗ずる。

dxLine

引数(1) 頂点数, 頂点配列
引数(2) 頂点数, 頂点配列, R成分, G成分, B成分
座標系 左手系
機能 指定された頂点列の折れ線を描く。色指定ができる。

dxPolygon

引数 辺長, 辺数
座標系 左手系
機能 指定した辺長と辺数の正多角形を原点を中心とするXY平面上に描く。

dxTriangleMesh

引数 頂点数, 頂点配列, 面数, 面配列
座標系 左手系
機能 一つの頂点データは(頂点ベクトル, 法線ベクトル, テクスチャ座標)という八個の浮動小数点数の組である。頂点配列は8×頂点数個の浮動小数点数の配列になる。面データは三個の頂点番号の組である。頂点番号とは0から始まる配列の添字のことである。面配列は3×面数個の整数配列になる。

dxBox

引数 X軸方向幅, Y軸方向高さ, Z軸方向深さ
座標系 左手系
機能 指定した幅、高さ、深さの直方体を原点を中心として描く。

dxSphere

引数 半径, 縦分割数, 横分割数
座標系 左手系
機能 指定した半径、縦分割数、横分割数の球を原点を中心として描く。

dxCylinder

引数 負面半径, 正面半径, 長さ, スライス数, スタック数
座標系 左手系
機能 指定した負面半径、正面半径、長さ、スライス数、スタック数の円柱を原点を中心として描く。負面・正面とはZ軸に関するものであり、スライス数は主軸を回転軸とするときの円周の分割数であり、スタック数は主軸に沿った分割数である。

dxTeapot

引数 無し
座標系 左手系
機能 原点を中心としてティーポットを描く。

dxText

引数 TrueTypeフォント名, サイズ, 文字列, 最大偏差, 深さ
座標系 左手系
機能 原点を中心として指定したTrueTypeフォント名、サイズ、文字列、最大偏差、深さの文字列を描く。TrueTypeフォント名と文字列にはシフトJISコードを使うことができる。最大偏差とはアウトラインフォントからの許容誤差の最大偏差を意味し、深さはZ軸方向の深さを意味する。

dxPrint

引数 x座標, y座標, z座標, r成分, g成分, b成分, 文字列
座標系 左手系
機能 位置と色を指定して注釈文字列を平面的に描く。シフトJISコードを使うことができる。

HeightMesh

標高メッシュ
引数 x0, y0, x1, y1, w, h, 標高データ配列
座標系 右手系
機能 世界座標系におけるXY平面上、指定された矩形領域上の標高データを使ってメッシュを描画する。
[1] 上野 豊, 入門Luaプログラミング, ソフトバンククリエイティブ, 2007
img
 
 
[2] 浜中 誠, スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践, ソフトバンククリエイティブ, 2008
img
 
 
[3] Roberto Ierusalimschy, Programming in Lua プログラミング言語Lua公式解説書, アスキー・メディアワークス, 2009
img
 
 
[4] OpenGL ARB, OpenGLプログラミングガイド 原著第5版, ピアソンエデュケーション, 2006
img
 
 
Published by SANENSYA Co.,Ltd.