位置、速度、姿勢といった情報は個々の物体自身が知っていま

J3Wとは？

す。
「1秒間で90度右を向く」、「瞬間的に30度上を向く」、「30秒間で100メートル前進する」
といった物体の動きと速さを、Java「3Dゲームを作りたい！」と思っている人はいませんか？

風の文法を持った3次元アニメーション専用のオブジェクト指J3Wシリーズは、まさにそんな人に向けて用意された、3次元向言語「j3c」
でプログラムとして作成します。j3cは3次元アニアニメーションプログラムを作成するための環境です。ここでメーション専用言語のため、表示の方法や表示速度を気にするはその中の1つ、「J3W for Linux Ver.6.42」について解説していことなく、常に指定した時間で動作します。高速なコンピュー

きます。また、作成したアプリケーションは、同じシリーズのタでは滑らかに、遅い環境でもそれなりに表示されるのです。

「J3W for Windows 95 Ver.4.42」を使って、Windows 95/98/NT

3次元アニメーションというと速いマシンが必要と思われがちでも実行可能となっています。

ですが、J3WはXlib のみで作成されているため、100MHz版Linuxで3Dグラフィックス表示を伴うプログラムを作成すPentium程度でも十分動かしたり遊んだりできます。

るには、通常、Mesa（OpenGL互換フリーライブラリ）などのまた動作の高速化のため、テクスチャマッピング、バンプ3次元ライブラリを使ってC言語で作成することになります。

マッピングなどリアルな3D CGを作成するために必要な機能

しかし、プログラミング初心者の方は、Cなどのプログラム言はサポートしていませんが、リアルタイムに視点、光源、物語を何とか理解できるようになって、雑誌や書籍を頼りに体を自由に動かせる3次元アニメーションを作成できます。光

OpenGLのサンプルプログラムを動かせても、次に「フライト源の種類を変更したり、スペキュラ強度を変更したりするこシミュレータ」
や「格闘ゲーム」を作ろうとしたときに、どうしとももちろん可能です。3Dプログラミングの入門や本格的なたらいいか分からなくなるのが普通ではないでしょうか？

3Dアプリケーションを作成する前に、簡単にテストしてみる

例えば、1つの物体を表示して回転させることは、3Dライブ「3Dプロトタイピングツール」には有効でしょう。慣性速度、ラリを使用しても比較的簡単に実現できます。しかし、独立角速度、重力加速度を物体ごとに設定することが可能なのでして運動する複数の物体を表示するには、物体ごとに位置、物理シミュレーションも作成できます。

速度、そのほかの状態を保持しておく必要があります。そのそして、J3W付属の入門用ドキュメント中のサンプルを改ため、通常はまずデータ構造の設計に頭を悩ませることにな造して試している間に、オリジナルのプログラムのアイデアります。

が生まれてくるはずです。プログラミングは、書籍を読むよ

そこでJ3Wの出番です。J3Wを使用して3次元アニメーションり実際に試してみるほうが、ずっと簡単に習得できます。のプログラムを作成する場合、3 D ライブラリ（例えば、「プログラムなんてしたことはないが、 3次元アニメーショDirectX、OpenGL）を使用する上で必須となる、「三角関数」
やンには興味がある」という人も、J3Wでオブジェクト指向プロ「行列」を意識する必要は全くありません。J3Wでは物体ごとのグラミングとアセンブラによるプログラミング、さらに3次元40

Linux Japan February 2001

アニメーションを同時にマスターできるかもしれません。オブジェクトが「すべて目に見える物体」となって実行例1

j3w-642ディレクトリの内容$ ls
COPYING
Makefile

README.euc
gpl.text

history.txt j3
html j3c_script

j3cc
j3d

j3opt.plj3w_script

sample.txt
sourceいるため、オブジェクト指向言語と聞いて尻込みしてしまう人でも、抽象的なオブジェクトで悩むことはありません。

j3wコマンドを示します。「J3C」はJ3C言語を意味し、「j3c」はコンパイラのコマンド名を表わしていることにします。

またLinux版J3Wのライセンスは、Free Software FoundationのGPLを採用しています。J3W自身の使用や改造、また改造したものを配布することは、そのソースを公開する限り自由に行なって構いません。ライセンスの詳細はパッケージに含まれていますので、詳しくはそちらを参照してください。

