第1回 J3Wの文法
グの雰囲気に慣れましょう。すぐに理解できなくても、この記■J3Wとは？

事を読み終わるころには理解できるようになっていると思いま「J3W」
は、3Dアニメーション専用のプログラムを作成する環す。リスト1のプログラムは1から100までの合計を計算しま境です。実際の作成にあたっては、「J3C」というJava風の文法す。変数sumを0にしておいて、変数iを1から順に100まで変えを持つプログラミング言語を使います。OpenGLやDirectXで思ながらsumに加えるという方法をとっています。while文で条件

い通りの3DCGアニメーションを作成できる人には必要のないが真（0でない）の間繰り返されることを利式の値（iが100以下）環境ですが、「あまりプログラミングの経験はないが、3Dのプ用しています。

ログラムを作ってみたい」という3D初心者や、「プログラミングというアナタは見リスト1を見て「i=i+1って間違ってない?」の経験は十分、しかし3Dは面倒そう」
といった人が対象になっ込みあるプログラミング初心者です。右側から先に読んで「i+1ています。

をiに代入」と解釈します。もしwhile文の条件式の値が最初か

J3C言語の守備範囲はリアルタイムに操作可能な3Dアニメーションの作成です。しかも汎用言語であるC、C++、Javaのようの部分は1度も実行されません。
ら真でない場合は「{} 」
リスト1の動作を実際に確認するには、実行例1のように3つな言語と文法的に近い言語です。少しでもプログラミングの経のコ マン ドを 実行 して くだ さい 。ま たは 、「 j 3 c c

験があれば、比較的容易に使いこなせると思います。まずは、list_1.j3c」のように1つのコマンドで実行することができます

J3C言語の基本部分から、J3W付属のマニュアルを補う形で説（実行例2）。j3ccは上記の3つのコマンドを順に実行するスクリ明していこうと思います。

プトになっています。

-r

どうですか？ 普通の言語とあまり違いはありませんね。ここ●プログラム
J3C言語のプログラムは、図1のようにクラス、ライブラリ、import宣言の繰り返しで構成されます。クラスが1つのプログラムと考えてください。実行を最初に始めるクラスとして名前がmainであるクラスが1つ必要です。
まずmainクラスだけの簡単な例でJ3C言語のプログラムミン【図1】J3C言語のプログラムの流れ【リスト1】list_1.j3c/* list_1.j3c */class main {volatile int i, sum;int INIT(){i = 1;
sum = 0;while (i <= 100) {sum = sum + i;
i = i + 1;}
Number(sum);Stop();}
int RUN(){}int EVENT(){}}// iとsumの使用を宣言// ここから実行を始める// 変数iに1を代入// 変数sum// iが100以下なら繰り返し// sumにiの値を加算// iに1を加える// sumの値を表示// プログラム終了// 1度も実行されない【実行例1】

j3c list_1.j3c
j3dasm list_1.j3m
j3w list_1.j3d
2001.9Linux Japan93【実行例2】

ス内のメソッドから呼び出されます。J3Cでは他のオブジェク

jm:~$ j3cc -r list_1.j3c
J3C ver. 1.04 2001 Jun Mizutani
Source File : list_1.j3c
Assembly File : list_1.j3m
J3DASM ver. 1.41 2001 Jun Mizutani
Source File : list_1.j3m
Object File : list_1.j3d
PASS 1PASS 2Assemble 60 steps
J3W ver.6.43 2001 Jun Mizutani
Execute file : list_1.j3d5050[finished]＊[finished]の前の行に合計の5050が表示されています。

ト指向言語と異なってデータメンバ（変数）もメソッドもクラス外（派生クラスを除く）から呼び出すことはできません。
プログラムに1つ必要なmainクラスは自動的に実行されますが、main以外のクラスは他のクラスからnew()組み込み関数で起動する必要があります。起動後は別のプログラムのように独立して動作します。
クラスはINIT()、RUN()、RUN()というように実行されることを覚えておいてください。

