<?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; demu</title>
	<atom:link href="http://demura.net/author/demu/feed" rel="self" type="application/rss+xml" />
	<link>http://demura.net</link>
	<description>ロボット達のサッカーW杯RoboCup，つくばチャレンジ，物理計算エンジンＯＤＥと本サイトで開発している３次元描画ライブラリirrDrawStuffなどのロボット開発プラットフォームを開発者の視点で情報発信． なお，ODE本では左下動画のようなロボットシミュレータ作成法を学びます．まずは動画をクリックして体験しよう！</description>
	<lastBuildDate>Tue, 07 Feb 2012 08:26:50 +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/author/demu/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>ロボカップジュニアジャパンオープン2011</title>
		<link>http://demura.net/%e6%9c%aa%e5%88%86%e9%a1%9e/9317.html</link>
		<comments>http://demura.net/%e6%9c%aa%e5%88%86%e9%a1%9e/9317.html#comments</comments>
		<pubDate>Thu, 24 Nov 2011 13:34:14 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9317</guid>
		<description><![CDATA[新大阪で開かれたロボカップジュニアジャパン実行委員会に参加。来年のジャパンオープンはメジャー（成人）とジュニアが別開催。ジュニアは３月３０日、３１日に尼崎で開催。予定は今のところ次のとおり。 JR尼崎はJR大阪駅から６分 [...]]]></description>
			<content:encoded><![CDATA[<p>新大阪で開かれたロボカップジュニアジャパン実行委員会に参加。<wbr>来年のジャパンオープンはメジャー（成人）とジュニアが別開催。<wbr>ジュニアは３月３０日、３１日に尼崎で開催。予定は今のところ次のとおり。</wbr></wbr></p>
<p>JR尼崎はJR大阪駅から６分なので、金沢からはとても行きやすいところです。宿泊施設も近くにあり心配はないとのこと。尼崎市はとても力をいれているそうなので、きっと素晴らしい大会になると思います。</p>
<p><div id="attachment_1140" class="wp-caption alignright" style="width: 810px"><a href="http://robocupjr-ishikawa.jpn.org/wordpress/wp-content/uploads/2011/11/schedule1.jpg"><img class="size-full wp-image-1140" title="schedule" src="http://robocupjr-ishikawa.jpn.org/wordpress/wp-content/uploads/2011/11/schedule1.jpg" alt="" width="800" height="437" /></a><p class="wp-caption-text">ロボカップジュニアジャパンオープン２０１１予定</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%2F%25e6%259c%25aa%25e5%2588%2586%25e9%25a1%259e%2F9317.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=9317&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/%e6%9c%aa%e5%88%86%e9%a1%9e/9317.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/%e6%9c%aa%e5%88%86%e9%a1%9e/9317.html" />
	</item>
		<item>
		<title>つくばチャレンジ2011: トライアル動画　demura.netチーム</title>
		<link>http://demura.net/tukuba-challenge/9315.html</link>
		<comments>http://demura.net/tukuba-challenge/9315.html#comments</comments>
		<pubDate>Fri, 18 Nov 2011 09:27:00 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[つくばチャレンジ]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9315</guid>
		<description><![CDATA[つくばチャレンジ2011に出場した金沢工業大学出村研究室のトライアル走行ビデオ。つくばチャレンジ最後の年に、満を持して登場したが結果は．．．　けんせいちゃん４号機は着実に進化し、昨年は音声発話とロボットアームが搭載され、 [...]]]></description>
			<content:encoded><![CDATA[<p><iframe width="425" height="349" src="http://www.youtube.com/embed/D1QUk-0OIog?hl=ja&#038;fs=1" frameborder="0" allowfullscreen></iframe></p>
<p>つくばチャレンジ2011に出場した金沢工業大学出村研究室のトライアル走行ビデオ。つくばチャレンジ最後の年に、満を持して登場したが結果は．．．　けんせいちゃん４号機は着実に進化し、昨年は音声発話とロボットアームが搭載され、今年は音声認識の機能が追加された。地道に技術力をアップし、いつの日かリベンジを狙おう。
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2Ftukuba-challenge%2F9315.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=9315&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/tukuba-challenge/9315.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/tukuba-challenge/9315.html" />
	</item>
		<item>
		<title>つくばチャレンジ2011トライアル： demura.netチーム102m走行</title>
		<link>http://demura.net/tukuba-challenge/9299.html</link>
		<comments>http://demura.net/tukuba-challenge/9299.html#comments</comments>
		<pubDate>Wed, 16 Nov 2011 00:10:16 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[つくばチャレンジ]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9299</guid>
		<description><![CDATA[つくばチャレンジ２０１１本番。１１月１５日はトライアル。demura.netチームは１回目7m、２回目102mという結果に終わった。過去２年トライアルは通過していただけにとても残念。 ある会社に特注したロボットに不具合が [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_9300" class="wp-caption alignnone" style="width: 810px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/11/tukuba2011.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/11/tukuba2011-1024x768.jpg" alt="" title="tukuba2011" width="800" height="600" class="size-large wp-image-9300" /></a><p class="wp-caption-text">つくばチャレンジ2011：demura.netチーム</p></div>
<p>つくばチャレンジ２０１１本番。１１月１５日はトライアル。demura.netチームは１回目7m、２回目102mという結果に終わった。過去２年トライアルは通過していただけにとても残念。</p>
<p>ある会社に特注したロボットに不具合が多発し、最終的な納品が５カ月遅れ８月３１日になった。そこから２か月半で全てのソフトウェアシステムを作りあげ。つくば市に到着した３日前はロボットが前に進まない状態。それから、何とか102ｍまで進むことができたことは学生達の努力の賜物。ごくろうさま。</p>
<p>demura.netチームのつくばチャレンジは終わったが、このロボットは高齢者や障害者支援用の自律車いすなので、そのような方のお役に立てる研究をしていきたい。
<div class="fblike_button" style="margin: 10px 0;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdemura.net%2Ftukuba-challenge%2F9299.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=9299&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/tukuba-challenge/9299.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/tukuba-challenge/9299.html" />
	</item>
		<item>
		<title>クラスノヤルスクのベスト</title>
		<link>http://demura.net/tukuba-challenge/9292.html</link>
		<comments>http://demura.net/tukuba-challenge/9292.html#comments</comments>
		<pubDate>Mon, 14 Nov 2011 12:38:37 +0000</pubDate>
		<dc:creator>demu</dc:creator>
				<category><![CDATA[つくばチャレンジ]]></category>

		<guid isPermaLink="false">http://demura.net/?p=9292</guid>
		<description><![CDATA[ロシアのクラスノヤルスクで頂いたベストをきてベストを尽くそう。明日のつくばチャレンジでは誰かに着てもらおう。]]></description>
			<content:encoded><![CDATA[<div id="attachment_9293" class="wp-caption alignnone" style="width: 778px"><a href="http://demura.net/wordpress/wp-content/uploads/2011/11/cloth.jpg"><img src="http://demura.net/wordpress/wp-content/uploads/2011/11/cloth-768x1024.jpg" alt="" title="cloth" width="768" height="1024" class="size-large wp-image-9293" /></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%2Ftukuba-challenge%2F9292.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=9292&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://demura.net/tukuba-challenge/9292.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://demura.net/tukuba-challenge/9292.html" />
	</item>
	</channel>
</rss>

