VCコマンド一覧(Ver.1.0)

定義・宣言系コマンド

void
 値を返さない関数の宣言に用いる
int
 本処理系では、整数は32ビットのメモリを使う
 宣言されずに定義・参照された関数、変数、配列は、整数型として扱う
float
本処理系では、浮動小数点数はINTと同じく32ビットのメモリを使う
quat
本処理系では、四元数は256ビットのメモリを使う。4の64ビットの浮動小数(t,x,y,z)を束ねたものである
 Ver.1.0においては、一次元の配列を変数として宣言し使用することができる。
[例] quat q[10000];

記憶・運動系コマンド

コマンドと同名のライブラリ関数を起動して能動的処理を行う。
実行した場合の処理内容は、処理系による。
Ver.1.0においては、以下の3種類の処理系が実装されている。
IP:LSSG形式でファイル出力を行う(景観シミュレータのネイティブ)
DML:メモリ空間にデータを構築し、仮想現実表示を行う
SQL:データベース上にデータを構築する
将来的には、三次元加工機やロボットを動かすような処理系もありうる

int COORD(float x, float y, float z)
int COORD(quat q)
 座標データを定義する
int NORMAL(float x, float y, float z)
int NORMAL(quat q)
法線データを定義する
int COLOR(float r, float g, float b)
色データを定義する
int COLOR(float r, float g, float b, float a)
int COLOR(quat q)
a は不透明度を表すα値(0.0で透明、1.0で不透明、その中間は半透明)
  R,G,B,Aの値は、0.0~1.0
 省略された場合には、1.0とする
  quatの場合、a,r,g,bの順
int TCOORD(float x, float y)
int TCOORD(quat q)
テクスチャ座標を定義する
U,V は、それぞれ、画像上の水平位置、垂直位置を示す二次元座標
画像の左下を原点(0.0, 0.0)とし、右上を(1.0,1.0)とする
quatの場合、0,U,V,0の順

以上4コマンドの戻り値は、定義した各要素のID番号である

int VERTEX(int coord, int normal, int color, int tcoord, int coord)
頂点を定義する仮想関数
引数は、省略することができる
引数は、各ID値を格納した一つの変数でなければならない(数値や数式は不可)
定義された頂点には、変数のアドレスが登録される
各変数の内容が書き換えられた場合、VERTEXも連動して変化する
GROUP_FACEまたはGROUP_LINEコマンドが実行された時点で数値・形状が確定する
int FACE(int vertex1, int vertex2, ...)
面を定義する
引数は、頂点のID値を格納したひとつの変数
引数の数は任意数
vertexは、単一の変数でなければならない
vertexが参照する各変数の内容が書き換えられた場合、vertexも連動して変化する
GROUP_FACEコマンドが実行された時点で数値・形状が確定する
void FACE_VERTEX(int face, int vertex1, int vertex2,...)
定義済みの面の頂点列の末尾に頂点を追加する
引数の数は任意数
vertexは、単一の変数でなければならない
vertexが参照する各変数の内容が書き換えられた場合、vertexも連動して変化する
GROUP_FACEまたはGROUP_LINEコマンドが実行された時点で数値・形状が確定する
int LINE(int vertex1, int vertex2, ...)
面を定義する
引数は、頂点のID値を格納したひとつの変数
引数の数は任意数
vertexは、単一の変数でなければならない
vertexが参照する各変数の内容が書き換えられた場合、vertexも連動して変化する
GROUP_LINEコマンドが実行された時点で数値・形状が確定する
void LINE_VERTEX(int face, int vertex1, int vertex2,...)
定義済みの面の頂点列の末尾に頂点を追加する
引数の数は任意数
vertexは、単一の変数でなければならない
vertexが参照する各変数の内容が書き換えられた場合、vertexも連動して変化する
GROUP_FACEまたはGROUP_LINEコマンドが実行された時点で数値・形状が確定する
int GROUP()
int GROUP(文字列)
立体を定義する
属性を表す文字列は、""で囲われていてもいなくてもよい
二つの整数型引数 void GROUP_ATTRIBUTE(int g, int pos, int len)
定義済みの立体gに属性を追加する
入力ファイル中の属性文字列の開始位置posと長さlenを渡す
void GROUP_FACE(int g, int f1, int f2, ...)
立体を構成する面を指定する
このコマンドが実行された時点での座標値、法線値、カラー値、テクスチャ座標値が確定する
以後、各要素値を変更しても、定義した面は変化しない
void GROUP_LINE(int g, int f1, int f2, ...)
立体を構成する線を指定する
このコマンドが実行された時点での座標値、法線値、カラー値、テクスチャ座標値が確定する
以後、各要素値を変更しても、定義した面は変化しない
int LINK(int gp, int gc)
二つの立体の間に親子関係を定義する
戻り値:定義した親子関係のID番号
親子関係には、相対的な位置関係(移動、回転、スケール)を指定することができる
同一の立体のペアの間にいくつでも親子関係を定義することができる
[例]
L1 = LINK(車体,車輪)
L2 = LINK(車体,車輪)
L3 = LINK(車体,車輪)
L4 = LINK(車体,車輪)
これで四輪車が定義できる
親子関係が循環的に定義されると、無限ループが発生する(エラー)
void LINK_XFORM(int L, mode, type, data)
リンク の位置関係を記述する
(1)Lは、親子関係のID番号
(2)modeはリンクの適用方法を以下の3の予約語から選ぶ
(2-1)LOAD 新たに位置関係を設定する
(2-2)PRE これまでに定義されている位置関係の前に適用する
(2-3)POSTこれまでに定義されている位置関係の後に適用する
(3)typeは位置関係の指定方法を以下の8の予約語から選ぶ
(3-1)IDENTITY:位置関係はなし、パラメータ引数なし
(3-2)TRANSLATE:平行移動、パラメータ引数は3
(3-3)ROTATE_X:X軸まわりの回転、パラメータ引数は1
(3-4)ROTATE_Y:Y軸まわりの回転、パラメータ引数は1
(3-5)ROTATE_Z:Z軸まわりの回転、パラメータ引数は1
(3-6)ROTATE_A:任意のベクトル軸まわりの回転、パラメータ引数は4
(3-7)SCALE:拡大縮小、パラメータ引数は3
(3-8)MATRIX:パラメータ引数は16
(4)パラメータ引数:typeに応じた数の引数が続く