J3W の構成

インストールJ3W をインストールするには、ソースをコンパイルする必と要があります。基本的にはmake、そして「make install」
2つのコマンドを実行するだけと、非常に簡単ですから、自分でコンパイルしたことのない人もぜひ挑戦してみましょう。
意外と手軽に行なえることがすぐに分かるはずです。どの全体的な流れは、図1で示すように通常のプログラミングと、アセンブルは「j3dasm」、変わりません。コンパイルは「j3c」という流れです。
そして実行は「j3w 」
コマンドとしてのj3wは、仮想CPUのエミュレータとなっています。この仮想CPUは3次元空間で形を持つことができ、さらに自己増殖、自己消滅できる特殊なCPUとなっています。
そのCPUの命令をj3dasmというアセンブラが生成し、そのアセンブラ用のコンパイラとしてj3cがあります。

Linuxディストリビューションでもインストール作業は同じですが、手元にインストール直後の状態の「LASER5 Linux 6.0
Rel2.0」があったので、実際にインストールした手順に沿って説明します。ディストリビューションが違っていても、シェルプロンプトの表示が異なるだけですので、あまり気にするのホームディ必要はありません。またここではユーザー「jun」
レクトリ/home/jun/で作業を行なっていることにしますが、どのディレクトリで作業しても構いません。

「3次元空間に存在する物体は、それぞれコンピュータにコントロールされている。その空間を表示するコマンドがj3wであというファイルを解凍
（展開）
し
① まず、
「j3w642.tar.gz」

る。それらのコンピュータの動作を指定するためにJ3C言語をます。

使う」ということです。図1中の ABC.j3?はファイル名で拡張子$ tar zxf j3w642.tar.gzの「?」の部分が異なっていることに注意してください（ファイル名ABCは単に例として挙げているだけです）。下の例で最終的② 解凍されると「j3w-642」というディレクトリができますかに生成されたABC.j3dは、32bitの16進数が並んだテキストファら、そこへ移動しましょう。

イルとなります。このABC.j3dを j3wで実行することにより、3次元アニメーションが実行されます。実行時にはデータであ$ cd j3w-642/と「j3wコマンド」以外は必要ありません。また用語る「???.j3d」③ ディレクトリ内のパッケージ内容を一応確認してみます。

はの使い方としては、「J3W」
がJ3Wシステム全体を指し、「j3w」

lsコマンドを打ち込むと、実行例1のように表示されます。

図1
J3Wのプログラミングの流れLinux Japan February 2001

41

SPECIAL④「README.euc」というドキュメントにインストール方法と中間結果などは不要ですから、次のコマンドを実行しておく簡単な使用法が書いてあります。htmlディレクトリ内にはさと少しディスクが節約できます。

がJ3Wのらに詳細なドキュメントがあります。
「index.html」
紹介と総目次になっていますので、必ず読んでください。
では、コンパイルといきましょう。これはmakeコマンド一発でOKです。

$ makeコンパイルは数分以内に終了するはずです。次の操作は特に実行する必要はありませんが、バイナリ（コマンド）のサイズが小さくなります。

$ make strip
インストール先の/usr/local/binディレクトリは、一般ユーザーに対して書き込み権限を許可していませんから、イン$ make clean
ディストリビューションによっては、コマンドの検索パスに/usr/local/binが含まれていない場合があります。コマンで確認できます。
ドの検索パスは「echo $PATH」$ echo $PATH/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/jun/bin
LASER5 Linuxでは/usr/local/binが含まれているのですぐに実行可能です。もし/usr/local/binが含まれていない場合は、$ export PATH=/usr/local/bin:$PATH

権限が必要になりまストールするにはスーパーユーザー（root）を実行しましょう。あるいは、毎回検索パスを指定するのがす。suコマンドでスーパーユーザーに変身しましょう。

面倒な場合は~/.bashrcなどに$ su
Password:（パスワードを入力する）

export PATH=/usr/local/bin:$PATHを追加してください。

ここでパスワードを入れてリターンキーを押すとOKです。
これでスーパーユーザーになれたので、さっそくインストー

