物理エンジンで学ぶC言語 [Step2:繰り返し]

ピラミッド:ホームワークの答え

ピラミッド:ホームワーク6の答え

Step1で物体の描画を学びました.今回はロボコンの世界大会ABUロボコン2010に日本代表として出場したKIT夢考房チームが最高技術賞を受賞したことを記念して,世界大会の開催地であるエジプトにちなみ,ピラミッドを作ってみましょう.今回は同じ形状のものを繰り返しても描画する方法を学びます.

C言語の繰り返しにはfor文, while文,do while文がありましたね.ここではfor文を使い,図のようなピラミッドを作ってみましょう.では、さっそくソースコードを見ていきます.

4行目から6行目は配列の初期化です.宣言と同時に値を代入することを初期化とよびます.
13行目のdsSetColor()は色を設定する関数です.引数は光の3原色の値を3個取り,1番目は赤,2番目は緑,3番目は青成分で0以上1以下の値となります.ちなみに,全部0だと黒,全部1.0だと白です.
15から18行目がfor文です.繰り返し回数はnum回,ここでは10行目でnumが11になっているので,11回ループが回ることになります.
16行目のp[1]は絶対座標系のy座標の値です.なお,p[0]にはx座標,p[2]にはz座標の値が入っていて,x座標は地面の中央マーカーから赤マーカーの方向,y座標は中央マーカーから青マーカーの方向,z座標は中央マーカーから上空方向になります.
17行目は直方体の描画です.
これで今回は終わりです.ホームワークは少し難しくします.

/* step2 物体の繰り返し表示 */
#include "dm2.h"
 // Rは回転行列の各要素が格納される配列. 4, 8, 12番目の要素は高速化のために常に0
double R[12] ={1,0,0,0, 0,1,0,0, 0,0,1,0};
double p[3] = {0.0, 0.0, 0.05};   // 重心の位置(x,y,z)[m]
double sides[3] = {0.1, 0.1, 0.1}; // 直方体の各辺の長さ(x, y, z)[m]

void simLoop(int pause)        /***  シミュレーションループ ***/
{
 int i, num = 11;             // 直方体の数
 dsSetColor(1.0, 0.0, 0.0);   // 赤色の設定(赤,緑,青)
 for (i = 0; i < num; i++) {
  p[1] = i * 0.2;       // p[1]は直方体重心のy軸成分
  dsDrawBox(p,R,sides); // 直方体の表示
 }
}

int main()         /*** main関数 ***/
{
 dmLoop(800, 600, simLoop); // シミュレーションループ ウインドウの幅,高,ループ関数
 return 0;
}

ホームワーク2

  1. step2-101208.zipをダウンロードして実行しよう.
  2. 赤い直方体(この例では立方体)の色を黄に変えよう.
    • dsSetColor(float r, float g, float b)
      r, g, bは光の3原色の赤、緑、青成分。値は0以上1以下。例えば、緑にしたかったらrとbは0、gには1を代入する。
  3. 赤い直方体の位置を左にずらし,中央の直方体が原点に来るようにしましょう.
  4. 上の問題で,直方体の色を白から赤に徐々に変化させよう.
  5. forループを2重にし,x軸方向にも直方体を描画し,合計121個の直方体を表示しよう.
  6. forループを3重にし、z軸方向(上空方向)にも直方体を10段(合計11段)描画し、大きな立方体を表示しよう。
  7. forループを3重にし,z軸方向にも直方体を描画し,直方体の間隔も調整して上図のようなピラミッドを作ろう.

昔エジプトに行きピラミッドに少しだけ登ったことがあります。遠くからはきれいな四角錐に見えますが、大きな立方体が積み重ねられできています。残念ながら今は登ることが禁止されているようですね。今年ABUロボコンに出場した学生に聞くと、天辺まで上らないように銃を構えた兵士が睨みを利かせているそうです。もっともこれは、以前テロが起き観光客に犠牲者が出たためでしょう。

でむ

ode
スポンサーリンク
シェアする
demura.netをフォローする

コメント

タイトルとURLをコピーしました