環境・状況系コマンド

特定の時点・地点における状況を記録する
現在は、携帯端末装置を用いて現場でリアルタイム写真合成を行っている際に、 オペレータがシャッターボタンを押した時点での時刻、背景画像、表示しているモデル、センサーから取得した視点・注視点の座標等の記録を保存し、事務所に戻ってから再生する目的で用いている。
これらのキーワードは、景観シミュレータにおけるLSSSファイルに準拠している。メタファイルからこれらのコマンドを起動する場合には、引数として代数式も用いることができる。
int TIME(float time)
時刻を記録し、ID番号を返す。
int CAMERA(float eye_x, float eye_y, float eye_z, float center_x,float center_y, float center_z, float up_x, float up_y, float up_z, float fovy, float aspect, float znear, float zfar)
視点、注視点等を記録し、ID番号を返す。
int LIGHT(int type, float x, float y, float z, float w, float r, float g, float b)
光源を記録し、ID番号を返す。
int LIGHTGROUP(int l1,int l2,...)
光源の組み合わせを記録し、ID番号を返す。
int MODEL("文字列")
合成表示するモデルを記録し、ID番号を返す。
int IMAGE("文字列")
背景写真の保存ファイル名を記録し、ID番号を返す。
int EFFECT("文字列",...)
特殊効果を記録し、ID番号を返す。
int EFFECTGROUP(int e1, int e2, ...)
特殊効果の組み合わせを記録し、ID番号を返す。
int SCENE(int type, int image_b, int image_f, int model, int lightgroup, int effectgroup, int camera, int time)
シーンを記録し、ID番号を返す。引数はそれぞれの登録項目の戻り値(ID)である。
type は表示方法を示し、0:デフォルト、1:ワイヤー、2:シェーディング、3:テクスチャ

知覚・再生系コマンド

システムのメモリ空間やデータベースに格納されているデータを検索し取り出す
実行した場合の処理内容は、処理系による。
Ver.1.0においては、以下の2種類の処理系が実装されている。
DML:仮想現実表示装置のメモリ空間から三次元データを検索し取得する
SQL:データベースから三次元データを検索し取得する
将来的には、センサーから三次元データを取得するような処理系もありうる
int G()
実体グループ(立体)のリストを作成し、順次アクセスする
戻り値:現在選択されているグループのID
全てのグループのアクセスを終了するとゼロ
int D()
表示グループ(立体)のリストを作成し、順次アクセスする
戻り値:現在選択されているグループのID
全てのグループのアクセスを終了するとゼロ
[解説]例えば100匹の同形のセミが止まった同形の木が200本空間に配置されているとする。
 この時、実体グループ数は2(木とセミ)であり、表示グループ数は、20,200=(100+1)*200である。