●コメント
コメントはプログラムに付ける注釈で、プログラムの動作には全く影響しません。実際には、コンパイラが単に読み飛ばしと「*/」に囲まれた部分（改行を含んでも良ます。Cの形式の「/*」【リスト2】
クラスの基本形

以降行末までがコメントとみなされい）と、C++で使われる「//」

class クラス名 {変数宣言;
定数宣言;
int メソッド名1{…}
int メソッド名2{…}
int INIT() {…}int RUN() {…}int EVENT() {…}}コンパイラに無視されます。/*と*/に囲まれた部分に、入れ子形式のコメントを含むことはできませんが、//形式で「/* */」のコメントを含むことはできます。

●変数、定数変数とは、値を入れておく容器のことです。容器に入れる内【リスト3】

volatile int i, j, k;volatile int a[10];final int const = -9999999;
final int id[5] = {1, 2, 3};// 変数// 配列変数// 定数// 定数配列の初期化

容物の種類をデータ型といいますが、J3Cでは最も基本的な整数である32ビットの符号付整数（約±20億の範囲）のint型と、int型の配列だけと単純です。配列とは、数の決まったデータの並びに名前を付けて、その中の1つを番号（インデックス）でが「出席番指定できる形式です。例えば、「 weight[5] = 60;」

からは、CやJavaといった言語との違いを中心にJ3C言語の解説

号5番の生徒の体重を60kgに設定」というように、1群のデータを進めます。リスト1を参照しながら読むと理解しやすいと思をまとめて取り扱う場合に使います。

います。

定数とは、数値に名前を付けたものです。例えば100という数値が高さの最大値となっているとします。100という数値に●クラス
1つのクラスは他のプログラミング言語の1つのプログラムのMAXという名前を使います。すると、例えば、後からMAXをように独立して動作します。アニメーションする物体の1つ1つ200と変更するだけで、すべての100を200に変更しなくても、の形状や動きを指定することになります。クラスの基本的な形自動的に最大値を200に変更できることになります。
「定数とははリスト2のようになります。{}の中には文が並びます。

数値に分かりやすい名前を付ける機能」と考えてください。定メソッドは、Cの関数に相当します。クラス内の別のメソッ数は多くの言語でconst宣言で指定しますが、J3CではJavaと同ドから呼び出して使用します。クラスは名前が決められているじくfinalで指定します。値が変化しない変数という扱いです

3個のメソッドを必ず持っている必要があります。INITメソッが、J3Cではコンパイル時に値を決定してしまいます。final宣ドはクラスの中で最初に実行されるCのmain関数に相当するも言した変数（定数）
はメモリを消費しませんが、必ず初期化するのです。INITメソッドが終了するとRUNメソッドが何度も繰り必要があります。

返し実行され、ほかのクラスから送られたメッセージを受信した場合に限ってEVENTメソッドが実行されます。
通常INITメソッドを初期化に使って、RUNメソッドがプログ

94

MAXという名前を付けておいて、プログラム中で数値ではなく「 int i;」
変数は、宣言にvolatileを指定します。従って、という宣言はできません。変数の場合は必ず「 volatile inti;」とする必要あります（リスト3）。

ラムとしての動作を決定する部分となります。EVENTメソッド

配列は、宣言時にサイズを指定できないJavaと異なって、サはクラス間の通信に使いますが、詳細はまたの機会に改めて解イズを指定する必要があります。添え字（インデックス）の範囲説します。INIT、RUN、EVENTメソッド以外のメソッドはクラは0から「サイズ指定した値-1」となることに注意してください。

3D アニメーションツール J3W for Linux 入門講座

また配列名のみを参照した場合はメモリの位置（ポインタ）が返りますが、J3Cでは一部の組み込み関数で使用するだけで、ポインタを操作することありません。

【リスト4】

val = 123456789;
val = 0xABCDEF0;
val = 'A';// 10進数// 16進数// キャラクタ(文字コード)

変数、定数には大きく分けてそれぞれ2種類あります。デー
タメンバと局所変数(定数)です。データメンバはクラスの変数宣言と定数宣言部で宣言された変数や定数です。局所変数はメ【リスト5】for (int i = 0; i < 100; i++) {...}で囲まれたブロックで宣言された変数や定数をソッド内の「{}」示します。Java、C++と異なってブロック中の任意の位置で宣言することはできません。Cと同じようにブロックの先頭部分でまとめて宣言する必要があります。また局所変数では配列を宣言することはできません。
変数名、定数名、メソッド名、クラス名などの識別子は最大63文字までです。

