<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>demura.net: ロボットの開発と教育 &#187; ODE</title>
	<atom:link href="http://demura.net/category/9ode/feed" rel="self" type="application/rss+xml" />
	<link>http://demura.net</link>
	<description>ロボット達のサッカーW杯RoboCup，つくばチャレンジ，物理計算エンジンＯＤＥと本サイトで開発している３次元描画ライブラリirrDrawStuffなどのロボット開発プラットフォームを開発者の視点で情報発信． なお，ODE本では左下動画のようなロボットシミュレータ作成法を学びます．まずは動画をクリックして体験しよう！</description>
	<lastBuildDate>Fri, 03 Feb 2012 01:49:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/category/9ode/feed" />
		<item>
		<title>物理エンジンODEで学ぶC言語 [STEP6: まとめ]</title>
		<link>http://demura.net/9ode/9383.html</link>
		<comments>http://demura.net/9ode/9383.html#comments</comments>
		<pubDate>Thu, 19 Jan 2012 14:14:22 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9383</guid>
		<description><![CDATA[今回でこの講座は終わりです。先週作り始めたブロック崩し風ゲームを完成させましょう。 この手のゲームで必要になることは、ボールがブロックの当たったときにブロックの消す処理です。このサンプルプログラムではブロックを３個用意し [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9384" class="wp-caption alignnone" style="width: 410px"><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/block2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/01/block2.jpg" alt="" title="block2" width="400" height="313" class="size-full wp-image-9384" /></a><p class="wp-caption-text">ブロック崩し風ゲーム。未完成。続きを作ろう！</p></div>
<p>今回でこの講座は終わりです。先週作り始めたブロック崩し風ゲームを完成させましょう。</p>
<p>この手のゲームで必要になることは、ボールがブロックの当たったときにブロックの消す処理です。このサンプルプログラムではブロックを３個用意し、それぞれの当たりを判定する変数をblock1_hit, block2_hit, block3_hitとして０で初期化します。</p>
<p>ボールとブロックが衝突したらその変数を１に設定し、そのブロックを破壊し表示しないという処理を行っています。</p>
<pre class="brush:cpp;">// step6.cpp
int block1_hit = 0, block2_hit = 0, block3_hit = 0; //　ブロックにボールが衝突すれば１、しないと０

/***  シミュレーションループ　***/
void simLoop(int pause)
{
    int i, j;

    dmWorldQuickStep(); // シミュレーションを１ステップ進める(高速版)

    dmDraw(&amp;ball);
    dmDraw(&amp;bar);
    dmDraw(&amp;field);

    for (i =0; i &#60; 3; i++)
    {
        dmDraw(&amp;fence&#91;i&#93;);
    }

    // ブロックがボールに衝突していない場合はブロックを表示し
    // ブロックがボールに衝突した場合はブロックを破壊する。
    if (block1_hit==0) dmDraw(&amp;block1);
    else                  dmDestroyBox0(&amp;block1);

    if (block2_hit==0) dmDraw(&amp;block2);
    else                  dmDestroyBox0(&amp;block2);

    if (block3_hit==0) dmDraw(&amp;block3);
    else                  dmDestroyBox0(&amp;block3);

    STEPS++;
}</pre>
<p>次に、今まで秘密のベールに包まれていたdm6.cppを説明します。このファイルでODEを簡単に使う関数を作っています。まず、２，３行目のexternで始まる変数の宣言は、dm6.cpp以外のファイルで宣言しているよとコンパイラーに教えています。これらの行がないとblock1, block1_hitが宣言されていないとエラーになり、externを付けないとstep6.cppでも宣言されているので２重定義でエラーになってしまいます。大きなプログラムは複数のファイルで構成されるのでこのexternは覚えておきましょう。</p>
<p>お次は、衝突検出を説明します。これはdm6.cpp内のnearCallback関数で行われています。if else文でブロック１のジオメトリ(block1.geom)、ブロック２のジオメトリ(block2.geom)、ブロック３のジオメトリ(block3.geom)がボールのジオメトリ(ball.geom)がo1, o2のどちらかなら衝突しているので、衝突判定用の変数block1_hit, block2_hit, block3_hitに１を代入しています。なお、ジオメトリとはODEで衝突判定に使われる物体の属性です。</p>
<p>また、nearCallback関数は２つの物体（正確にはジオメトリ）が接近して衝突しそうになったら自動で呼び出せれる関数です。このような関数をコールバック関数と呼びます。電話のコールバックをイメージしてください。引数のジオメトリo1, o2は衝突しそうな２つのジオメトリです。</p>
<p>このサンプルプログラムでたった３個のブロック崩し風ゲームは完成です。後は、いろいろ工夫して自分だけのゲームを完成させてください。</p>
<p>終わり。</p>
<pre class="brush:cpp;">// dm6.cpp
extern dmObject ball, field, fence&#91;3&#93;, bar, block1, block2, block3;
extern int block1_hit, block2_hit, block3_hit;

/*** 衝突検出関数（コールバック関数） ***/
void nearCallback(void *data, dGeomID o1, dGeomID o2)
{
    static const int N = 10; // 接触点数の最大値
    dContact contact&#91;N&#93;;     // 接触点

    // 衝突情報の生成 nは衝突点数
    int n = dCollide(o1,o2,N,&amp;contact&#91;0&#93;.geom,sizeof(dContact));

    for (int i = 0; i &#60; n; i++)
    {
        contact&#91;i&#93;.surface.mode = dContactBounce; // 接触面の反発性を設定

        //　ボールとバーが接触したら反発係数を1.5に設定
        if(((ball.geom == o1) &amp;&amp; (bar.geom == o2)) || ((ball.geom == o2) &amp;&amp; (bar.geom == o1)))
        {
            contact&#91;i&#93;.surface.bounce = 1.5;          // 反発係数(実際の世界では0.0から1.0)
        }
        // ボールと床が接触したら反発係数を0.5に設定
        else if (((ball.geom == o1) &amp;&amp; (field.geom == o2)) || ((ball.geom == o2) &amp;&amp; (field.geom == o1)))
        {
            contact&#91;i&#93;.surface.bounce = 0.5;
        }
        // ボールとブロック１が接触したら。block1_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block1.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block1.geom == o1)))
        {
             block1_hit = 1;
        }
        // ボールとブロック2が接触したら。block2_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block2.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block2.geom == o1)))
        {
             block2_hit = 1;
        }
         // ボールとブロック3が接触したら。block2_hitを１に設定
        else if (((ball.geom == o1) &amp;&amp; (block3.geom == o2)) || ((ball.geom == o2) &amp;&amp; (block3.geom == o1)))
        {
             block3_hit = 1;
        }
        // その他は反発係数を0.8に設定
        else
        {
            contact&#91;i&#93;.surface.bounce = 0.8;
        }

        // contact&#91;i&#93;.surface.bounce_vel = 0.05;      // 反発に必要な最低速度
        contact&#91;i&#93;.surface.mu = 0.0;// dInfinity;        // 摩擦係数

        // 接触ジョイントの生成
        dJointID c = dJointCreateContact(world,contactgroup,
                                         &amp;contact&#91;i&#93;);
        // 接触している２つの剛体を接触ジョイントにより拘束
        dJointAttach(c,dGeomGetBody(contact&#91;i&#93;.geom.g1),
                     dGeomGetBody(contact&#91;i&#93;.geom.g2));
    }
}</pre>
<p>ホームワーク</p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/step6-120119.zip">step6-120119.zipをダウンロードして実行しよう！</a></li>
<li>ブロックの数を１個増やそう。</li>
<li>３で作ったブロックの色を黒に変更しよう。</li>
<li>ブロックの数を増やし、競技盤の半分ぐらいは埋め尽くそう。配列を使うのが望ましい。</li>
<li>ボールの初期位置と飛び出す方向をランダムに変えよう。</li>
<li>バーが競技盤を飛び出してしまいます。飛び出さないようにしよう。</li>
<li>得点を表示する機能を付けよう。標準出力にprintfでもかまいません。</li>
<li>いろいろ工夫して自分だけのブロック崩し風ゲームを作ろう！遊ぶためにゲームの説明を文字ウインドウに表示しよう。</li>
</ol>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9383.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9383&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9383.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9383.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語 [STEP5: 構造体]</title>
		<link>http://demura.net/9ode/9353.html</link>
		<comments>http://demura.net/9ode/9353.html#comments</comments>
		<pubDate>Mon, 09 Jan 2012 05:28:59 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9353</guid>
		<description><![CDATA[少し、遅くなりましたが新年明けましておめでとうございます。今年も、demura.netをよろしくお願いします。 ODEで学ぶC言語2のStep5です．今回は構造体と物体へ力やトルクを加える方法，さらにシミュレーションのリ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9356" class="wp-caption alignnone" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/block1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2012/01/block1-300x242.jpg" alt="" title="block1" width="300" height="242" class="size-medium wp-image-9356" /></a><p class="wp-caption-text">ブロック崩しを作ろう！</p></div>
<p>少し、遅くなりましたが新年明けましておめでとうございます。今年も、demura.netをよろしくお願いします。</p>
<p>ODEで学ぶC言語2のStep5です．今回は構造体と物体へ力やトルクを加える方法，さらにシミュレーションのリセット法などを学びます．構造体の概要については既にわかっているものとし，サンプルコードを示すことにより具体的な使い方を学びます．例として、Step5とStep6でスティーブン・ジョブスがAtari社時代に、アップルの共同設立者ウォズニアックと開発に携わったBreakout（ブロック崩し）風のゲームを作ってみましょう。</p>
<p><span id="more-9353"></span></p>
<p><strong>○　構造体</strong></p>
<p>配列では同じ型しかまとめることができませんでしたが，構造体では違う型をまとめて扱うことができるのでシミュレーションなど物体に多くの属性がある場合に便利です．このサンプルプログラムでは物体をdmObjectという構造体で次のように表しています．dm5.hの１６行目に定義しています．</p>
<pre class="brush:cpp;">typedef struct{
    dBodyID body; // ボディのID
    dGeomID geom; // ジオメトリのID
    const double *p; // x, y, z　&#91;m&#93;
    const double *R;   // 回転行列 要素数4x3
    double m; // 質量 &#91;kg&#93;
    double r,l; // 半径 &#91;m&#93;, 長さ &#91;m&#93;
    const double *side; // サイズ　x,y,z
    const double *color; // 色 r,g,b
} dmObject;</pre>
<p>また、STEP4まではdmLoop関数の引数にstep関数やcommand関数を渡していましたが、ここでは関数のポインタを要素に持つ構造体dmFunctionsを定義します。今まではdmLoopに渡す関数が増えるとその数だけ引数が多くなってしまいましたが、この構造体だけを引数として渡せば良いのでプログラムがすっきりします。</p>
<pre class="brush:cpp;">typedef struct
{
    void (*start)();            // 初期化関数
    void (*step) (int pause);	// ステップ関数
    void (*command) (int cmd);	// キー関数
} dmFunctions;</pre>
<p>○<strong> 衝突検出だけ働く物体の作り方</strong></p>
<p>物理エンジンODEでは物体は２つの属性からできています。一つは動力学計算の対象となるbody（ボディ）、もう一つは衝突検出の対象となるgeometry（ジオメトリ）です。ゲームでは動かない建物や壁など動力学計算を働かせる必要のない物体は衝突検出計算だけを適応すれば計算処理が軽くて済みます。ここでは、衝突検出計算だけ働く物体を作るAPIを紹介します。</p>
<ul>
<li><strong>void dmCreateBox0(dmObject *obj, double p[3], double R[12], double m, double side[3], double color[3]);</strong></li>
</ul>
<p>衝突検出計算しか作用しない物体を作成します．dmCreateBoxの後に0（零）を付け加えたAPI名です。引数のp[3]は位置(x,y,z)[m]，R[12]は姿勢（回転行列）, mは質量[kg]，sideは直方体の各辺の長さ[m]，color[3]は色(赤，緑，青各成分、値は0以上1以下）です．同様なAPIとして、dmCreateSphere0, dmCreateCylinder0, dmCreateCapsule0があります。</p>
<p>○<strong> 姿勢の変更</strong></p>
<p>物体の姿勢を変更するためには次のAPIを使い回転行列Rの値を変更します．ここで，Rは回転行列が格納されている配列へのポインタ，ax, ay, axは回転軸ベクトル．angleは回転角度となります．なお，dだけで始まるAPIはODEのAPIです．</p>
<ul>
<li><strong>dRFromAxisAndAngle(double　R[12], double  ax, doulbe  ay, double  az, double angle);</strong></li>
</ul>
<p><strong>○　力，トルクの加え方</strong></p>
<ul>
<li><strong>void dmAddForce(dmObject *obj, double fx, double fy, double fz)</strong>
<ul>
<li>物体objの重心に力(fx,fy,fz)を加える</li>
</ul>
</li>
<li><strong>void dmAddTorque(dmObject *obj, double fx, double fy, double fz)</strong>
<ul>
<li>物体objの重心にトルク(fx, fy, fz)を加える．fx，ｆｙ，ｆｚはそれぞれx, y, z軸まわりのトルク</li>
</ul>
</li>
</ul>
<p>○　<strong>高速なシミュレーション</strong></p>
<p>前回のサンプルではシミュレーションのステップ関数としてdmWorldStep()を使いましたが，ここではより高速なdmWorldQuickStep()を使います．ただし，dmWorldStep()と比較して精度が悪くなります．</p>
<p><strong>○　シミュレーションのリセット</strong></p>
<p>rまたはRキーを押すと，resetSim関数が呼ばれてシミュレーションがリセットされます．resetSimの中身はシミュレーションループが１回以上呼び出されたときにdmInit関数を呼び出して初期化し，物体を再度生成しています．</p>
<p><strong>○　ソースコード</strong></p>
<pre class="brush:cpp;">/* step5 ブロック崩し 2012-01-09 　*/
#include "dm5.h"

static int STEPS = 0;   // シミュレーションのステップ数
double red&#91;3&#93;     = {1.3, 0.0, 0.0}; // 赤色
double yellow&#91;3&#93; = {1.3, 1.3, 0.0}; // 黄色
double green&#91;3&#93; = {0.0, 0.8, 0.0}; // 緑色

dmObject ball, field, fence&#91;3&#93;, bar; // ドミノ, フィールド, 柵
dmFunctions dmf; // 描画関数の構造体

/***  シミュレーションループ　***/
void simLoop(int pause)
{
    int i;

    dmWorldQuickStep(); // シミュレーションを１ステップ進める(高速版)

    dmDraw(&amp;ball);
    dmDraw(&amp;bar);
    dmDraw(&amp;field);
    for (i =0; i &#60; 3; i++)
    {
        dmDraw(&amp;fence&#91;i&#93;);
    }

    STEPS++;
}

void resetSim(int n)
{
    double m = 0.1; // 質量
    double side&#91;3&#93; = {0.2, 0.05, 0.5}; // サイズ
    double R&#91;12&#93; = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢
    double ball_pos&#91;3&#93;={-0.91, 0.25, 0.7}, ball_r = 0.03, ball_m = 0.1; // ボールの位置、半径、質量
    double bar_pos&#91;3&#93;={-0.08, 0, 0.6}, bar_side&#91;3&#93; = {0.01, 0.1, 0.1}, bar_m = 0.1; // ボールの位置、半径、質量
    double field_pos&#91;3&#93;={-0.5, 0, 0.5}, field_side&#91;3&#93; = {1, 1, 0.01}, field_m; // フィールドの位置、サイズ, 質量
    double fence_pos&#91;3&#93;&#91;3&#93; = {{-1.0, 0, 0.6}, {-0.5, -0.5, 0.6},{-0.5, 0.5, 0.6}};　// 柵の位置
    double fence_side&#91;3&#93;&#91;3&#93; = {{0.05, 1.05, 0.1}, {1.0, 0.05, 0.1}, {1.0, 0.05, 0.1}};
    double fence_m&#91;3&#93; = {0.1, 0.1, 0.1};
    int i;

    // シミュレーションの終了
    if (STEPS != 0)
    {
        dmClose();
    }

    dmInit(); // 初期化

    //  ボールの生成
    dmCreateSphere(&amp;ball, ball_pos, R, ball_m, ball_r, red);

    // バーの生成
    dmCreateBox0(&amp;bar, bar_pos, R, bar_m, bar_side, yellow);

    // フィールドの生成
    dmCreateBox0(&amp;field, field_pos, R, field_m, field_side, green);
    for (i =0; i &#60; 3; i++) {
        dmCreateBox0(&amp;fence&#91;i&#93;, fence_pos&#91;i&#93;, R, fence_m&#91;i&#93;, fence_side&#91;i&#93;, green);
    }
}

/*** キ―入力関数 ***/
void command(int cmd)
{
    switch (cmd)
    {
    case 'r':
    case 'R':
        resetSim(0);
        break;
     default:
        printf("Input r, R, f, F key \n");
        break;
    }
}

/*** カメラの位置と姿勢設定 ***/
void setCamera()
{
    float x =  -0.5, y = 0.0, z = 1.5;    // カメラの位置
    float roll = 0, pitch = -90, yaw = -180; // カメラの方向&#91;°&#93;
    dmSetCamera(x,y,z,roll,pitch,yaw);  // カメラの設定
}

/*** 描画用構造体の設定　***/
void setDraw()
{
    dmf.start       = &amp;setCamera;
    dmf.step        = &amp;simLoop;
    dmf.command = &amp;command;
}

/*** main関数 ***/
int main()
{
    resetSim(0); // シミュレーションのリセット
    setDraw();   // 描画関数の設定
    dmLoop(800, 600, &amp;dmf);  // ウインドウの幅，高, ループ関数，コマンド関数
    dmClose(); // 終了
    return 0;
}</pre>
<p><strong>ホームワーク５</strong></p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2012/01/step5a-120110.zip">これをダウンロードstep5a-120110して実行しよう！</a></li>
<li>黄色のバーをfまたはFキーを押すと左、jまたはJキーを押すと右にバーが動くように変更しよう！<br />
ヒント：　黄色のバーには動力学を適応させていないのでdGeomSetPosition(dGeomID geom, double x, double y, double z);を使って強制的に位置を移動させる。ここで、１番目の引数にはbar.geomを入れればよい。2から４番目の引数は、絶対座標系での位置のx, y, z成分。</li>
<li>ボールが斜めに落ちるように、初めに横方向に力を加えよう！<br />
ヒント：dmAddForce(dmObject *obj, double fx, double fy, double fz); を使おう。resetSim関数内のdmCreateSphere関数のすぐ後にdmAddForceを入れよう。なお、力の方向や大きさを乱数を使って変化させるとゲームが面白くなる。</li>
<li>ブロックを３行１０列、合計３０個表示しよう！各行で色を変えると見栄えがするよ。<br />
ヒント： dmObject fence[3]; ボール落下防止用の柵に関するコードを参考にすると良い。</li>
</ol>
<div>　　以上</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9353.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9353&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9353.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9353.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶＣ言語 [Step4: 関数]</title>
		<link>http://demura.net/9ode/9344.html</link>
		<comments>http://demura.net/9ode/9344.html#comments</comments>
		<pubDate>Tue, 20 Dec 2011 23:03:43 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9344</guid>
		<description><![CDATA[ODEで学ぶC言語のStep4です．今回は私がODEのAPIを元に作成した関数を使い，赤い球を落下させるプログラムを説明します． 今までのプログラムでは描画だけでしたが，今回からシミュレーションやゲームを作るために必要な [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7485" class="wp-caption aligncenter" style="width: 673px"><a href="http://demura.net/wordpress/wp-content/uploads/2010/07/step4.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2010/07/step4.jpg" alt="落下する赤い球" title="step4" width="663" height="532" class="size-full wp-image-7485" /></a><p class="wp-caption-text">落下する赤い球</p></div>
<p>ODEで学ぶC言語のStep4です．今回は私がODEのAPIを元に作成した関数を使い，赤い球を落下させるプログラムを説明します．</p>
<div id="_mcePaste">今までのプログラムでは描画だけでしたが，今回からシミュレーションやゲームを作るために必要な動力学計算や衝突検出計算も含んでいます．サンプルプログラムとしては，物理シミュレーションで最も簡単な物体の落下を取り上げます．C言語などのプログラミングの教科書では初めの例題はHello Worldを表示する例が定番です。ここではHello Worldの物理シミュレーション版を紹介します．</div>
<div><span id="more-9344"></span></div>
<div>
<p>&nbsp;</p>
<ul>
<li><strong>API</strong>
<p style="padding-left: 25px;">ここでは簡単にするためにODEのAPIを元に，超簡単なAPIを作成しました．ただし、ODEのAPIのように細かいことはできません。</p>
<ul>
<li><strong>void dmInit()；<br />
</strong>シミュレーションを初期化します．</li>
<li><strong>void dmCreateSphere(dmObject *obj, double p[3], double R[12], double m, double r, double color[3]);<br />
</strong>球を作成します．引数のp[3]は位置(x,y,z)[m]，R[12]は姿勢（回転行列）, mは質量[kg]，rは半径[m]，color[3]は色(赤，緑，青各成分、値は0以上1以下）です．</li>
<li><strong>void dmWorldStep();</strong><br />
シミュレーションを１ステップ進めます．</li>
<li><strong>dmDraw(dmObject obj);<br />
<span style="font-weight: normal;">引数のオブジェクトobjを描画する．<br />
</span> </strong></li>
</ul>
</li>
<li><strong>ソースコード</strong>
<ul>
<ul>次に、詳しいコメントのついたソースコードを以下に示します。main関数から読んでください。</ul>
</ul>
<pre class="brush:cpp">/* step4 リンゴ（林檎）の落下 　*/
#include "dm4.h"

dmObject apple;  // リンゴ

void command(int cmd)
{
   printf("Input %d", cmd);
}

void simLoop(int pause)           /***  シミュレーションループ　***/
{
    dmWorldStep();   // シミュレーションを１ステップ進める
    dmDraw(apple);   // リンゴの描画
}

int main()   /*** main関数 ***/
{
    double p1&#91;3&#93; = {0.0, 0.0, 2.0}; // 位置 &#91;m&#93;
    double R&#91;12&#93; = {1,0,0,0, 0,1,0,0, 0,0,1,0}; // 姿勢（回転行列）

    double red&#91;3&#93;    = {1.0, 0.0, 0.0};　// 赤色
    double r = 0.2, m = 1.0;  // 半径&#91;m&#93;,質量&#91;kg&#93;

    dmInit(); // 初期化
    dmCreateSphere(&amp;apple, p1, R, m, r, red); // 球の作成
    dmLoop(800, 600, simLoop, command);  // ウインドウの幅，高, ループ関数，コマンド関数
    dmClose(); // 終了処理

    return 0;
}</pre>
<ul>
<li>これは赤い玉の自由落下のプログラムです。まず、dmInit()でシミュレーションを初期化します。</li>
<li>次に物体を作ります．球を作るAPIはdmCreateSphere()です．</li>
<li>物体の生成が終わったら、次はシミュレーションを１ステップ進めます。dmLoop()の中身はwhileループになっていて、繰り返しsimLoop関数とキー操作可能なcommand関数を呼び出しています。</li>
<li>お次は物体の描画です．dmDraw(apple)で落下する球を表示しています。dmDraw()の引数は表示したい物体をいれてください。</li>
<li>最後にシミュレーションをdmClose()で終了します．なお、小文字のdmで始まる関数は私がこの講義用にODEのAPI(application interface)を元に作成したものです．</li>
</ul>
</li>
<li><strong>ホームワーク４</strong>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2011/01/step4-1101201.zip">step4-110120.zip</a>をダウンロードして実行しよう！</li>
<li>次のAPIを使い黄色のボックスを位置p[3]={0.0, -1.0, 2.0}に作成し，落下させるプログラムを作ってください．
<ul>
<li>void dmCreateBox(dmObject *obj, double p[3], double R[12], double m, double side[3],  double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢（回転行列）R[12],  質量　m, サイズ(x,y,z) side[3], 色　color[3]</li>
<li>なお、回転行列は3&#215;3行列ですが、ODEでは高速化のために3&#215;4行列として各行の最後に0を追加しています。</li>
</ul>
</li>
<li>今度は赤色の円柱を位置(0.0, 1.0, 4.0)に作成し，落下させなさい．
<ul>
<li>void dmCreateCylinder(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢　R[12],  サイズ sides[3], 半径 r, 長さ l,　質量　m, 色　color[3]</li>
</ul>
</li>
<li>最後に，青色のカプセルを位置(-1, 0, 2)に作成し，落下させなさい．
<ul>
<li>dBodyID  dmCreateCapsule(dmObject *obj, double p[3], double R[12], double m, double r, double l, double color[3]);</li>
<li>物体 obj, 位置　p[3], 　姿勢　R[12],  サイズ sides[3], 半径 r, 長さ l,　質量　m, 色　color[3]</li>
</ul>
</li>
</ol>
</li>
</ul>
<p>&nbsp;</p>
</div>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9344.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9344&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9344.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9344.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語 [Step3：switch文]</title>
		<link>http://demura.net/9ode/9338.html</link>
		<comments>http://demura.net/9ode/9338.html#comments</comments>
		<pubDate>Thu, 15 Dec 2011 04:53:33 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9338</guid>
		<description><![CDATA[Step2でfor文を使った繰り返しを練習しました。ここではswitch文を使ったキー処理の方法を学びます．キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_7432" class="wp-caption aligncenter" style="width: 460px"><a href="http://demura.net/wordpress/wp-content/uploads/2010/07/step3a.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2010/07/step3a.jpg" alt="step3サンプルプログラムの実行画面" title="step3a" width="450" height="384" class="size-full wp-image-7432" /></a><p class="wp-caption-text">step3サンプルプログラムの実行画面</p></div>
<p>Step2でfor文を使った繰り返しを練習しました。ここではswitch文を使ったキー処理の方法を学びます．キーボード入力の処理にswitch文はうってつけです。 ゲームではキーボード入力によりレーザービームを発射したり，車を操縦しますね．switch文を使って，キーボードからのキー入力を処理する方法を学びます． <span id="more-9338"></span></p>
<ul>
<li><strong>switch文とキー処理</strong></li>
</ul>
<p><strong> </strong> 新しく登場したのが11行目のcommand関数です．これは，キーボードからのキー入力を引数cmdとして受け取ります．このサンプルプログラムではswitch文を使いキー入力の値に応じて分岐させ違う処理をさせています．zが入力されると初期位置のz成分を0.1m増加させます．つまり，zキーを押すたびに直方体全体が上空へ上がっていきます．その下のbreak文は忘れないでください．忘れるとdefaultに対応する21行目の文を実行し常にInput z keyと表示されてしまいます．</p>
<p>その他のキーを入力するとdefaultにある&#8221;Input z key&#8221;という文字列がコンソール画面に表示されます． なお、switch文の変わりにif文でもできますが、キー入力が増え分岐が多くなるとswitch文の方がすっきりした読みやすいプログラムを書けます。</p>
<ul>
<li><strong>乱　数</strong></li>
</ul>
<p><strong> </strong> ODEとは関係ありませんがゲームやシミュレータでは乱数も活躍します．乱数を使う場合は&#8221;stdlib.h&#8221;をインクルードします．ここではtime()関数も使っているので&#8221;time.h&#8221;もインクルードしています．</p>
<p>乱数を使用する場合は、まず，main関数の42行目にあるように乱数を初期化します．そのために<strong>void srand(unsigned seed）</strong>関数を使います。引数seedは乱数を発生させる種を入れます．それが同じ値の場合は，常に同じ乱数系列が発生します．srand(time(NULL))は実行時に乱数の種を変更する一般的な方法です． ちなみに、time(NULL)は万国標準時１９７０年１月１日からの経過秒数です。大きな数値になるのでパット見意味がわからりづらいですね．</p>
<p>実際に乱数を発生させているのがsimLoop関数の30行目のrand関数です．rand関数のプロトタイプ宣言は<strong>int rand(void)</strong>なので引数は取らず，int型の値を返します．RAND_MAXは乱数の最大値なので，30行目は0以上1以下の乱数を発生させ，それを赤成分の値に代入します．なお，rand()とRAND_MAXの割り算をするとint型になり小数点以下が切り捨てられるのでfloat型にキャスト（型変換）することを忘れないようにしましょう．これによって，表示されている直方体（以下ボックスと表記）の赤成分の色だけが変わることになります．</p>
<p>今回は２つのことを学びました．特に乱数はゲームで使うと非常に面白いゲームになるのでしっかり覚えておきましょう．</p>
<p style="text-align: right;">でむ</p>
<pre class="brush:cpp">/* step3 キー入力　switch文　*/
#include "dm3.h"
#include &#60;time.h&#62;
#include &#60;stdlib.h&#62;

// Rは回転行列の各要素が格納される配列. 4, 8, 12番目の要素は高速化のために常に０
double R&#91;12&#93; ={1,0,0,0, 0,1,0,0, 0,0,1,0};
double p&#91;3&#93; = {0.0, 0.0, 0.05};   //　重心の位置
double p&#91;3&#93; = {0.0, 0.0, 0.05};   // 位置(x,y,z)&#91;m&#93;
double sides&#91;3&#93; = {0.1, 0.1, 0.1}; // 直方体のサイズ(x, y, z)&#91;m&#93;
double start_x = 0.0, start_y = 0.0, start_z = 0.0; // 初期位置

void command(int cmd)
{
    float xyz&#91;3&#93;, hpr&#91;3&#93;;
    switch (cmd) {
        case 'z':
            start_z += 0.1;
            break;
        default:
            printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ　***/
{
  int i, j, num = 11;          // 直方体の数
  static float red = 0.0, green = 0.0, blue = 0.0; // 赤，緑，青成分

  for (i = 0; i &#60; num; i++) {
      for (j = 0; j &#60; num; j++) {
        red = (float) rand()/RAND_MAX;   // 赤成分を乱数で決定
        dsSetColor(red, green, blue);    // 色の設定
        p&#91;0&#93; = start_x;                  // 位置のx成分
        p&#91;1&#93; = i * 0.2 - 1.0  + start_y; // 位置のy成分
        p&#91;2&#93; = j * 0.2 + 0.05 + start_z; // 位置のz成分
        dsDrawBox(p,R,sides); // 直方体の表示
      }
  }
}

int main()         /*** main関数 ***/
{
  srand(time(NULL)); // 乱数の初期化
  dmLoop(800, 600, simLoop, command);  // ウインドウの横，縦，シミュレーション関数，コマンド関数
　return 0;
}</pre>
<p><strong>ホームワーク３</strong></p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2010/12/step3-101217.zip">step3-101217.zip</a>をダウンロードして実行しよう．</li>
<li>jキーを押すと右，fキーを押すと左にボックス全体が移動するようにしよう．</li>
<li>３行（ｊの値が２）、４列（iの値が３）目のボックスだけをキー操作でx, y, z軸の正負方向へ移動できるようにしよう．つまり，６個のキーを割り当てる必要があります．simLoop関数の中でif文を使う必要があります．</li>
<li>まず、ボックスを全て白色に変更し，乱数を使い１つのボックスだけ赤色に描画するプログラムを書こう．</li>
<li>まず、ボックスを全て白にし、数字０を赤いブロックを複数使い電光掲示板のように表示するプログラムを書こう．</li>
<li>[発展問題」　まず、ボックスを全て白にし、９から０までの数字を赤いブロックを複数使いカウントダウン表示する電光掲示板を作りましょう。０から９までの数字を表示する部分はそれぞれ関数にすること。</li>
</ol>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9338.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9338&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9338.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9338.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶＣ言語 [Step2:繰り返し]</title>
		<link>http://demura.net/9ode/9332.html</link>
		<comments>http://demura.net/9ode/9332.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 01:27:57 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9332</guid>
		<description><![CDATA[Step1で物体の描画を学びました．今回は同じ形状のものを繰り返しても描画する方法を学びます． C言語の繰り返しにはfor文, while文，do while文がありましたね．ここではfor文を使い，上図のようなピラミッ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4103" class="wp-caption alignnone" style="width: 544px"><a href="http://demura.net/wordpress/wp-content/uploads/2009/06/pyramid1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2009/06/pyramid1.jpg" alt="ピラミッド：ホームワークの答え" title="pyramid1" width="534" height="364" /></a><p class="wp-caption-text">ピラミッド：ホームワーク６の答え</p></div>
<p>Step1で物体の描画を学びました．今回は同じ形状のものを繰り返しても描画する方法を学びます．</p>
<p>C言語の繰り返しにはfor文, while文，do while文がありましたね．ここではfor文を使い，上図のようなピラミッドを作ってみましょう．では、さっそくソースコードを見ていきます．<br />
<span id="more-9332"></span><br />
4行目から6行目は配列の初期化です．宣言と同時に値を代入することを初期化とよびます．<br />
13行目のdsSetColor()は色を設定する関数です．引数は光の3原色の値を3個取り，１番目は赤，２番目は緑，３番目は青成分で0以上1以下の値となります．ちなみに，全部0だと黒，全部1.0だと白です．<br />
15から18行目がfor文です．繰り返し回数はnum回，ここでは10行目でnumが11になっているので，11回ループが回ることになります．<br />
16行目のp[1]は絶対座標系のy座標の値です．なお，p[0]にはx座標，p[2]にはz座標の値が入っていて，x座標は地面の中央マーカーから赤マーカーの方向，y座標は中央マーカーから青マーカーの方向，z座標は中央マーカーから上空方向になります．<br />
17行目は直方体の描画です．<br />
これで今回は終わりです．ホームワークは少し難しくします.</p>
<pre class="brush:cpp">/* step2 物体の繰り返し表示　*/
#include "dm2.h"
 // Rは回転行列の各要素が格納される配列. 4, 8, 12番目の要素は高速化のために常に０
double R&#91;12&#93; ={1,0,0,0, 0,1,0,0, 0,0,1,0};
double p&#91;3&#93; = {0.0, 0.0, 0.05};   //　重心の位置(x,y,z)&#91;m&#93;
double sides&#91;3&#93; = {0.1, 0.1, 0.1}; // 直方体の各辺の長さ(x, y, z)&#91;m&#93;

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

int main()         /*** main関数 ***/
{
　dmLoop(800, 600, simLoop); // シミュレーションループ ウインドウの幅，高，ループ関数
　return 0;
}</pre>
<p><strong>ホームワーク２</strong></p>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2010/12/step2-101208.zip">step2-101208.zip</a>をダウンロードして実行しよう．</li>
<li>赤い直方体（この例では立方体）の色を黄に変えよう．
<ul>
<li>dsSetColor(float r, float g, float b)<br />
r, g, bは光の３原色の赤、緑、青成分。値は0以上１以下。例えば、緑にしたかったらrとbは０、gには１を代入する。</li>
</ul>
</li>
<li>赤い直方体の位置を左にずらし，中央の直方体が原点に来るようにしましょう．</li>
<li>上の問題で，直方体の色を白から赤に徐々に変化させよう．</li>
<li>forループを２重にし，ｘ軸方向にも直方体を描画し，合計121個の直方体を表示しよう．</li>
<li>forループを３重にし、z軸方向（上空方向）にも直方体を10段（合計11段）描画し、大きな立方体を表示しよう。</li>
<li>forループを３重にし，z軸方向にも直方体を描画し，直方体の間隔も調整して上図のようなピラミッドを作ろう．</li>
</ol>
<p>昔エジプトに行きピラミッドに少しだけ登ったことがあります。遠くからはきれいな四角錐に見えますが、大きな立方体が積み重ねられできています。残念ながら今は登ることが禁止されているようですね。昨年ABUロボコンのエジプト大会に出場した学生に聞くと、天辺まで上らないように銃を構えた兵士が睨みを利かせているそうです。もっともこれは、以前テロが起き観光客に犠牲者が出たためでしょう。</p>
<p style="text-align: right;">でむ</p>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9332.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9332&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9332.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9332.html" />
	</item>
		<item>
		<title>物理エンジンODEで学ぶC言語[Step1:物体の描画]</title>
		<link>http://demura.net/9ode/9321.html</link>
		<comments>http://demura.net/9ode/9321.html#comments</comments>
		<pubDate>Thu, 01 Dec 2011 23:37:56 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9321</guid>
		<description><![CDATA[物理エンジンを使い楽しみながらＣ言語をマスターすることを目指して連載します。 なお，C言語の基本的なことは知っていることを前提としますので，プログラミング能力を高めるための楽しい演習だと思ってください． 今回は何もなかっ [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4039" class="wp-caption alignnone" style="width: 411px"><a href="http://demura.net/wordpress/wp-content/uploads/2009/06/step1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2009/06/step1.jpg" alt="step1.cppの実行画面" title="step1" width="401" height="300" class="size-full wp-image-4039" /></a><p class="wp-caption-text">step1.cppの実行画面</p></div>
<p>物理エンジンを使い楽しみながらＣ言語をマスターすることを目指して連載します。</p>
<p>なお，C言語の基本的なことは知っていることを前提としますので，プログラミング能力を高めるための楽しい演習だと思ってください．<br />
<span id="more-9321"></span></p>
<p>今回は何もなかった仮想空間に物体を表示させてみましょう．ODEではいろいろな形状がサポートされています．ここではその中でも使い方が最も簡単な球を表示させます．</p>
<pre class="brush:cpp;">/* step1 球の表示　*/
#include "dm1.h"

double R&#91;12&#93;;                  // 回転行列(姿勢)の値を入れる配列
double p&#91;3&#93; = {0.0, 0.0, 1.0}; // 位置(x,y,z)&#91;m&#93;
double r = 0.2;                // 半径 &#91;m&#93;

void simLoop(int pause)        /***  シミュレーションループ　***/
{
  dsDrawSphere(p,R,r);         // 球の描画
}

int main()         /*** main関数 ***/
{
  dmLoop(800, 600, simLoop); // シミュレーションループ（ウインドウの横，縦）
  return 0;
}</pre>
<p>まず，２行目のdm1.hはＯＤＥをより簡単に使うためのヘッダーファイルです．Step1ではまだ説明しません．</p>
<p>一般的に物体を３次元空間上に表示させるためには，物体の位置と姿勢を決める必要があります．ODEでは姿勢を回転行列とよばれる行列で表しています．その行列の要素を格納するのが配列R[12]です．回転行列は３×３の行列なので，１次元配列では要素数が９個で十分ですが，ODEでは高速化のために要素数12個の配列を用意します．配列の4, 8, 12番目の様子は０になっています．なお，R[12]には謎のヘッダファイルdm1.hの中で単位行列が設定されています．</p>
<p>また，位置は要素数３個のdouble型の配列p[3]に格納しています．位置のx座標(手前方向）を表す変数pの1番目の要素p[0]には0.0[m]，y座標（右方向）, z座標（高さ方向）を表すp[1], p[2]には0.0[m],　1.0[m]が設定されています．座標系は右手系です。上の図では中心から赤いピラミッドの方向がｘ軸の正，青いピラミッドの方向がｙ軸の正，上空方向がz軸の正です．ODEでは単位系はSI単位系で，長さはm，質量はkg，力はNとなります．</p>
<p>ソースコードのなかほどにあるsimLoop関数にシミュレーションでやりたいことを書きます．ここでは，球を表示したいのでdsDrawSphere関数を使って，位置p，姿勢R, 半径rの球を描画しています．なお、このソースコードだけではわかりませんが、simLoop関数はdmLoop関数の中で毎回呼び出されています。</p>
<p>今回はこれで終わりです．簡単でしたね．なお，この説明でわからない場合は，わからない部分をコメントに書いて頂けると補足説明します．</p>
<ul>
<li><strong>ホームワーク１</strong>
<ol>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2011/12/step1-1112021.zip">step1-111202.zip</a>をダウンロードし，実行してください．</li>
<li>手順
<ul>
<li>ode-0.11.1がインストールされていなかったら<a href="http://demura.net/9ode/3850.html">この説明に従いインストールする</a>．</li>
<li>ダウンロードしたファイルをc:\ode-0.11.1\myprogの中に保存する．</li>
<li>そこで解凍する．c:\ode-0.11.1\myprog\step1というフォルダが作られます．</li>
<li>c:\ode-0.11.1\myprog\step1\step1.cbpをダブルクリックしてcodeblocksを起動しビルド・実行する．<strong>ダブルクリックするファイルの拡張子はcbpです．間違ってcppをダブルクリックしないように！</strong></li>
</ul>
</li>
<li>球の位置と大きさを変更してみましょう．
<ul>
<li>プロトタイプ宣言
<ul>
<li>void dsDrawSphere(const double　p[3], const double R[12],  double r)</li>
</ul>
</li>
<li>引数p[3]は位置，R[12]は姿勢，rは半径.</li>
</ul>
</li>
<li>直方体を表示させてください．次の関数を使います．
<ul>
<li>プロトタイプ宣言
<ul>
<li>void dsDrawBox(const double　p[3], const double R[12], const double sides[3])</li>
</ul>
</li>
<li>上は関数のプロトタイプ宣言の形式なので，呼び出すときはconst doubleなどの型名を入れてはいけません．引数が配列の場合は，サンプルプログラムのように配列名だけを入れてください．<br />
例　dsDrawBox(p, R, sides);  // 呼び出す場合は配列名だけ</li>
<li>1, 2番目の引数はdsDrawSphereのときと同じです．3番目の引数は直方体のx,y,z方向のサイズ[m]が入っている要素数3個の配列です．位置を表す配列pと同じように初期化すれば大丈夫です．</li>
<li>なお, doubleの前にあるconstは値を変えてはいけないという意味です。円柱を表示させてください</li>
</ul>
</li>
<li>円柱を表示させましょう．
<ul>
<li>プロトタイプ宣言
<ul>
<li>void dsDrawCylinder(const double　p[3], const double R[12],  double l, double r );</li>
</ul>
</li>
<li>ここで，lは長さ，rは半径です．</li>
</ul>
</li>
<li>カプセルを表示させてください．
<ul>
<li>プロトタイプ宣言
<ul>
<li>void dsDrawCapsule(const double  p[3], const double R[12], double l,  float r );</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<p>以上
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F9321.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=9321&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/9321.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/9321.html" />
	</item>
		<item>
		<title>シミュレータで学ぶC言語[繰り返し]</title>
		<link>http://demura.net/9ode/8766.html</link>
		<comments>http://demura.net/9ode/8766.html#comments</comments>
		<pubDate>Thu, 19 May 2011 07:43:26 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8766</guid>
		<description><![CDATA[C言語の繰り返しにはfor文, while文，do while文がありましたね．ここではfor文を使い，図のようなピラミッドを作ってみましょう． まず、球と直方体の表示方法を学びます。 球の表示方法 #include " [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_4103" class="wp-caption alignnone" style="width: 544px"><a href="http://demura.net/wordpress/wp-content/uploads/2009/06/pyramid1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2009/06/pyramid1.jpg" alt="ピラミッド：ホームワークの答え" title="pyramid1" width="534" height="364" /></a><p class="wp-caption-text">ピラミッド：ホームワーク６の答え</p></div>
<p>C言語の繰り返しにはfor文, while文，do while文がありましたね．ここではfor文を使い，図のようなピラミッドを作ってみましょう．<br />
まず、球と直方体の表示方法を学びます。</p>
<p>球の表示方法</p>
<pre class="brush:cpp">#include "dm.h"
#include "stdio.h"

double x = 0.0, y = 0.0, z = 1.0; // 重心位置　&#91;m&#93;
double r = 0.2;                   // 半径 &#91;m&#93;

void command(int cmd)
{
    switch (cmd) {
        case 'z':   z += 0.1;  break; //　zキーを押すと zの値が0.1ずつ増加する
        default:     printf("Input z key \n");
    }
}

void simLoop(int pause)        /***  シミュレーションループ　***/
{
    dmDrawSphere(x,y-1,z,r); // 球の描画
}

int main()         /*** main関数 ***/
{
    dmInit();   // ODEの初期化
    dmLoop(800, 600, simLoop, command);  // シミュレーションループ ウインドウの幅，高
    dmClose();  // ODEの終了
    return 0;
}</pre>
<p>&nbsp;</p>
<p>main()関数のdmInit()はシミュレータの初期化です。dmLoop()がシミュレーションで繰り返し実行される関数です。この関数は引数を４つとり、１、２番目はウインドウの横、縦のサイズ[ピクセル]、３番目はdmLoopの中で使用するsimLoop関数、４番目はキーボード処理に使用するcommand関数です。関数も関数の引数になることができます。ちなみに、関数名はその関数のメモリ上でのアドレスとなります。dmClose()でシミュレータの終了処理をします。</p>
<p>simLoop関数はこのソースコードではわかりませんが、whileループの中に入っており、シミュレーションループ毎呼び出されます。 dmDrawSphere(x,y-1,z,r)が球を描画する関数です。引数は、４つあり、始めの３つは重心の位置x, y, z座標成分、最後は球の半径となっています。</p>
<p>command関数はキーの入力処理をしています。zキーが押される度に、zの値が0.1ずつ増加します。これは球のｚ座標なので押す度に球が上昇します。プログラムを事項して確認してください。</p>
<ul>
<li><strong>演習1</strong>
<ul>
<li>このプログラム <a href="http://demura.net/wordpress/wp-content/uploads/2011/05/week6-1.zip">week6-1.zip</a>をc:\ode-0.11.1\myprogにダウンロード、解凍、ビルドして実行してください。</li>
<li>直方体を(0, -1, 1)の位置に表示させるプログラムを書きなさい。なお、直方体を表示させる関数は次です。
<ul>
<li>dmDrawBox(double x,  double y, double z,  double sx, double sy, double sz);</li>
<li>ここで、x, y ,zは重心の位置、sx, sy, szは直方体の各軸成分の長さ。</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><span id="more-8766"></span></p>
<pre class="brush:cpp">// 直方体を一列に並べるプログラム
#include "dm.h"
#include "stdio.h"

double x = 0.0, y = 0.0, z = 0.05;   // 位置(x,y,z)&#91;m&#93;
double sx = 0.1, sy = 0.1, sz = 0.1; // 直方体のサイズ(x, y, z)&#91;m&#93;

void simLoop(int pause)        /***  シミュレーションループ　***/
{
    int i, num = 11;             // 直方体の数
    dsSetColor(1.0, 0.0, 0.0);   // 赤色の設定(赤，緑，青）
    for (i = 0; i &#60; num; i++)
    {
        y = i * 0.2;          // 直方体重心のy軸成分
        dmDrawBox(x,y,z,sx,sy,sz); // 直方体の表示        　
    }
}</pre>
<p>11行目のdsSetColor()は色を設定する関数です．引数は光の3原色の値を3個取り，１番目は赤，２番目は緑，３番目は青成分で0以上1以下の値となります．ちなみに，全部0だと黒，全部1.0だと白です．<br />
12から16行目がfor文です．繰り返し回数はnum回，ここでは10行目でnumが11になっているので，11回ループが回ることになります．14行目でループ毎に直方体のy軸成分の位置を変化させています。ここで、x座標は地面の中央マーカーから赤マーカーの方向，y座標は中央マーカーから青マーカーの方向，z座標は中央マーカーから上空方向になります．<br />
15行目は直方体の描画です．</p>
<p>これで今回は終わりです．タスクは少しハードです。難しいものもあるので必ずしも全部やる必要はありません.</p>
<p><strong>演習２： </strong><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/week6-2.zip">week6-2.zip</a>をダウンロードして実行しよう．</p>
<p><strong>タスク6</strong>：</p>
<ol>
<li>赤い直方体（この例では立方体）の色を青に変えよう．
<ul>
<li>dsSetColor(float r, float g, float b)<br />
r, g, bは光の３原色の赤、緑、青成分。値は0以上１以下のfloat型。例えば、緑にしたかったらrとbは0.0、gには１.0を代入する。</li>
</ul>
</li>
<li>赤い直方体の位置を左にずらし，中央の直方体が原点に来るようにしましょう．</li>
<li>上の問題で，一番左にある直方体の色を白にし、それから右（y軸正方向）へ向かうにつれ徐々に赤に変化させよう．</li>
<li>forループを２重にし，ｘ軸方向にも直方体を描画し，合計121個の直方体を表示しよう．</li>
<li>forループを３重にし、z軸方向（上空方向）にも直方体を10段（合計11段）描画し、大きな立方体を表示しよう。</li>
<li>forループを３重にし，z軸方向にも直方体を描画し，直方体の間隔も調整して上図のようなピラミッドを作ろう．</li>
<li>白い直方体（サイズは上の直方体と同じ）を半径2mの円周上に６度ずつ60個並べよ。</li>
<li>上を時計と考えて、シミュレーションのループが進むたびに、白い直方体が一つだけ時計周りに順番に変化するプログラムを作りなさい。</li>
<li>らせん階段状に直方体（サイズは任意）を100個並べなさい</li>
<li>100段の<a href="http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%83%97%E3%82%BF%E3%83%AF%E3%83%BC">トランプタワー</a>を作りなさい。直方体のサイズは実際のトランプと同じにすること。
<ul>
<li>ヒント：<a href="http://demura.net/wordpress/wp-content/uploads/2011/05/week6-3.zip">week6-3.zip</a>のソースコードを読み実行する。</li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<p style="text-align: right;">でむ</p>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8766.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8766&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8766.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8766.html" />
	</item>
		<item>
		<title>Codeblocksを使ったCプログラムの作り方</title>
		<link>http://demura.net/9ode/8746.html</link>
		<comments>http://demura.net/9ode/8746.html#comments</comments>
		<pubDate>Thu, 12 May 2011 12:05:07 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8746</guid>
		<description><![CDATA[CodeblocksでＣ言語のプログラム作成法を説明します．画像をクリックすると拡大表示されます． １．Codeblocksのメニューバーの「ファイル」→「新規」→「プロジェクト&#8230;」を選択してクリック ２．「 [...]]]></description>
			<content:encoded><![CDATA[<p>CodeblocksでＣ言語のプログラム作成法を説明します．画像をクリックすると拡大表示されます．</p>
<p><span id="more-8746"></span></p>
<p>１．Codeblocksのメニューバーの「ファイル」→「新規」→「プロジェクト&#8230;」を選択してクリック</p>
<div id="attachment_8747" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb1.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb1-300x273.jpg" title="cb1" width="300" height="273" class="size-medium wp-image-8747" /></a><p class="wp-caption-text">新規作成</p></div>
<p>２．「Console Application」を選択して，「Go」をクリック</p>
<div id="attachment_8748" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb2-300x220.jpg" title="cb2" width="300" height="220" class="size-medium wp-image-8748" /></a><p class="wp-caption-text">コンソールアプリケーション</p></div>
<p>３．「Ｃ」を選択して「次へ(N)&gt;」をクリック</p>
<div id="attachment_8749" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb3.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb3-300x242.jpg" title="cb3" width="300" height="242" class="size-medium wp-image-8749" /></a><p class="wp-caption-text">Ｃ言語選択</p></div>
<p>４．プロジェクトを作成するフォルダを選択し，プロジェクトタイトルを決める．ここでは，プロジェクトはC:\ode-0.11.1\myprogの下に作成することとする．従って、プロジェクトを作成するフォルダはC:\ode-0.11.1\myprogとする。プロジェクトタイトルを入力するとプロジェクトファイル名や出力ファイル名は自動で決まる。プロジェクトタイトルは半角英数文字にすること。</p>
<div id="attachment_8750" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb4.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb4-300x242.jpg" title="cb4" width="300" height="242" class="size-medium wp-image-8750" /></a><p class="wp-caption-text">プロジェクトの指定</p></div>
<p>５．コンパイラを選択．ここではGNU GCC Compilerを選択．</p>
<div id="attachment_8752" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb51.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb51-300x242.jpg" title="cb5" width="300" height="242" class="size-medium wp-image-8752" /></a><p class="wp-caption-text">コンパイラの指定</p></div>
<p>７．プロジェクト名の下のSourcesをダブルクリックすると，テンプレートファイルが開く．Hello World!と表示する簡単なもの．</p>
<div id="attachment_8753" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb6.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb6-300x223.jpg" title="cb6" width="300" height="223" class="size-medium wp-image-8753" /></a><p class="wp-caption-text">テンプレートファイルの表示</p></div>
<p>8.　ビルド＆実行するとウインドウが開き，Hello  world!と表示される．</p>
<div id="attachment_8754" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/cb7.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/05/cb7-300x96.jpg" title="cb7" width="300" height="96" class="size-medium wp-image-8754" /></a><p class="wp-caption-text">実行結果</p></div>
<p>終わり．
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8746.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8746&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8746.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8746.html" />
	</item>
		<item>
		<title>シミュレータで学ぶＣ言語 [分岐]</title>
		<link>http://demura.net/9ode/8706.html</link>
		<comments>http://demura.net/9ode/8706.html#comments</comments>
		<pubDate>Thu, 05 May 2011 21:47:38 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8706</guid>
		<description><![CDATA[今回はプログラムの分岐処理をするためのif文とswitch文を学ぶ．ここではif文とswitch文そのものの説明は省略し，サンプルプログラムを紹介する． サンプルプログラムweek4-1はif文の例．キーボードからモータ [...]]]></description>
			<content:encoded><![CDATA[<p>今回はプログラムの分岐処理をするためのif文とswitch文を学ぶ．ここではif文とswitch文そのものの説明は省略し，サンプルプログラムを紹介する．</p>
<p>サンプルプログラムweek4-1はif文の例．キーボードからモータのパワーを入力し，ロボットを走行させるプログラム．<br />
このシミュレータではユーザのプログラムはuser_main関数の中に記述する．この関数はループの中にあり，繰り返し呼ばれており，ループが回る度に２５行目で１ずつ増加している．</p>
<p>9行目はループの度に聞かれるとロボットが前進しないので，500回毎にパワーを聞き，その間ロボットを走行させるための処理．12行目で標準入力（キーボード）からパワーを入力し，int型の変数powerに代入する．ここで，powerの前のアドレス演算子&amp;をつけることを忘れないように．理由はポインタを学ぶときに説明する．</p>
<p>ロボットのパワーは-100から100までなので，15行目のif文でその範囲のパワーだけでロボットを動かし，それ以外は間違いの表示をプログラムをexit(1)で終了する．</p>
<p><strong>Week4-1</strong></p>
<pre class="brush:cpp;">// week4-1
int count = 0; // 繰り返し回数
// user_main()関数はループの中にあり，繰り返し呼ばれている
void user_main()
{
    int power; // モータのパワー

    // ループの度に聞かれるのがうざいから500回毎にパワーを聞く
    if (!(count % 500))
    {
        printf("Input power:");
        scanf("%d", &amp;power);

        // パワーは-100以上100以下の決まり
        if ((-100 &#60;= power) &amp;&amp; (power &#60;= 100))
        {
            motor(power, power); // モータへの命令
        }
        else
        {
            printf("パワーは-100以上100以下を入力せよ\n"); // 時計周り
            exit(1);  // プログラム終了
        }
    }
    count++;
    printf("count=%d \r",count); // \rは復帰（カ―ソルが先頭行へ戻る);
}</pre>
<ul>
<li><strong>タスク4-1</strong>
<ul>
<li><a href="http://demura.net/wordpress/wp-content/uploads/2011/05/week4-1.zip">week4-1.zipをここからダウンロードし</a>，c:\ode-0.11.1\myprogの中に解凍し，ビルド・実行せよ．</li>
<li>このサンプルプログラムでは左右のモータに同じパワーを入力したが，左右別々のパワーを入力できるように変更せよ．</li>
</ul>
</li>
</ul>
<p><strong>Week4-2</strong></p>
<p>次のサンプルプログラムweek4-2はロボットシミュレータのロボットは動かさず，文字だけを表示する簡単なもの．標準入力から信号機の色に対応する数字，０：赤，１：黄，２：青を入力し，それに応じた文字を表示する．８行目はループの1回目だけの処理．ただし，変数countは常に０なので，ifの中の処理がずっと繰り返される．</p>
<p>この例では分岐処理として，if else文を使っている．複数分岐がある場合は１６，１８行目のようにelse if を左に揃えるのが流儀．</p>
<pre class="brush:cpp;">//  week4-2
// user_main()関数はループの中にあり，繰り返し呼ばれている
void user_main()
{
    int power; // モータのパワー

    // ループの1回目だけの処理．ただし，変数countは常に０なので，ifの中の処理がずっと繰り返される．
    if (count == 0)
    {
        int	signal;
        printf("Input Signal Color\n Red 0, Yellow 1, Blue 2:");
        scanf("%d",&amp;signal);

        if (signal ==0)
            printf("止まる\n");
        else if (signal == 1)
            printf("注意して渡る\n");
        else if (signal == 2)
            printf("渡る\n");
        else
            printf("そんな色ありません\n");
    }
}</pre>
<ul>
<li><strong>タスク4-2</strong>
<ul>
<li> <a href="http://demura.net/wordpress/wp-content/uploads/2011/05/week4-2.zip">week4-2.ziｐをここからダウンロードし</a>，c:\ode-0.11.1\myprogの中に解凍し，ビルド・実行せよ．</li>
<li>サンプルプログラムweek4-2をswitch文で書き換えよ．</li>
</ul>
</li>
</ul>
<p>以上
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8706.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8706&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8706.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8706.html" />
	</item>
		<item>
		<title>シミュレータで学ぶＣ言語　[ミッション２：敵陣へドリブルせよ]</title>
		<link>http://demura.net/9ode/8663.html</link>
		<comments>http://demura.net/9ode/8663.html#comments</comments>
		<pubDate>Thu, 21 Apr 2011 17:23:36 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[ODE]]></category>

		<guid isPermaLink="false">http://demura.net/?p=8663</guid>
		<description><![CDATA[ミッション２の指令は「敵陣へドリブルせよ」である． まずは，ミッション１の答えの一例．このプログラムはとても単純で，赤外線センサの値がある数値（閾値）より大きくなったら，赤外線ボールがあると判断し前進する．それ以外の場合 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_8670" class="wp-caption aligncenter" style="width: 310px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/04/fig2.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/04/fig2-300x210.jpg" title="fig2" width="300" height="210" class="size-medium wp-image-8670" /></a><p class="wp-caption-text">ボールを黄色ゴールへ入れよう</p></div>
<p>ミッション２の指令は「敵陣へドリブルせよ」である．</p>
<p>まずは，ミッション１の答えの一例．このプログラムはとても単純で，赤外線センサの値がある数値（閾値）より大きくなったら，赤外線ボールがあると判断し前進する．それ以外の場合は回転してボールを捜すというものである．<br />
<span id="more-8663"></span></p>
<pre class="brush:cpp;">// ボールを追う簡単なプログラム
#include "dm.h"
#include "stdio.h"
void user_main()
 {
// CN1: ボールセンサ（赤外線）の値. 大きい値ほどボールが近い
// ボールセンサは視野角が10度とほぼ正面しか見えない
　　printf("ball sensor=%d \n", CN1);
 　　if(CN1 &#62; 1)
 　　{
　　        motor(50,50); // 前進
　    }
     else
　　 {
  　　       motor(-10, 10); // 時計周り
  }
 }</pre>
<ul>
<li>ダウンロード：<a href="http://demura.net/wordpress/wp-content/uploads/2011/04/robocup2-12.zip">robocup2-1-110422.zip</a></li>
<li>インストール：robocup2-1.zipを展開し，c:\ode-0.11.1\myprogの中に移動する</li>
<li>タスクレベル１：このプログラムではロボットがうまく動かない．閾値（しきいち）を直し，ロボットの動作を改善せよ．</li>
</ul>
<p>次のタスクは，「北北西に針路を取れ」である．ある目標針路へ向かってロボットが進むプログラムを作りなさい．</p>
<pre class="brush:cpp;">// 目標針路へ向かうプログラム
#include "dm.h"
#include "stdio.h"

int target = 270; // 目標針路

void user_main()
{
    // CN2: 地磁気センサの値　０～３６０度

    printf("Dir=%d \n", CN2);
    if((-5 &#60;= (target - CN2)) &amp;&amp; ((target - CN2) &#60; 5))
    {
        motor(50,50); // 前進
    }
    else {
        motor(-10, 10); // 時計周り
    }
}</pre>
<ul>
<li>ダウンロード：<a href="http://demura.net/wordpress/wp-content/uploads/2011/04/robocup2-level2.zip">robocup2-level2.zip</a></li>
<li>インストール：robocup2-2.zipを展開し，c:\ode-0.11.1\myprogの中に移動する</li>
<li>タスクレベル2：このプログラムを改良して，ボールを黄色ゴールへドリブルで入れよ．</li>
<li>タスクレベル3：<a href="http://demura.net/wordpress/wp-content/uploads/2011/04/robocup2-level3-110506.zip">robocup2-level3-110506.zip</a>のボール配置を使い，ボールをゴールへドリブルで入れよ．回り込みが必要となる．サンプルプログラムに問題があったので2011年5月6日に修正．</li>
</ul>
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2F9ode%2F8663.html&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:450px; height:25px"></iframe></div>
<img src="http://demura.net/wordpress/?ak_action=api_record_view&id=8663&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/9ode/8663.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/9ode/8663.html" />
	</item>
	</channel>
</rss>