int F()
現在選択されているグループに属する面・線のリストを作成し、順次アクセスする
戻り値:現在選択されている面・線のID
int Fshp()
戻り値:現在選択されている面・線の種別(面:0,線:1)を返す
int Fcolor()
面に定義されているカラーを選択する /> 戻り値:カラーIDを返す
int Fnormal()
面に定義されている法線を選択する
戻り値:法線IDを返す
int F3()
面を三角形に分割し、順次アクセス・選択する
戻り値:残りの三角形の数
int V()
現在選択されている面・線の頂点リストを作成し、順次アクセスする
戻り値:選択されている頂点のIDまたは0
int Vcoord()
現在選択されている頂点の座標を選択する。戻り値:座標のIDを返す
float Sx()
float Sy()
float Sz()
quat Sq()
現在選択されている座標の各数値を取得する
int S()
登録されている全ての座標のリストを作成し、順次アクセスする
戻り値:現在選択されている座標のIDまたは0(全ての座標へのアクセスが終了)

int Vnormal()
現在選択されている法線の座標を選択する
戻り値:法線IDを返す
float Nx()
float Ny()
float Nz()
quat Nq()
現在選択されている法線の各数値を取得する
int N()
登録されている全ての法線のリストを作成し、順次アクセスする
戻り値:法線IDを返す

int Vcolor()
現在選択されている頂点の色を選択し、色IDを返す
float Cr()
float Cg()

float Cb()
float Ca()
quat Cq()
現在選択されている色の各数値(r,g,b,a)を取得する
quatの場合、a,r,g,bの順で格納する
int C()
登録されている全ての色のリストを作成し、順次アクセスし選択する
戻り値:色のID
int Vtcoord()
現在選択されている頂点のテクスチャ座標を選択し、テクスチャ座標IDを返す
float Tx()
float Ty()
quat Tq()
現在選択されているテクスチャ座標の各数値x,yを取得する
座標は画像の左下を(0.0, 0.0)、右上を(1.0, 1.0)とする。
quatの場合、0,x,y,0の順で格納する
int T()
登録されている全てのテクスチャ座標のリストを作成し、順次アクセスする
戻り値:テクスチャ座標ID

int L()
登録されている全てのリンクのリストを作成し、順次アクセスする
戻り値:選択されているリンクのID
int Lp()
現在選択されているリンクの親グループを返す
int Lc()
現在選択されているリンクの子グループを返す
int Lm()
現在選択されているリンクのマトリクス要素(全16)に順次アクセスする
int Li()
現在選択されているリンクのマトリクスの性質を返す
戻り値:以下のBIT OR
1:単位マトリクスである
2:並行移動要素がある
4:回転要素がある
8:スケール要素がある
quat Lt()
平行移動要素を四元数として取得する
quat Lr()
回転要素を四元数として取得する
quat Ls()
スケール要素を四元数として取得する
int D()
シーングラフ構造をディスプレイリストに展開し、表示グループに順次アクセスする
戻り値:表示グループに対応する実体グループのIDまたは0(全ての表示グループへのアクセスが終了)
シーングラフにアクセス中は、Sx,Sy,Sz,Nx,Ny,Nzは、グローバル座標系での値を返す
int Dlevel()
現在選択されている表示グループのルートからの深さを返す
int Dfirst()
現在選択されている表示グループへの参照が初回であれば1
(二回目以降ならば0:その場合、ファイル形式によりシンボル参照型の記述を行う)

ファイル入力系コマンド

int SIORI()
現在の入力ファイル参照位置を取得し返す
int SEEK(int position)
position で指定した位置に参照位置を移動する
戻り値:0(正常)、0以外(異常)
異常は、引数で指定した値が負値または入力ファイルの長さを超えるような場合
int LEN()
ファイルの長さを返す
int GETS()
次の改行までの文字数を返す
int GETC()
1文字入力して参照位置を進める
int WATC()
1文字入力するもポインタを進めない
int GETINT(int len)
lenバイト読み込んで、整数値として解釈する。参照位置をlenだけ進める
int GETFLOAT(int len)
lenバイト読み込んで、浮動小数として解釈する。参照位置をlenだけ進める
int input()
コンソールに「>」を出力して1行入力し、整数に変換して返す
int scan("形式指定文字列")
型指定文字列とパターンが一致すれば1、一致しなければ0、EOFなら-1
"%*d"のような要素も含むことが可能
成功した場合には、参照位置を進める。失敗した場合には、参照位置は変わらない。
int scan("形式指定文字列", float f)
型指定文字列とパターンが一致すれば1、一致しなければ0、EOFなら-1
 %f 変換→第二引数の変数に変換結果を代入
int scan("形式指定文字列", int i)
型指定文字列とパターンが一致すれば1、一致しなければ0、EOFなら-1
 %d変換→第二引数の変数に変換結果を代入
 %s変換→取得した文字列を辞書から検索し、データ領域のアドレスを第二引数に代入
(未登録であった場合、新たに登録し、そのアドレスを代入)
(データ領域は、コンパイル段階で割り当てた変数領域の末尾に追加される)

ファイル出力系コマンド