●数値
数値は32ビットの符号付整数（約±20億の範囲）が使用できま
すが、10進数以外にも、16進数、キャラクタの各形式で記述可能です。例えばvalという変数に代入する数値の形式をリスト4のように指定できます。キャラクタを代入すると文字コードが整数として格納されます。

return文は式を評価するために使用し、関数の途中からの脱出の目的に使用することはできません。
また局所変数宣言と演算子の制限から、for文ではC++のように局所変数を最初に使う場所で宣言する、リスト5の形式は使用できません。ブロックの最初で局所変数宣言する必要があります。もちろん 変数i が宣言済みの場合は、for (i=0; i<100; i=i+1) 文;だけで構いません。for文を普通に使用する場合は気にする必要はありませんが、文を式として使用できないため、i<100の部分には必ず式を指定します（C上級者の人は要注意です）。

●式
式には、普通の算術演算と比較演算があります。式の結果は●文
文はプログラムを実行する場合の命令の最小単位です。
「プログラムの実行」とは、文を順に実行することにほかなりません。
文は処理の内容を実際に記述する単位で、代入文、条件文（ if、switch）、 繰り返し文（while、for、do）
また処理の流れを制御するbreak、continue、return文、アセンブラに直接渡すasm
文、別に定義した処理を実行するメソッド呼び出しとライブラ
リ呼び出し、J3Wの機能を直接実行する組み込み関数呼び出しがあります。文と文の区切りにはセミコロンを使います。
文は値を返さないため式として使用できません。Cのように代入文の右辺や条件式で文を置くことはできません。

a = b = 0;
［誤］［正］a = 0; b = 0;

どちらもint型が返ります。算術演算子は+、-、*、/、|、&の6種類です。| はビットOR、&はビットANDです。
比較演算子は==、!=、>、>=、<、<=の6種類です。大きさの比較は見たままですが、== と!= は分かりにくいかもしれません。==は等しい場合に真、!=は等しくない場合に真となる演算子です。比較演算は偽（False）の場合は0、真（True）の場合は1となります。if、while、for文で使う式は0以外は真、0ならば偽と判断されます。優先順位は*、/、&が最も高く、+、-、|がそれに続き、比較演算子は最後に評価されます。

●組み込み関数3Dアニメーション専用の組み込み関数が多く用意されていることが、J3C言語の特徴になっています。J3Cの組み込み関数
は、内部的に仮想マシンであるJ3Wの命令1つ1つに対応してい［誤］if (a = b) 文;ます。組み込み関数は機能面から以下のように分類できます。

［正］a = b;if (a != 0) 文;
条件文、繰り返し文などはC、C++、Javaとほとんど同じです。C、C++、Javaと特に異なる文はif文とreturn文です。if文ではelseの前にセミコロンを置くことはできません（PascalまたはDelphiと同じです）。

・インスタンスに関する操作
J3Wの中心的な存在であるインスタンスの生成と削除、インスタンス間の通信に関する組み込み関数で10種類あります。
・「物体」
に対する操作
1つのインスタンスは1つの「物体」を持つことができます。

［正］if ( 式 ) 文 else 文;「物体」の形状を設定したり、位置や角度の設定と取得を行う組［誤］if ( 式 ) 文; else 文;

み込み関数があります。

2001.9Linux Japan95

・「物体」の運動に関する操作間の情報交換のために重要なレジスタ変数です。RLレジスタ変「物体」を持っているインスタンスを実行すると、 3次元空間数は受信されたメッセージを保持しています。RLレジスタに書内で「物体」が運動する組み込み関数です。

き込むことは可能ですが、クラスのEVENT メソッド内でメッセージの参照に使用するだけにしましょう。レジスタ変数はイ・演算ンスタンス（後述）内でグローバルな変数です。

三角関数、平方根、乱数を求める組み込み関数が用意されています。

・プログラム例
リスト1と同じように、1から100までの和を計算するプログラ・レジスタに関する操作
レジスタ変数の設定、メモリへの格納、スタックへの退避とスタックからの復帰などに関する組み込み関数です。