サンプルの実行

ルのためのコマンドを実行することにします。

# make install

オリジナル3Dアニメーションを作成するためには、自分でプログラムを行なう必要がありますが、その前にまずJ3Wでこれで/ u s r / l o c a l / b i n / に「 j 3 c c 」、「 j 3 」、「 j 3 c 」、何ができるかサンプルで確認してみましょう。j3w-642/j3d、「j3w」、「j3opt.pl」の6つのファイルがインストー「j3dasm」

ディレクトリには、すぐに実行できるサンプルが多く用意さルされます。もしJ3Wが不要になった場合には、これらの6つれています。ちょっとのぞいてみましょう（実行例2）。のファイルを削除するだけでアンインストールが完了しま

拡張子がj3dのファイルが48個あります。ここでもしXサーす。Red Hat系のディストリビューションであっても、/usr/バ（以下X）
を起動していない場合は、以下のような感じで、なlocal/bin以下に自分でインストールしたファイルはRPMのるべく多くの色が使えるように指定して起動しておきます。

管理外なので、勝手にコンパイルしてインストールしても問題ないでしょう。

$ startx -- -bpp 16

筆者が利用している、LASER5 Linuxの場合にはインストー

この理由は、動作しているXの色数で表示品質が決まるためでル作業はこれで終了です。実際に使ってみるために、再び元す。8bpp（256色）の画面モードでも実行できますが、J3Wののユーザーに戻ります。

ウィンドウをアクティブにするとほかのウィンドウの色が変わ# exit

ります。また8bppではスペキュラが無効になってしまいます。
実行するには j 3 w コマンドを使用しますが、サンプルの解凍したj3w-642ディレクトリには、サンプルのソースや*.j3dでは日本語を使用しています。「kterm」または「rxvt」な

J3C用のライブラリ、J3Wに関する解説などJ3Wを使う上で有どの日本語が表示できるターミナルウィンドウから実行して用な情報が含まれています。J3Wが不要になるまで残しておや「Gnome」のターミナルでは出力される文ください。
「xterm」

いたほうがいいでしょう。しかしJ3Wのインストール作業の字が化けます。ktermが開いていない場合はターミナルウィン

42

Linux Japan February 2001

$ cd j3d
$ ls
FRAME_1.DAT flight.j3d
FRAME_2.DAT hand.j3d
FRAME_3.DAT hsort.j3dball.j3d
human2.j3d
testcalc.j3d
bcolor.j3d line.j3d
body.j3d
line2.j3d
color.j3d
list1.j3d
cube.j3d
list10.j3dfalcon.j3d list11.j3dlist12.j3dlist13.j3dlist2.j3dlist3.j3dlist9.j3dlist_10.j3d
list_11.j3dlist_12.j3d

list_4.j3dlist_5.j3dlist_6.j3dlist_7.j3dlist4.j3dlist5.j3dlist6.j3dlist7.j3dlist8.j3d

list_13.j3dlist_14.j3d
list_15.j3dlist_2.j3dlist_3.j3dlist_8.j3d
tubo.j3dlist_9.j3dwhile.j3d
manual2.j3d
multiprc.j3d
note.j3d

ドウから次のように入力してktermのウィンドウを開きます。

$ kterm &ktermのウィンドウでフライトシミュレータを実行してみましょう。

$ j3w flight.j3d
実行が始まると、ktermウィンドウに簡単な使用法が表示され、新たに開いたウィンドウでフライトシミュレータが表示されます（画面1）。最初はオートパイロットモードとなっていて、MキーとESCキー以外の入力を受け付けない状態になっています。また視点は空中に固定された位置にあり、飛行速度は意識的に遅くしてあります。Mキーを押してマニュアルモードに変更するとキー操作できるようになります（画面2）。
Y、U、H、G、J、N、Tキーでカメラの位置が変わり、Fキーで位置固定の視点に切り替わります。カーソルキーとK、Lキーで方向転換、Sキーがキャノン発射で、弾が飛行船に命

pose.j3d
random.j3d
taco.j3d

実行例2
j3w-642/j3dディレクトリ内のサンプルファイル