void printf("形式指定文字列", 第二引数)
変換処理がファイル出力である場合には、自由形式で文字列を出力する
それ以外の場合、ログファイルに自由形式で文字列を出力する %d %x %X %o 整数
%f 浮動小数
%q 四元数を、"_Q(%f,%f,%f,%f)"の形式で出力する
void logf("形式指定文字列", 第二引数)
ログファイルに自由形式で文字列を出力する 変換規則は,printfに準拠

制御系コマンド

 制御系コマンドは、ANSI-C言語に準拠している。goto文は実装していない。
 main関数が定義されている場合には、最初にこれを実行する。
 main関数が定義されておらず、他の関数も定義されていない場合には、一つのmain関数の内部と同等とみなして、先頭行から実行する。
 景観シミュレータのネイティブである、LSSG形式のファイルを、メタファイルとみなしてコンパイルすると、固定形状のデータを生成する。

if(条件式)
else
for(初期化;条件式;継続前処理)
while(条件式)
do
switch(条件式)
case 数値:
default:
break
ループから抜ける continue
ループを続ける return
関数から抜けるreturn(0) 不可、return 0 可
exit
プログラムを終了する exit(0) 不可、exit 0 可

数値演算系コマンド

float PI
恰も浮動小数点数の変数のように定数値として円周率(3.14...)を与える。変数のように代入はできない。
float exp(float x)
float ln(float x)
flost sin(float radian)
float cos(float radian)
float tan(float radian)
float atan(float radian)
float SIN(float degree)
float COS(float degree)
float TAN(float degree)
float ATAN(float degree)
float sqrt(float x)
quat IKE2DES(quat Q)
quat DES2IKE(quat Q)
quat IKE2NAT(int k, quat Q)
quat NAT2IKE(int k, quat Q)
quat IKE2WLD(int k, quat Q)
quat WLD2IKE(int k, quat Q)
quat _Q(float t, float x, float y, float z)
 各成分から四元数を合成する
float _Qt(quat Q)
float _Qx(quat Q)
float _Qy(quat Q)
float _Qz(quat Q)
 四元数の各成分を参照する
 この時、Q各成分の精度が64ビットから32ビットに変換される

単項演算子

+
 数値の符号を維持する
-
数値の符号を逆転する
*
アドレスのメモリーにアクセスする
&
整数変数のアドレスを求める
++
整数変数に1を加える
--
整数変数から1を減じる

二項演算子

+
加算
-
減算
*
乗算
/
除算
加減乗除は、整数型、浮動小数、四元数同志の間で行う。数値の型が異なる場合はエラーとする。
%
整数間の剰余
==
等しい(整数、浮動小数、四元数)
!=
異なる(整数、浮動小数、四元数)
<
小さい(整数、浮動小数)
>
大きい(整数、浮動小数)
<=
小さいか等しい(整数、浮動小数)
>=
大きいか等しい(整数、浮動小数)
数値の大小比較は、結果を整数値(0か1)で返す
 &&
かつ
 ||
または
論理演算は、整数型同志で行い、結果を整数値(0か1)で返す
&
 ビット演算のAND
|
 ビット演算のOR
 ビット演算は、整数型同志で行い、結果を整数値で返す

代入演算子

=
 右辺値を左辺の変数に代入する行うと共に、右辺値を新たな右辺値とする
[例]a=b=c=0;  は、a=(b=(c=0)));と等価。a,b,cに0が代入される
+=
 右辺値を左辺の変数に加えると共に、結果を新たな右辺値とする
-=
 右辺値を左辺の変数から減ずると共に、結果を新たな右辺値とする
 例:b+=a-=b; →aにはa-bが代入され、bにはaが代入される
*=
 右辺値を左辺の変数から減ずると共に、結果を新たな右辺値とする
/=
 右辺値を左辺の変数から減ずると共に、結果を新たな右辺値とする
%=
 右辺値を左辺の変数から減ずると共に、結果を新たな右辺値とする
&=
 左辺値と右辺値の整数同志のビットAND演算を行い、結果を左辺の変数に代入し、結果を新たな右辺値とする
|=
 左辺値と右辺値の整数同志のビットOR演算を行い、結果を左辺の変数に代入し、結果を新たな右辺値とする

二項演算子の位階

レベル1:=, +=, -=, *=, /=, %=, &=, |=
レベル2:||
レベル3:&&
レベル4:==, !=
レベル5:<, >, <=, >=
レベル6:+, -, &, |
レベル7:*, /, %
 一連の演算が横並びで記述された場合、レベルの高い演算が優先して行われ、同一レベル内では左から順に実行する [例] a = 125/25/5; a = (125/25)/5;と等価    a = 1 + 25 * 2 + 3; a = (1 + (25 * 2)) + 3;と等価