ムを２つ紹介します。リスト6ではfor文を使って少し簡潔にしてみます。変数iの初期化と終了条件、繰り返しごとのiの変化の仕方をfor文1つで指定できます。J3Wのfor文は、CやJavaとのように指定する必要があること異なっており、増分を「i=i+1」

・共有メモリに注意してください。いくつかの組み込み関数を使っていま各インスタンスからアクセスできる共有メモリに対する入出す。Number(sum)は、変数sumの値を10進数として表示する組み力用の組み込み関数です。共有メモリはメッセージの送受信と込み関数です。Stop()はリスト6のプログラムを終了させます。

ともにクラス間の情報交換の手段に使用します。

次のリスト7も同様に1から順に加えていきますが、ループ構造がありません。J3Cのクラスは、INITが最初に1回実行された・入出力後、R U N メソッドが繰り返して実行されるため、結果としてテキスト画面とグラフィック画面への文字出力、線分の描画、音の出力とキーボード、マウスからの入力に関する組み込み関数です。これらの組み込み関数はインスタンスごとに独立していません。どのインスタンスも同じデバイスに対して操作することになります。
・システム関連組み込み関数
J3Wシステム（インスタンスに依存しない）に関する状態の取得と設定、共有メモリのファイル入出力に関する組み込み関数です。