中するとスコアが上がり、標的の飛行船が消滅します。終了
す る に は E S C キ ー を 押 し て く だ さ い（ 画 面 2 ）。 詳 細 はというファイルを参照してください。
「flight.j3c」
グラフィックが表示されているウィンドウをXボタンなどで強制的に閉じたような場合や、ターミナルウィンドウでCtrl+Cキーで強制終了した場合、まれにターミナルで文字入力を受け付けないような状態になる場合があります。このと
きはEnterキーを押したあとに、画面上で見えなくてもj3w（このあとEnterキー）と入力して、引数なしでj3wを起動してください。

J3W ver.6.42 2000 Jun Mizutani
usage : j3w fileと表示した後に正常な状態に戻ります。
では、さらにもうひとつサンプルを実行してみましょう。

$ j3w pose.j3d
ポーズエディタが起動します。
「 pose.j3d」
は人体モデルのアニメーションのサンプルです（画面3）。人体モデルのポーズ

画面1

簡易フライトシミュレータ実行例

画面2

マニュアルモードでの操縦キー設定

Linux Japan February 2001

43

SPECIAL

j3cのプログラムの作成と実行
ここからはもう少し突っ込んだ話をすることにして、というソースファイルをコンパイルして実行する「prog.j3c」
までを解説していきましょう。
Java風のプログラミング言語、J3Cで書かれたプログラムを、まずコンパイラである j3cコマンド（prog.j3cとします）でコンパイルします。

$ j3c prog.j3c
これで「prog.j3m」というファイルができます。これは仮想画面3人体モデルアニメーションのサンプル

CPU用のアセンブリ言語のファイルなのでj3dasmというアセンブラでアセンブルします。

を作成してアニメーションとして再生させ、ファイルに保存$ j3dasm prog.j3m

できます
（画面4）
。pose.j3dを起動して2を押したあと、Mをこれでj3w コマンドから実行可能な「prog.j3d」が生成されま押してください。サンプルのアニメーションが起動します。

す。あとはどうですか？
んか？

これで、格闘ゲームを作ってみたくありませJ3Wで必要な知識を身につければ、それは夢ではあ$ j3w prog.j3dりません。pose.j3dはESCキーで終了します。使用法の詳細で実行できます。しかし、J3C言語のプログラムを修正するはpose_man.htmlを参照してみましょう。

たびにコンパイル、アセンブル、実行では面倒です。 そこで以上のサンプルを、4 5 0 M H z 版C e l e r o n 、R i v a T N T 、j3ccというシェルプログラムが用意されています。コンパイ

XFree86 4.0といった組み合わせの環境で実行すると、1秒間ルとアセンブルを同時に行ないたい場合は次のように指定しに150フレーム以上の表示速度になります。J3Wはインタプます。

リタ系の環境ですが、速度の心配はまったく不要というわけです。

$ j3cc prog.j3c
これでprog.j3mとprog.j3dが生成されます。さらに、コンパ
イルとアセンブル、j3wの実行まで行ないたい場合は$ j3cc -r prog.j3cとします。すると、j3w prog.j3dの実行まで自動的に行なわれ、j3c のソースを直接実行できるような環境となります。

j3cのソースに構文エラーがある場合、またj3dasmのアセンブリソースにエラーがある場合は、エラーを見つけた段階でエラーを表示してj3ccスクリプトは終了します。
Perlが使用できる環境ならばj3opt.plでj3cの出力ファイル*.j3mを最適化（10％〜15％）して、「*.j3o」に変換することができます。このj3oという拡張子のファイルは、j3mやj3sと同じくj3dasmの入力に使用できます。j3opt.plはPerlスクリ
プトです。/usr/bin/perlディレクトリ以外の場所にPerlが画面4アニメーション設定・
操作画面

44

Linux Japan February 2001

インストールされている環境では、j3opt.plの１行目を変更してください。またj3dファイルも小さくすることができますが、この場合は、実行速度にはほとんど影響はありません。
あまり挑戦する必要はないでしょう。
「Tcl/Tk」
で実験的に作成したj3dasm
ちなみに、j3のほうはとj3wのGUIフロントエンドとなっています。

