|
Study C販売のご案内
Study Cのオンライン販売を行っております。
是非ご利用ください。
|
|
|
1.3Dタートルグラフィックス
一昔前、ロゴという言語のこともよく耳にする時期がありました。子供にも理解できるわかりやすい言語といわれていたと思います。今では消え去ってしまった言語かと思っていましたが、Web上で検索してみるとロゴに関するページが結構存在していました。作者(StudyCの)自信ロゴの文法は全く見たことがが無かったのですが、1992か93年ごろのCマガジン(ソフトバンク)にlogomotionというロゴ言語の処理系が付録のFDに収録されていました。logomotionには手軽に3次元グラフィックスを楽しめる、3Dタートルグラフィックス(以下3Dタートルと略す)関数が用意されていました。この時、そのデモプログラムのみごとさにひかれ、StudyCで3Dタートル機能を取り入れました。
この3Dタートル機能は、ワイヤーフレームによる描画しかできませんが、視点を自由に移動できるため3D空間を飛行するようなプログラムを簡単に作ることができます。関数とパラメータの数も少ないのですぐに使いこなすことができるようになると思います。
3Dグラフィックスを描画するのは非常に簡単でタートルを上下左右前後に移動/回転することで図形を描いていきます。これらの操作を行う関数を次に示します。
・tg_fd(x)
・tg_bk(x)
・tg_mr(x)
・tg_ml(x)
・tg_mu(x)
・tg_md(x)
それぞれxの値だけタートルを移動します。移動する方向は下の図の通りです。
tg_fd tg_mu
↑ ↑
前 上
tg_ml←左 右→tg_mr tg_bk←後 前→tg_fd
後 下
↓ ↓
tg_bk tg_md
|
・tg_rt(x)
・tg_lt(x)
・tg_rr(x)
・tg_rl(x)
・tg_up(x)
・tg_dn(x)
それぞれ式の値だけタートルを回転します。回転方向は次の図の通りです。角度は度数(直角が90)で与えます。
tg_lt← →tg_rt tg_up tg_rl← →tg_rr
前 上 ↑ 上
左 右 後 前 左 右
後 下 ↓ 下
tg_dn
|
また、3Dタートルでは視点を移動して描画した図形を観察することができます。視点をループなどで繰り返し移動すると描画した図形が移動しているように見えます。視点の移動はカレントタートルを視点タートルに変更してから先に説明した移動/回転命令を実行して行います。視点/描画の切り替えはつぎの関数で行います。
・tg_view()
カレントタートルを視点タートルに変更します。
・tg_draw()
カレントタートルを描画タートルに変更します。
また、視点を移動する場合は画面の再描画を自分で制御する必要があります。tg_manual()関数でマニュアルモードに切り替えtg_refresh()で画面を再描画します。
注)視点タートルといっても描画タートルと同じ機能です。
・tg_auto()
描画が起こればすぐに表示します。視点タートルが移動すれば画面がすぐに再描画されます。
・tg_manual()
描画や視点タートルの移動が起きても、画面を更新しません。再描画させたい時に、tg_refresh()を呼び出します。
・tg_refresh()
MANUALモードのときに、画面を更新します。
その他、よく使いそうな関数を次に示します。
・tg_pu()
ペンを上げます。この後、タートルが移動しても描画されません。
・tg_pd()
ペンを下げます。この後、タートルが移動すると、線分描かれます。
・tg_circle(x)
タートルの位置を中心にして、xを半径とする円を描きます。タートルの位置と向きは変わりません。
・tg_home()
タートルを、原点(0,0,0)におき、画面上を前方、画面右を右方、手前を上方に設定します。
・tg_setpc(x)
描画色をxの色にします。
0 : 黒 8 - 15 は 0 - 7 の暗い色
1 : 青
2 : 赤
3 : 紫
4 : 緑
5 : 水色
6 : 黄色
7 : 白
|
2.手軽にできる3次元グラフィックス例
例1)次のプログラムはsquare()で描いた四角形が自分に向かってくるように移動させます。
void square(void);
void move(void);
void main()
{
tg_openwin(640, 400);
square();
move();
}
void square()
{
tg_pu();
tg_ml(1500.0);
tg_bk(100.0);
tg_pd();
tg_fd(100.0);
tg_rt(90.0);
tg_fd(100.0);
tg_rt(90.0);
tg_fd(100.0);
tg_rt(90.0);
tg_fd(100.0);
tg_home();
}
void move()
{
int i1;
double delta;
tg_pu();
tg_view();
tg_manual();
tg_home();
tg_bk(100.0);
tg_md(50.0);
tg_dn(90.0);
tg_lt(90.0);
tg_bk(100.0);
for(i1 = 0; i1 < 200; i1++){
tg_fd(10.0);
tg_refresh();
}
}
|
例2)次のプログラムは色つきで描いた立方体を回転させているように見せます。
void main()
{
int i1;
double m;
tg_openwin(400, 400);
tg_view();
tg_pu();
tg_bk(4000.0);
tg_draw();
tg_pu();
for(i1 = 0; i1 < 4; i1++){
tg_setpc(i1+2);
tg_pd();
tg_mr(500.0);
tg_md(500.0);
tg_ml(500.0);
tg_pu();
tg_mu(500.0);
tg_mr(500.0);
tg_rt(90.0);
}
tg_view();
tg_manual();
tg_pu();
tg_home();
tg_dn(90.0);
tg_bk(8000.0);
tg_rr(30.0);
for(i1 = 0; i1 < 500; i1++){
tg_rt(5.0);
tg_ml(8000 * 3.14 * 2 / 72);
tg_refresh();
}
}
|
例3)次のプログラムは滑走路が移動して飛行機(これは描いていません)が上昇していくところをイメージしてものです。
void runway(void);
void centerline(void);
void square(void);
void takeoff(void);
void main()
{
tg_openwin(640, 400);
runway();
centerline();
takeoff();
}
void runway()
{
tg_pu();
tg_ml(9000.0);
tg_bk(180.0);
tg_rt(90.0);
tg_pd();
tg_fd(18000.0);
tg_mr(10.0);
tg_bk(18000.0);
tg_pu();
tg_md(100.0);
tg_pd();
tg_fd(18000.0);
tg_ml(10.0);
tg_bk(18000.0);
tg_home();
}
void centerline()
{
int i1;
tg_pu();
tg_home();
tg_bk(190.0);
tg_md(29.0);
tg_dn(90.0);
tg_lt(90.0);
tg_bk(3000.0*3);
for(i1 = 0; i1 < 60; i1++){
tg_pd();
square();
tg_pu();
tg_home();
tg_bk(190.0);
tg_md(47.0);
tg_dn(90.0);
tg_lt(90.0);
tg_bk(3000.0*3);
tg_fd(300.0*i1);
}
}
void square()
{
tg_fd(50.0);
tg_rt(90.0);
tg_fd(5.0);
tg_rt(90.0);
tg_fd(50.0);
tg_rt(90.0);
tg_fd(5.0);
tg_rt(90.0);
tg_pu();
tg_mr(2.0);
tg_fd(5.0);
}
void takeoff()
{
int i1;
double delta;
tg_pu();
tg_view();
tg_manual();
tg_home();
tg_bk(180.0);
tg_md(50.0);
tg_dn(90.0);
tg_lt(90.0);
tg_bk(800.0);
delta = 0;
for(i1 = 0; i1 < 150; i1++){
delta += 0.05;
tg_fd(delta);
tg_refresh();
}
for(i1 = 0; i1 < 100; i1++){
tg_fd(7.5);
tg_refresh();
}
delta = 0;
for(i1 = 0; i1 < 100; i1++){
delta += 0.001;
tg_mu(delta);
tg_fd(7.5);
tg_refresh();
}
for(i1 = 0; i1 < 200; i1++){
delta += 0.01;
tg_mu(delta);
tg_fd(7.5);
tg_refresh();
}
for(i1 = 0; i1 < 100; i1++){
delta += 0.1;
tg_mu(delta);
tg_rr(0.5);
tg_rt(0.5);
tg_fd(7.5);
tg_refresh();
}
}
|