組み込み関数の詳細はJ3Wに付属するj3c_func.htmlを参照してください。重要なものはサンプルコードで使う度に解説し【リスト6】list_2.j3c/* list_2.j3c */class main {volatile int i, sum;int INIT(){sum = 0;// 合計を0に初期化// 1から100まで繰り返す
for (i=1; i<=100; i=i+1) {sum = sum + i;// sumの値をsum+iに変更}}
int RUN(){Number(sum);// sumの値を表示
Stop();// 最初のRUNで終了}
int EVENT(){}}

ます。

●レジスタ変数
組み込み関数の中には引数をレジスタ変数を使って渡し、結果をレジスタ変数に返す関数があります。RX、RY、RZ、RH、RP、RBレジスタ変数は、組み込み関数のうち30種類程度の関数の呼び出し時の設定、または、返り値の取得に用いられます。
また、クラスインスタンス生成時のRX、RY、RZ、RH、RP、RB
レジスタ変数の値は生成されたインスタンスに引き継がれます。「コンストラクタの引数」的な働きをさせることができます。この「コンストラクタの引数」
を利用すると、同じクラスを使って位置、色、大きさなどの異なる複数のインスタンスを生成できます。便利な機能なので詳細は改めて解説します。

RQレジスタ変数はクラスインスタンスの識別（プロセスIDと呼ぶ）に使用します。メッセージの送受信というインスタンス

96

3D アニメーションツール J3W for Linux 入門講座【リスト7】list_3.j3c/* list_3.j3c */class main {volatile int i, sum;int INIT(){i = 1;
sum = 0;}int RUN(){if (i <= 100) {sum = sum + i;
i = i + 1;
} else {Number(sum);Stop();}}
int EVENT(){}}// 初期化だけ// 合計を0に初期化// iが100以下の場合// 総和を求める// iの値に1を加える// iが101の時// sumの値を表示// 終了ループとなります。どんなクラスもINITで初期化、RUNで繰ります。その時点ではプログラムに実行させたい内容がはっきり返しというJ3C言語の重要な特徴を示しています。INITが1回、しているため、マニュアルやサンプルの情報のうち必要な部分RUNが101回実行されてプログラムが終了します。他の言語に習簡単に見付け出せるものです。特に初心者はプログラミング言熟している人もこの部分だけは注意してください。

語に振り回されず、まず日本語で実際に書いてみることです。

物体の回転や移動という動作は、RUNが繰り返されるこの形

私自身は、「プログラムが書けない原因は言語のせいではなく、式を多用します。INITメソッドで物体の形状や初期位置を設定単に自分の考えがまとまらないためである」と悟っているつもして、繰り返し実行されるRUNメソッド中で回転や移動の組みりです。

込み関数を実行することでクラスで定義される物体を自立的に次回も、もう少しJ3Cの文法にお付き合いください。

運動するようにプログラムを組むことができます。
リスト1とリスト6は他の言語とあまり変わりませんが、リス
ト7はJ3C言語特有のプログラミング手法です。リスト7の動きを理解すると、J3Wに付属するサンプルプログラムが読みやす

J3W for Linux
最新版ソースコードについてくなります。

■終わりに

J3W for Linuxの最新版ソースコード「j3w643.tar.gz」
を、本誌付録CD-ROM

今回は3Dアニメーションと直接関係ない文法の説明でした。
プログラミング言語を習得する近道は、「プログラムに実行させたいことを具体的に考えて、日本語で書いてみる」ことだと思います。その文章にあいまいな部分がなくなり、文章としてに収録しています。インストールを行うには、まず圧縮ファイルを展開後、j3w-643ディレクトリに移動します。その後ルートユーザーになり、「make && makeinstall」とすると、作業は終了します。コマンドの検索パスに /usr/local/bin が含まれているかどうかの確認も、忘れずに行ってください。インストー
ルに関するさらに詳しい情報を知りたい場合には、作業を行う前にJ3W添付のREADME.euc ファイルを確認してください。

（編集部）

完成したと思ったら、対象となるプログラミング言語に翻訳し

J3W の内部構造の解説
J3Wを使う上ではJ3Wの内部構造を知る必要はありも基本的なデータとなる頂点座標の変化を管理し、ませんが、どのように動作しているか「仕組み」を知り

3. それらの頂点座標を 1 つだけ存在するワールド座標たい人もいるかもしれませんので、これから数回に分けてJ3Wで使用しているデータ構造を中心に解説します。
3次元コンピュータグラフィックスのプログラムを3Dエンジンから作る場合には、三角関数、ベクトル、行列、系にまとめ、4.ワールド座標系の物体の座標を観察者の視点から見た風景に変換して、5 .2 次元のスクリーン座標系に変換して表示する。

4元数、座標変換といった数学の知識が必要となります。
それらの代数幾何学の基本的なアルゴリズムに関する情トへのポインタを持つことによって管理しています。
表示を受け持つ「レンダリングエンジン」の機能は、Spaceh3D とそれが描画に使う TScreen のX用の派生クラスである ScrnX が担当しています。Spaceh3D クラス
はクリッピング、2次元への変換、光源の種類と照光処
理、3Dに関係のない文字表示や直線描画に関する機能を持っています。TScreenはOSと表示用のライブラリのように集約することができます。に依存する部分（この場合Xlib）のラッパークラスとなっ報は、今では高額な書籍を購入しなくてもインターネッ

誌面の関係で細かい部分を省略することになりますが、トを利用すれば比較的容易に入手できるようになってき

J3Wのソースも参照してみてください。クラス宣言は拡ました（英語を読む覚悟があればさらに容易です）。コ

張子がhのヘッダファイ

ンピュータが高速になったおかげで、描画や計算の高速ル中にあります。また、 【図】3Dエンジン部分の概念図化のために固定小数点演算を使用したり、移動や物体のファイル名はクラス名と形状に制限を与える必要がないため、J3Wでは3Dに関似た名前になっているの連するアルゴリズムはほとんど教科書通りのものしか使っで迷うことはないと思いていません。しかしプログラムを構成する要素はアルゴます。

リズムだけでなく、データ構造も同じぐらい重要な位置にあります。ています。

（水谷純）

THobj3Dクラスは1つの物体の形状を表現するために頂点座標や面を管● J3W の 3D エンジン理しています。また、3Dアニメーションは3次元のコンピュータグラフィッ 「ジオメトリックエンジクスを連続して高速に描画することで実現します。つまンの機能」として、回り、3Dアニメーションといっても普通の3次元グラフィッ

転、移動、拡大縮小にとクスと原理は同じです。

もなう座標変換の計算をJ3W の 3D エンジンと呼べる部分の概念図を図に示しすべて担当しています。

ます。J3WはC++で書かれていて、ほとんどのデータ構さらに、多関節オブジェ造はクラスを使って実装されています。機能としては、

クト（例えば人型ロボット）を実現するために必

1. 物体の形状を決める頂点や多角形を登録し、要な物体の階層構造を別

2.物体の移動や回転に伴って物体の形状を定義する最の THobj3D オブジェク

2001.9Linux Japan97