生成され、INITメソッドが最初に実行されます。INITメソッ
ドが終了すると次にRUNメソッドが繰り返し実行され、ほかのクラスインスタンスからのメッセージを受信した場合にかぎって E V E N T メソッドが実行されます。上記の例では、というように強制終了「INIT()、RUN()、RUN()、RUN()……」

最小のプログラムされるまで実行します。
通常のプログラムでは、mainクラスのINIT、RUNメソッド、

ここでは、実際にJ3C言語でプログラムを作成してみましょまたはそれらから呼ばれたメソッドが、別のクラスのインスう。条件分岐や代入文などの文法は既存のプログラム言語とタンスを生成し、生成されたインスタンスは独立して自分のよく似たものになっているため、C、Pascal、Java、Visual

クラス宣言の定義にしたがって「INIT()、RUN()、RUN()、Basicなどでプログラミングの経験を持っている人ならば習得RUN()……」などを実行します。J3Cのプログラムの実行中はは容易です。J3Cは、それらの中でも、文法的にはJavaに最も複数のインスタンスがRUNを実行し続けます。メッセージを受近いものになっています。J3Cが3Dアニメーション専用と信した場合だけEVENTを実行して、その後RUNを繰り返し実行なっているのは、複数のクラスが目に見える物体として同時します。に動作できる点と、3Dアニメーション専用の組み込み関数が多く用意されている点です。

Hello World

以下に示す例はJ3Cの最小のプログラムで、実行しても何もしない無限ループとなっています。終了させるためには次のプログラムは、「 Hello World」という文字列をターミCtrl+Cキーなどで強制的に終了させる必要があります。あえナルウィンドウに表示するだけのプログラムです。グラて実行する必要もありませんが、この形を覚えておいてくだ

フィックウィンドウは開きません（リスト2）。

さい（リスト1）。

は文字列表示用の組み込み関数です。Char(13)は「String」

このリスト1で示されるように、J3Cのプログラムではmain改行文字を出力します（Linux版では13[CR]は10[LF]に内部でクラスが必須であり、各クラスにはINIT、RUN、EVENTの3つ「Hello World」を表示し、Char(13)変換されます）。Stringでのメソッドが必須となります。J3Cではクラスが実行の単位で改行してStopで終了します。

で、物体の1つ1つがクラス内で定義されたように動作します。ここで定義された関数をメソッドと呼びます。

/* と*/ に囲まれた部分と// から行末まではコメントなので、入力する必要はありません。短いプログラムなのでお気任意の名前のクラス、メソッドを宣言できますが、プログに入りのエディタで実際に入力して、「 list_2.j3c 」というラムには1つのmainクラスが必要で、各クラスは必ずINIT、ファイル名で保存してください。直接実行するために次のよ

RUN、EVENTメソッドが定義されている必要があります。mainうに入力します。

クラスとINIT、RUN、EVENTメソッドは特別な意味を持つと覚えておいてください。クラスは継承することができるため、$ J3cc -r list_2.j3c

基底クラスで宣言されていれば、すべてのクラス宣言でもしなんらかのエラーで中断する場合は、入力したプログ

INIT、RUN、EVENTの3つのメソッドを記述する必要はありま

ラムとリスト2を何度もよく見比べてみましょう。実は、「俺せん。今回はページ数が限られていますため、ここではこれは間違っているかもしれない」と悟るのが、プログラミング上以上説明は行ないません。詳細はパッケージ中の

j3c_spec.htmlを参考にしてください。
J3Cでは、mainクラスは最初に自動的にインスタンスとして

リスト1

J3Cの最小のプログラム例

class main {int INIT() {}int RUN() {}int EVENT() {}}// クラス宣言// メソッド宣言// メソッド宣言// メソッド宣言

リスト2 「Hello World」
プログラム例

class main {int INIT() {String("Hello World");
Char(13);Stop();}
int RUN() {}int EVENT() {}}Linux Japan February 2001

45

SPECIAL
図2
J3Wの座標系達のコツなのです。
リスト2中のStop()は、すべてのインスタンスを終了させる組み込み関数です。インスタンスとは、クラスの定義に基づいて実際に動作している部分です。J3Cでは、多くの仮想CPUが、複数のクラスからなる1つのJ3Cプログラムを同時に実行します。プロセスやスレッドという概念に近いものと考えてもらうといいでしょう。J3Cでは、すべてのインスタンスが終了した時点でプログラムが終了します。この場合は1つのインスタンスしか存在しないので、自分を終了させる

delete()組込み関数でもプログラムは終了します。しかし通常は、ほかのインスタンスの数も寿命も分からないため、プログラムを終了させる場合には、プログラムを終了させる責任のある（例えばキー入力を処理する）インスタンスが Stop()を実行するようにしたほうが良いでしょう。
リスト3

物体の表示・動作プログラム例

例えばこの例では、Stop() がない

class Triangle {final int color1 = 6;// 面の色指定
final int color2 =14;
int INIT() {NewObject(6, 2);// オブジェクトの生成 6頂点 2面
DefPoint(0, 0, 500); // 頂点0 三角形の頂点座標を登録
DefPoint(0, 500,-500); // 頂点1
DefPoint(0,-500,-500); // 頂点2
DefPoint(0, 0, 500); // 頂点3 頂点0と同じ
DefPoint(0, 500,-500); // 頂点4 頂点1と同じ
DefPoint(0,-500,-500); // 頂点5 頂点2と同じ
DefPlane(color1, 3, 0, 1, 2); //面の定義 表から見て左回りに指定
DefPlane(color2, 3, 5, 4, 3);
ClearRegisters();// RX - RBに0を代入
SetPosition();// 初期位置と角度の設定}
int RUN() {RotHead(6000, 2880);// 6秒間で360度回転
DeleteObject();// オブジェクト
Stop();// 全インスタンス終了}
int EVENT() {}// メソッド宣言}
class main {int INIT() {new(Triangle, 50);
NewObject(0, 0);
ClearRegisters();
RX = -2000;
SetPosition();See();
BackgroundColor(0x000);
GraphMode();}int RUN() {Wait();
int EVENT() {}}}46

Linux Japan February 2001と、INIT実行後にRUNが繰り返し実行されます。RUNの中にStop()を置くこともできます。INIT実行後、最初のRUNの実行時にプログラムは終了します。

物体の表示
では、いよいよ3次元空間で物体を動かしてみましょう（リスト3）。3次
元の世界で物体を表示する場合は、空間内に「物体」と「その物体を見ている物体（視点）」が存在する必要があります。また、「1つのインスタンス」
は「1つの物体」になることができます。
従って、ここでは最低でも2つのインスタンスが必要になってくるわけです。さらに、視点と物体では動作が// 視点用オブジェクトの生成// RX - RBに0を代入// 位置の指定 20メートル後方// 位置と角度を視点に設定// このオブジェクトが見る// 背景色を黒に設定// グラフィックウィンドウを開く

異なるため、クラスも2つ必要になります。以下の例では、自動的に生成されるmain クラスのインスタンスが空の（形のない）物体を生成し、 位置をSetPosition組み込み関数で設定して、See組み込み関数で視点を取得します。このインスタンスが「目」とな// メソッド宣言

り、２番目のインスタンスは三角形のオブジェクト（Triangle）となります。

次に、位置を指定するために座標を指定します。すべてのINITメソッドの仕事は以上です。この例では視点は移動しな

物体はそれぞれ自分の向いている方向を基準として、前がX、いためRUNメソッドでは終了イベントを待っているだけです。

右がY、下がZの増加する方向です。これを座標系と呼びまクラスTriangle のインスタンスは、INIT メソッド中です。回転はZ軸回りの回転（右を向く）をヘッド回転、Y軸回り

NewObject()組み込み関数を使って、Triangleに形状を生成の回転（上を向く）をピッチ回転、X軸回りの回転（首を右に傾するための用意をします。NewObject()の引数には最大頂点ける）をバンク回転と呼びます（図2）。

数と最大面数を与えます。頂点数、面数は実際に使用する数

J3Wの中には、1つだけ常に存在する固定された特別な座標より多くても問題ありませんが、少ないとエラーが発生しま系があり、すべての物体の座標系の基準となっています。北す。形状の定義はDefPoint組み込み関数でX、Y、Z座標を指を向いて立ち、北がX、東がY、下がZとなるわけです。これ

定して1つずつ頂点を登録します。頂点番号はオブジェクトごを「ワールド座標系」と呼び、クラスごとに重力を設定できまとに0から登録順に付けられます（ VertexRelative組み込み関すが、重力は物体の姿勢に関係なくワールド座標系の下方向数で変更可能）。

（Zが正の方向）に働きます。

そして、DefPlane組み込み関数で色、頂点数、頂点番号列

ここで使用している座標系は航空力学で使用されるNED系を指定することで面を定義します。面には表と裏があり、（X：North［前］、Y：East［右］、Z：Down［下］）で、3次元グラ

DefPlane組み込み関数1つでは、裏からは不可視になります。

フィックでよく使われる座標系とは異なりますが、地上の建ここでは頂点を6個登録して、三角形の裏表の面を作成してい造物のように広がりのある空間では高さ情報を最後に持つ座ます。

標系のほうが読みやすいと思います。座標値は符号つき32bit

1つの平面の表と裏を表示するために、頂点を表と裏の面で整数の範囲（±20億）が可能です。とりあえず、最初のうちは共有して面を設定することができますが、なるべく1つの平面あまり難しく考えず、「前がX、右がY、下がZ」とだけ覚えての表と裏の頂点を共有させないでください。リスト3では同じおくといいでしょう。

頂点を2回ずつ登録しています。1平面の表と裏ではなく、例

クラスmainでは、自動的に実行されるINITメソッドの冒頭

えば立方体の頂点のような場合には、頂点の共有は全く問題で、クラスTriangleのインスタンスをnew()組み込み関数をありません。しかし、1つの平面の表と裏で頂点を共有する使って生成しています。これでクラスTriangleのインスタンと、頂点ごとに法線ベクトルを与える必要がある環境では問スは実行を始めます。2つのインスタンスが同時に動き始めま題となる可能性があるためです。すでにWindowsのDirectX版（のインスタンス）の動すが、文章では視点となるmainクラス（o b s o l e t e）で問題になりました。L i n u xでも、今後Mesa作から説明します。

（OpenGL）
版を作成するときのための予防線です ;-)。

視点には頂点も面も必要ないので、頂点と面の数を0として（6000, 2880）
で指定してい三角形の物体の運動はRotHead「見えない物体」を生成しています。ただし、表示されなくてもます。この場合6秒間で360度ヘッド回転（Z軸回り）して終了しSetPositionで設定された位置と角度の情報を持ちます。まます。回転速度を変更して実際に試してください。さらに、で渡す必
た、引数をレジスタ変数（ RX、RY、RZ、RH、RP、RB）

Up、Forwardなどの組み込み関数を順次実行することで、い要のある組み込み関数がいくつもあります。レジスタ変数とはろいろな動きを与えることができます。

仮想CPUのレジスタを直接扱う変数です。組み込み関数は仮想CPUの命令に1対1に対応しているため、レジスタを直接操作終わりにする変数があるほうが都合が良かったので採用しています。

SetPositionには、位置座標（RX,RY,RZ）と角度（RH,RP,RB）を

今回は、J3Wの特徴、インストール、サンプルの実行方法

レジスタ変数に設定して呼び出すことで、視点の位置と角度とJ3C言語のプログラミング例について簡単に解説しました。

を指定します。ClearRegisters()はRX、RY、RZ、RH、RP、J3W パッケージには1MbytesほどのサンプルソースとドキュRBをすべて0にする関数です。

メントが付属しています。プログラミングの経験者ならば文See()を実行したインスタンスから見た光景がウィンドウに表示されます。実際に表示するためにはGraphMode組み込み書よりプログラムソースを読んだほうが理解が早いかもしれません。

関数を実行して、グラフィックウィンドウを開く必要があり

J3WのWebページ、また添付ドキュメントでは、J3C言語にます。この組み込み関数は、どのインスタンスが実行しても関してもう少し詳しく解説しています。どんどん勉強して、構いませんが、複数のウィンドウを開くことはできません。

3Dアニメーション作品や3Dゲームの制作を目指しましょう！

Linux Japan February 2001

47