<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>demura.net:RoboCup・ODE・夢考房</title>
    <link rel="alternate" type="text/html" href="http://demura.net/" />
    <link rel="self" type="application/atom+xml" href="http://demura.net/atom.xml" />
    <id>tag:demura.net,2008-01-02://1</id>
    <updated>2008-01-02T10:20:12Z</updated>
    <subtitle>オープンソースの物理計算エンジンODEの使い方，人工知能を搭載したロボット達によるサッカーW杯ロボカップ，学生を元気にさせる教育システム夢考房について紹介します．</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>サーバーの引越しとMovabletype4へのバージョンアップ</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2008/01/movabletype4.html" />
    <id>tag:demura.net,2008://1.467</id>

    <published>2008-01-02T10:05:46Z</published>
    <updated>2008-01-02T10:20:12Z</updated>

    <summary>demura.netに使っていたサーバーの容量が足りなくなってきたので，「ロリポ...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[demura.netに使っていたサーバーの容量が足りなくなってきたので，「ロリポップ」から「さくらインターネット」へサーバーを引越しました．それと同時にMovabletype3.3から4へバージョンアップしました．<br /><br />Movabletype3.3で使っていたウェブ表示用テンプレートがそのまま使えないので，以前のように表示するにはテンプレートを移植しなければいけません．今週中には元のように表示させたいと考えていますので少々お待ちください． ]]>
        
    </content>
</entry>

<entry>
    <title>Movable Type 4.01 へようこそ！</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2008/01/movable-type-401.html" />
    <id>tag:demura.net,2008://1.1</id>

    <published>2008-01-02T09:48:45Z</published>
    <updated>2008-01-02T09:48:45Z</updated>

    <summary>このブログ記事は、Movable Type 4のインストール完了時に、システムに...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        このブログ記事は、Movable Type 4のインストール完了時に、システムによって自動的に作成されたブログ記事です。 新しくなったMT4の管理画面で、早速ブログを更新してみましょう。
        
    </content>
</entry>

<entry>
    <title>MinGW+MSYSで日本語を表示しよう！</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/mingwmsys.html" />
    <id>tag:demura.net,2007://1.466</id>

    <published>2007-12-30T15:05:43Z</published>
    <updated>2008-01-02T10:03:00Z</updated>

    <summary> 2007年最後の記事になります．ご愛読ありがとうございました． 今年はODE本...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="92ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="9ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
2007年最後の記事になります．ご愛読ありがとうございました．
</p>
<p>
今年はODE本の出版などdemura.netに関しては飛躍の年となりました．おかげさまで，皆様のご協力のもとにODE本は理工学専門書としてはボチボチの売り上げとなり，ご本家様のODEプロジェクトにわずかではありますが寄付をすることができました．これに関してODEの開発者ラッセル・スミス博士からお礼の言葉がありましたのでここにご報告します．<br />
</p>
<p>
さて，demura.netではODEの開発環境としてMinGW＋MSYS環境を推奨しています．フリーですからね．
</p>
<p>
でも，さすがのフリーソフトも完璧ではありません．標準設定ではいくつかの問題があります．まず，日本語を表示することができません． 講義で使用する場合はローマ字や英語を表示するように指示すれば何とかなります．
</p>
<p>
ところがさらにまずいことに，C言語を使う場合は問題があります． 標準入力scanfで入力する前に，普通は入力を促すためにprintfを使い画面に文字列を表示しますよね．でも，標準のMinGW+MSYS環境ではscanfが終わるまでブロックされ画面にprintfで表示するはずの文字列が表示されません．これはMSYSで使っているターミナルソフトrxvtの一部に実装の問題があるためです．
</p>
<p>
この問題を解決する方法を説明します．&nbsp;
</p>
<p>
c:\msys\1.0\msys.bat
</p>
<p>
上のファイルの41行目で標準ではターミナルソフトrxvtを起動するので，下図のようにこの行をコメントアウトしてWindows標準のコマンドプロンプトに切り替えましょう．
</p>
<p>
<img alt=" " src="http://demura.net/archives/images/ode/msys/msysbat.jpg" />
</p>]]>
        <![CDATA[
<p>
&nbsp;
</p>
<p>
&nbsp;デスクトップのMSYSアイコンを起動し，日本語を表示するプログラムを起動すると以下のように日本語文字化けせずに表示します．<br />
&nbsp;
<img width="757" height="388" alt=" " src="http://demura.net/archives/images/ode/msys/msysbat2.jpg" />
</p>
<p>
&nbsp;なお，ウインドウの大きさやフォント，色などを変更したい場合はウインドウにカーソールを当てて右マウスクリックすると以下のように表示されますので，ご自由にどうそ．
</p>
<p>
<img width="827" height="454" alt=" " src="http://demura.net/archives/images/ode/msys/msysbat3.jpg" />
&nbsp;
</p>
<p>
では，よいお年を！<br />
</p>]]>
    </content>
</entry>

<entry>
    <title>無料テキストエディタのインストールと設定</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/post-142.html" />
    <id>tag:demura.net,2007://1.465</id>

    <published>2007-12-26T22:29:39Z</published>
    <updated>2008-01-02T10:03:00Z</updated>

    <summary> ODE本ではページ数の制限もあり開発環境についての説明が一切ないので、このウェ...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="91robotsimu" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="9ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
ODE本ではページ数の制限もあり開発環境についての説明が一切ないので、このウェブサイトで説明しています。<br />
</p>
<p>
全くの初心者にとっては開発環境のインストールと使い方を覚えることが第１の関門でしょう。ここでは、今まで触れてこなかったテキストエディタについて説明します。
</p>
<p>
自分でプログラムを書くときに、ワードのようなソフトが必要です。プログラムは文字だけで構成されているのでメモ帳やワードパッドでも編集は不可能でありませんが、効率的ではありません。テキストエディタはプログラムのソースコードを編集する専用のソフトで、便利な機能があるためプログラム作成が効率的になります。
</p>
<p>
私はemacsやviを使っており、慣れると非常に便利ですが、初心者には敷居が高いものです。そこで、私の講義では寺尾進さんが開発されたterapadというフリーのソフトウェアを使っています。メモ帳やワードパッド等とほぼ同じ操作なので簡単に利用でき、初心者にやさしいソフトです。
</p>
<p>
では、TeraPadをインストールしましょう。<br />
</p>]]>
        <![CDATA[
<ul>
<li><span style="font-family: ＭＳ Ｐゴシック">インストール</span></li>
<ul>
<li><span style="font-family: ＭＳ Ｐゴシック"><a href="http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html"><u><span style="color: #810081">TeraPadのウェブサイト</span></u></a>からtpad091.exeをダウンロードする。</span></li>
<li><span style="font-family: ＭＳ Ｐゴシック">tpad091.exeをダブルクリックするとインストーラが起動するので指示に従ってインストールする。</span></li>
<li><span style="font-family: ＭＳ Ｐゴシック">おしまい。</span></li>
</ul>
<li>起　動</li>
<ul>
<li>デスクトップにできたTeraPadアイコンをダブルクリックする。</li>
</ul>
<li>設　定</li>
<ul>
<li>タブの文字数を設定します。宗派によりいろいろありますが、私はGNU派の2です。ノートパソコンのウインドウが狭いのも理由の一つです。</li>
<ul>
<li>表示&rarr;タブ文字数&rarr;２</li>
</ul>
<li>MinGW環境では全角の空白文字がソースコードに入るとコンパイルが失敗します。全角空白文字は標準の設定では目に見えないので、下図を参照して以下の設定をしてください。</li>
<ul>
<li>表示&rarr;オプション&rarr;表示&rarr;全角空白にチェックを入れる</li>
</ul>
<li>他にもいろいろ設定できます。個人の趣味でどうぞ。<br />
</li>
</ul>
</ul>
<p>
<img height="505" alt=" " src="http://demura.net/archives/images/ode/figs/tera4.jpg" width="459" />
</p>
<ul>
<li>参考図書</li>
<ul>
<li>中村昇著：　<a href="http://www.amazon.co.jp/gp/product/4777510514?ie=UTF8&amp;tag=demuranet-22&amp;linkCode=as2&amp;camp=247&amp;creative=1211&amp;creativeASIN=4777510514">はじめてのTeraPad (I・O BOOKS)</a>, 工学社</li>
</ul>
</ul>
<p>
&nbsp;
</p>
<p>
&nbsp;
</p>]]>
    </content>
</entry>

<entry>
    <title>正誤表</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/post-141.html" />
    <id>tag:demura.net,2007://1.464</id>

    <published>2007-12-24T22:30:16Z</published>
    <updated>2008-01-02T10:02:59Z</updated>

    <summary> ODE本の正誤表です．本当にすみませんが，以下の修正をお願いします．また，誤り...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="91robotsimu" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="9ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
ODE本の正誤表です．本当にすみませんが，以下の修正をお願いします．また，誤りを見つけた方はコメントに書いて頂ければ反映していきたいと思います．
</p>
<p>
最近発見した誤りは、P112のdMassSetCylinderTotalの引数です。３番目の引数は円柱の長軸方向を指定します。ｙ軸を中心に円柱を９０度回転した姿勢を初期姿勢に取ったので、 初期姿勢はｘ軸方向、つまり１となります。<br />
</p>
<p>
また、大きな誤りは「ねぶらさん」からご指摘頂いたP130のホロノミックとノンホロノミックの説明が逆になっている箇所です．ごめんなさい．お詫びして訂正します．&nbsp;
</p>
<p>
&nbsp;なお，誤りではありませんが，本中のサンプルプログラムは完全なソースコードではなく，主要な部分しか掲載していませんので，そのままではコンパイルできません．本サポートサイトから完全なコードをダウンロードしてコンパイル・実行してください．
</p>
<table style="border: 1px solid #000099">
<tbody><tr><td style="border: 1px solid #000099">場所&nbsp;</td><td style="border: 1px solid #000099">誤&nbsp;</td><td style="border: 1px solid #000099">&nbsp;正</td><td style="border: 1px solid #000099">&nbsp;発見者</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P25&nbsp; プログラム75行目<br />
</td><td style="border: 1px solid #000099">&nbsp;dSpaceDestory</td><td style="border: 1px solid #000099">&nbsp;dSpaceDestroy</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P25 下から６行目<br />
</td><td style="border: 1px solid #000099">&nbsp;ントball.bodyを球leg.bodyとカプセル</td><td style="border: 1px solid #000099">&nbsp;ントjointを球ball.bodyとカプセル</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P26　８行目</td><td style="border: 1px solid #000099">&nbsp;指定されたタイプの新しい</td><td style="border: 1px solid #000099">&nbsp;新しいヒンジ</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P35 プログラム3行目<br />
</td><td style="border: 1px solid #000099">&nbsp;25.0</td><td style="border: 1px solid #000099">&nbsp;25.0;</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P38 プログラム74行目<br />
</td><td style="border: 1px solid #000099">&nbsp;-0.5));</td><td style="border: 1px solid #000099">&nbsp;-0.5);</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P61 1行目<br />
</td><td style="border: 1px solid #000099">&nbsp;4. EPRの設定と取得<br />
</td><td style="border: 1px solid #000099">&nbsp;4. ERPの設定と取得<br />
</td><td style="border: 1px solid #000099">&nbsp;ひびきの</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P66 10行目<br />
</td><td style="border: 1px solid #000099">&nbsp;dMasSetCylinder</td><td style="border: 1px solid #000099">&nbsp;dMassSetCylinder</td><td style="border: 1px solid #000099">&nbsp;チップ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P66 14行目<br />
</td><td style="border: 1px solid #000099">&nbsp;構造体massにに密度d,<br />
</td><td style="border: 1px solid #000099">&nbsp;構造体massに密度d,</td><td style="border: 1px solid #000099">
<p>
&nbsp;ジミー
</p>
</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P79 7行目<br />
</td><td style="border: 1px solid #000099">&nbsp;dGeomTriMeshDateCreate()</td><td style="border: 1px solid #000099">&nbsp;dGeomTriMeshDataCreate()</td><td style="border: 1px solid #000099">&nbsp;ひびきの</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P84 8行目<br />
</td><td style="border: 1px solid #000099">&nbsp;dJointTypeRR</td><td style="border: 1px solid #000099">&nbsp;dJointTypePR</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P１１２　プログラム２９行目</td><td style="border: 1px solid #000099">&nbsp;(&amp;mass, WH_M0, 2, WH_R0, WH_W);<br />
</td><td style="border: 1px solid #000099">&nbsp;(&amp;mass, WH_M0, 1, WH_R0, WH_W);<br />
</td><td style="border: 1px solid #000099">
<p>
&nbsp;チップ&amp;でむ2007-12-25<br />
</p>
</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P１１２　プログラム34行目</td><td style="border: 1px solid #000099">&nbsp;(&amp;mass, WH_M1, 2, WH_R1, WH_W);<br />
</td><td style="border: 1px solid #000099">&nbsp;(&amp;mass, WH_M1, 1, WH_R1, WH_W);<br />
</td><td style="border: 1px solid #000099">&nbsp;チップ&amp;でむ<br />
2007-12-25</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P127 下から１行目<br />
</td><td style="border: 1px solid #000099">&nbsp;ここではxしか</td><td style="border: 1px solid #000099">&nbsp;ここではyしか</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P128 上から1行目<br />
</td><td style="border: 1px solid #000099">&nbsp;ので，yと</td><td style="border: 1px solid #000099">&nbsp;ので，xと</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P130 下から4行目<br />
</td><td style="border: 1px solid #000099">&nbsp;動けない移動</td><td style="border: 1px solid #000099">&nbsp;動ける移動</td><td style="border: 1px solid #000099">&nbsp;ねぶら</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P130 下から２，３行目<br />
</td><td style="border: 1px solid #000099">&nbsp;動ける全方位移動機構</td><td style="border: 1px solid #000099">&nbsp;動けない移動機構</td><td style="border: 1px solid #000099">&nbsp;ねぶら</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P１６５　プログラム６０行目</td><td style="border: 1px solid #000099">&nbsp;rlink[j-1].body, rlink[j].body<br />
</td><td style="border: 1px solid #000099">&nbsp;rlink[j].body, rlink[j-1].body</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P167 下から８行目<br />
</td><td style="border: 1px solid #000099">&nbsp;リンク４</td><td style="border: 1px solid #000099">&nbsp;リンク４を削除</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P169 プログラム18行目<br />
</td><td style="border: 1px solid #000099">&nbsp;sensor_joint, link</td><td style="border: 1px solid #000099">&nbsp;sensor_joint, rlink</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ１７８　８行目</td><td style="border: 1px solid #000099">&nbsp;式(6.48)</td><td style="border: 1px solid #000099">&nbsp;式(6.92)</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ１８２　８行目</td><td style="border: 1px solid #000099">&nbsp;control関数</td><td style="border: 1px solid #000099">&nbsp;Pcontrol関数</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ１８５　下から３行目</td><td style="border: 1px solid #000099">&nbsp;dy/d&theta;1= L2C1S2-L3C1S23<br />
</td><td style="border: 1px solid #000099">&nbsp;dy/d&theta;1= L2C1S2+L3C1S23<br />
</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ１８６　式(7.7)の下</td><td style="border: 1px solid #000099">&nbsp;線形方程式　JPdot = &theta;dot<br />
</td><td style="border: 1px solid #000099">&nbsp;線形方程式　J&theta;dot = Pdot<br />
</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ２０９　下から８行目</td><td style="border: 1px solid #000099">&nbsp;つまり、z1-z0は脚先を</td><td style="border: 1px solid #000099">&nbsp;つまり、z0-z1は脚先を</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P219</td><td style="border: 1px solid #000099">
<p>
&nbsp;(9.7)式の1、２行目の左丸括弧が余分<br />
1行目 (-C<sub>1</sub>S<sub>345</sub>C<sub>6</sub>- ...<br />
2行目 (-S<sub>1</sub>S<sub>345</sub>C<sub>6</sub>+ ...<br />
</p>
</td><td style="border: 1px solid #000099">
<p>
&nbsp;(9.7)式の<br />
1行目 -C<sub>1</sub>S<sub>345</sub>C<sub>6</sub>- ...<br />
2行目 -S<sub>1</sub>S<sub>345</sub>C<sub>6</sub>+ ...<br />
</p>
</td><td style="border: 1px solid #000099">&nbsp;ひびきの</td></tr><tr><td style="border: 1px solid #000099">&nbsp;Ｐ２２１　式(9.18)</td><td style="border: 1px solid #000099">&nbsp; &phi;= atan2((P5x)^2, sqrt(P5z + (P5y)^2)))</td><td style="border: 1px solid #000099">&nbsp; &phi;= atan2(P5x, sqrt((P5z)^2 + (P5y)^2)))</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P227 プログラム32行目<br />
</td><td style="border: 1px solid #000099">&nbsp;k1 * (fz[i] + pos[2])<br />
</td><td style="border: 1px solid #000099">&nbsp;k1 * fz[i] + pos[2]<br />
</td><td style="border: 1px solid #000099">&nbsp;ねぶら</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P228 9.7節の2行目<br />
</td><td style="border: 1px solid #000099">&nbsp;ZMPを求めるには式(9.29)と(9.30)</td><td style="border: 1px solid #000099">&nbsp;ZMPを求めるには式(9.27)と(9.28)</td><td style="border: 1px solid #000099">&nbsp;ジミー</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P235 ２行目<br />
</td><td style="border: 1px solid #000099">&nbsp;<strong>b</strong>= (ax, ay, az)<sup>T</sup><br />
</td><td style="border: 1px solid #000099"><strong>&nbsp;b</strong>= (bx, by, bz)<sup>T</sup><br />
</td><td style="border: 1px solid #000099">&nbsp;でむ</td></tr><tr><td style="border: 1px solid #000099">&nbsp;P23６ 下から９行目<br />
</td><td style="border: 1px solid #000099">&nbsp;&nbsp;<strong>b</strong>= (ax, ay, az)<sup>T</sup><br />
</td><td style="border: 1px solid #000099">&nbsp;<strong>b</strong>= (bx, by, bz)<sup>T</sup><br />
</td><td style="border: 1px solid #000099">&nbsp;でむ<br />
2007-12-25<br />
</td></tr></tbody>
</table>
<br />
（最終更新日　2007-12-25)<br />]]>
        
    </content>
</entry>

<entry>
    <title>ODEへ寄付しました。</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/ode-20.html" />
    <id>tag:demura.net,2007://1.463</id>

    <published>2007-12-20T22:59:07Z</published>
    <updated>2008-01-02T10:02:59Z</updated>

    <summary> 昨日、出版社から印税が振り込まれました。それによると発刊部数が２４７５部、在庫...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="91robotsimu" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
昨日、出版社から印税が振り込まれました。それによると発刊部数が２４７５部、在庫相当部数が８３３部なので、差し引き１６４２部売れたことになります。
</p>
<p>
ODE本ではユニークな特徴として「ODEプロジェクトへの寄付」があります。そこで、本書の売り上げ１冊につき１ドルを寄付すると謳っています。従いまして、ささやかなクリスマスプレゼントとして１６４２ドルをODEプロジェクトへ本日寄付しました。
</p>
<p>
この本はODEに対する私の感動体験（グラフィクスが美しく、とても簡単）から生まれたものです。ロボティクスの基礎とそのプログラミングを同時に学べる実践書です。大学低学年、高専生向けに書いており、私は学部２，３年の講義に使っています。学生からの評判もまずまずです。
</p>
<p>
来年はもう少し寄付できたらと思いますので、今後とも皆様のご協力をお願いします。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>ODE本３刷決定！</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/ode-19.html" />
    <id>tag:demura.net,2007://1.462</id>

    <published>2007-12-20T03:37:59Z</published>
    <updated>2008-01-02T10:02:59Z</updated>

    <summary> 読者の皆様のおかげで、ODE本の３刷１５００部が決定しましたのでご報告します。...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="91robotsimu" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
読者の皆様のおかげで、ODE本の３刷１５００部が決定しましたのでご報告します。
</p>
<p>
先日、出版社の方がKITまで来られたので、ODE本の現状を教えて頂きました。今まで、初版と重版を併せて２５００部発刊されました。出版社の倉庫に約３００部、他に本屋の棚に眠っている本もあるので詳しい数はわかりませんが、約１７００部は売れたのではないかということです。
</p>
<p>
今後ともよろしくお願いします。&nbsp;
</p>
<p>
&nbsp;
</p>]]>
        
    </content>
</entry>

<entry>
    <title>２０万アクセス達成</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/post-140.html" />
    <id>tag:demura.net,2007://1.461</id>

    <published>2007-12-17T14:09:09Z</published>
    <updated>2008-01-02T10:02:59Z</updated>

    <summary> 冬は本当に忙しくてサイトの更新もままなりませんが、何とか２０万アクセスを達成し...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="6news" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
冬は本当に忙しくてサイトの更新もままなりませんが、何とか２０万アクセスを達成しました。今後ともよろしくお願いします。
</p>
<ul>
<li>アクセスログ<br />
</li>
<ul>
<li>２００７年１２月１７日：２０００００アクセス&nbsp;</li>
<li>２００７年１０月２９日：１９００００アクセス&nbsp;</li>
<li>２００７年　９月１１日：１８００００アクセス&nbsp;</li>
<li>２００７年　７月　３日：１７００００アクセス</li>
<li>２００７年　５月３１日：１６００００アクセス&nbsp;</li>
<li>２００７年　４月　８日：１５００００アクセス</li>
<li>２００７年　１月２１日：１４００００アクセス</li>
<li>２００７年　１月　１日：１３６２８５アクセス</li>
<li>２００６年１０月１９日：１２３４５６アクセス</li>
<li>２００６年　６月２８日：１１１１１１アクセス</li>
<li>２００６年　４月１９日：１０００００アクセス</li>
<li>１９９８年　１月　１日：開設</li>
</ul>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>NHK大学ロボコン　優勝チームが書類審査不合格</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/12/nhk-1.html" />
    <id>tag:demura.net,2007://1.460</id>

    <published>2007-12-11T11:58:10Z</published>
    <updated>2008-01-02T10:02:58Z</updated>

    <summary> １２月８日（土）に夢考房の安全祈願祭、その後、夢考房並びに機械系の関係者による...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="2yumekobo" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
１２月８日（土）に夢考房の安全祈願祭、その後、夢考房並びに機械系の関係者による忘年会が開催されました。
</p>
<p>
その忘年会の席で、今年NHK大学ロボコンで優勝し、ABUロボコンに出場したKIT夢考房チームが書類審査で不合格というショッキングなニュースを知りました。書類審査では７１チームがエントリーし、そのうち20チーム前後が選ばれたということです。選考にあたっては、アイディア、手作りロボットの魅力度、ABUロボコンに勝てるかなどが評価されたそうです。
</p>
<p>
2002年以来書類審査で落選したことはなく、さらに今年優勝した夢考房チームが書類審査で落ちることは常識では考えづらいことです。ABUロボコンに出場した学生達の話を聞くと他の国は国家の威信をかけて勝つためのロボットを作っているとのことです。ところが日本チームは、NHK大学ロボコンがアイディア対決と銘打っているように、確実性はさほど高くありませんが面白いアイディアのロボットが多く見られます。また、タイやベトナムでは参加チームが多く、国内予選を勝ち抜くためには、数多くの実戦を経験し、勝ち上がらなければならないそうです。
</p>
<p>
このままではロボコンを提唱した日本がABUアジア・太平洋ロボットコンテストで全然勝てなくなるのではないでしょうか。RoboCupも同じような状態でヒューマノイドリーグ以外ではほとんど勝てなくなっています。私はNHK大学ロボコンへの応募書類を読んでいないので書類審査の結果についてコメントできませんが、今年度の優勝、準優勝チームぐらいは書類審査を免除して出場権を獲得させても良いのではないでしょうか。NHK大学ロボコン出場への選出方法を変えなければ、ABU世界大会における日本チームの低迷がしばらく続き、ロボコン競技の日本での発展が阻害されるのではないかと心配です。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>AutoCADで作成したデータを3dsに変換する方法</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/11/autocad3ds.html" />
    <id>tag:demura.net,2007://1.459</id>

    <published>2007-11-16T09:26:01Z</published>
    <updated>2008-01-02T10:02:58Z</updated>

    <summary> 3dsの表示ソフトHira 3D Viewerでロボカップ中型ロボットWinK...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="8misc" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
<img alt="Open Dynamics Engine" title="Open Dynamics Engine" src="http://demura.net/archives/images/ode/figs/winkit07-3ds.jpg" />
<span style="font-size: x-small"><br />
3dsの表示ソフト<a href="http://www.hiramine.com/software/hira3dviewer/index.html">Hira 3D Viewer</a>でロボカップ中型ロボットWinKIT07 (設計：奥田君）を表示した画面<br />
</span><br />
AutoCADで作成したデータを3dsに変換する方法を苦労して見つけたので、ここにメモとして記録します。この方法は作業メモなので動作を保障するものではありません。もっと良い方法があればコメント頂けたらありがたいですが、個別のご質問には回答できません。CADのデータによってはできないかもしれません。
</p>
<p>
1. Mechanical Desktop 2008でAutoCADのファイルを開く。<br />
ファイル&rarr;書き出し&rarr;Desktop VRML で保存。
</p>
<p>
2. Crossroadsで１のファイルを読み込む。<br />
Save as &rarr;　VRML 1.0 (wrl) で保存。<br />
<br />
なお、Crossroadsに関しては古いソフトで私は以前から使っていました。現在は<a href="http://webpages.charter.net/rickmalagodi/Hulls%20to%20ACAD%20Tutorial/Hulls%20to%20AutoCad%20in%203%20Easy%20Steps.htm"><u><span style="color: #800080">こちらのページ</span></u></a>から入手可能なようですが、ダウンロード等は自己責任でお願いします。
</p>
<p>
3.<a href="http://www.blender.org/">Blender2.45</a>で２のファイルをインポートする。<br />
3ds形式でエクスポート。
</p>
<p>
おしまい。
</p>
<p>
&nbsp;
</p>]]>
        
    </content>
</entry>

<entry>
    <title>ODE講座23：関節中心点の取得とスケルトン表示</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/11/ode23.html" />
    <id>tag:demura.net,2007://1.458</id>

    <published>2007-11-11T03:52:43Z</published>
    <updated>2008-01-02T10:02:58Z</updated>

    <summary><![CDATA[ &nbsp; 上の図はジョイント（関節）の中心に球を描画し、各ボディの重心と各...]]></summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="92ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
&nbsp;<a href="http://demura.net/cgi-bin/mt/#mce_temp_url#">
<img width="400" height="328" title="Open Dynamics Engine" alt="Open Dynamics Engine" src="http://demura.net/archives/images/ode/snake.jpg" />
</a><br />
<span style="font-size: x-small">上の図はジョイント（関節）の中心に球を描画し、各ボディの重心と各関節中心を直線で結び、それが外部から見えるようにボディを半透明にしスケルトン表示しています。</span>
</p>
<p>
ODE (Open Dynamics Engine) 講座の２３回目です。 11月に入り、カニ漁が解禁になりました。雄のズワイガニはとても有名ですが、その雌は香箱ガニと呼ばれ体は小さいのですが、卵が美味で珍味として重宝されています。今年は豊漁のようで、金沢では近所のスーパーで３杯１０００円程度で購入できます。金沢では美味しい食べ物とお酒と温泉がこれからの楽しみとなります。
</p>
<p>
さて、チップさんから、関節中心点の取得法について質問があり、ODE本を読んでもよくわからないとのことだったのでここで補足します。
</p>]]>
        <![CDATA[
<p>
この例では、関節の中心を球で表示し、重心と関節中心を線で表示しています。さらに、線が見えるようにボディを半透明にしています。&nbsp;半透明で描画するAPIはdsSetColorAlphaです。
</p>
<p>
<strong>1</strong><strong>.&nbsp; 関節中心点の取得</strong>
</p>
<p>
ここでは関節としてヒンジジョイントを例に取ります。ヒンジジョイントの関節中心点を取得するAPIは次の２つあります。
</p>
<ul>
<li><strong>d</strong><strong>JointGetHingeAnchor(&nbsp; dJointID&nbsp; joint, dVector3 result)</strong></li>
</ul>
<ul>
<li><strong>dJointGetHingeAnchor2(dJointID joint,&nbsp; dVector3 result)</strong></li>
</ul>
<p>
ヒンジジョイントjointの関節中心を絶対座標系で取得し、その値をresultに代入します。dVector3はdReal型の要素数３個の配列です。正確には要素数４個の配列ですが、これは計算を高速にするためのテクニックで、実際には最初の３個の要素しか使われません。<br />
<br />
1番目と２番目のAPIの違いは前者はボディ１に対応するヒンジの中心点で、後者のdJointGetHingeAnchor2はボディ２に対応するヒンジの中心点です。ヒンジを生成したときは両者の中心点は一致していますが、シミュレーションを重ねる度にずれが生じます。それぞれを直すのがEFPパラメータです。&nbsp;<br />
<br />
&nbsp;<strong>2. スケルトン表示（半透明色の設定）</strong>
</p>
<p>
シミュレーションによっては内部の構造を見せるためにスケルトン表示したい場合があります。描画ライブラリであるdrawstuffを使い半透明の物体を描画するには次のAPIを使います。
</p>
<ul>
<li><strong>dsSetColorAlpha(float r, float g, float b, float alpha);</strong></li>
</ul>
<p>
ここで、最初の引数　r,　g,　bは赤、緑、青の三原色、alphaは透明度を表し、0から1までの範囲を取り、透明度で0は透明、1は不透明です。
</p>
<p>
なお、スケルトン表示する場合は描画の順番が大切です。この例の場合は、まず不透明の骨に相当する直線を描画し、その後に半透明の関節やボディを描画します。この順番を間違えると表示されません。<br />
<br />
関係部分のソースコードを以下に示します。<a href="http://demura.net/archives/images/ode/jointAnchor.tgz">全ソースコードはここから取得可能です。<br />
</a>サンプルプログラムではbキーを押すとボディ描画の表示を切り替えます。
</p>
<hr />
static void simLoop (int pause)<br />
{&nbsp;
<p>
&nbsp; const dReal *pos[BODY_NUM],*R[BODY_NUM];<br />
&nbsp; dMatrix3 R1;<br />
&nbsp; dVector3 ap[BODY_NUM-1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 関節中心点　anchor point<br />
&nbsp; float&nbsp;&nbsp;&nbsp; ar = 0.06;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 関節表示用球の半径　anchor radius
</p>
<p>
&nbsp; if (!pause) {<br />
&nbsp;&nbsp; &nbsp;if (steps++ &lt; 10) dBodyAddForce (leg[0].body, 0, 1.0, 0);<br />
&nbsp;　&nbsp;for (int i = 0; i &lt; BODY_NUM-1; i++) 　control(i, joint[i]);<br />
&nbsp; &nbsp;dSpaceCollide(space,0,&amp;nearCallback);&nbsp;<br />
&nbsp;&nbsp;&nbsp;dWorldStep(world,0.01);<br />
&nbsp; &nbsp;dJointGroupEmpty(contactgroup);&nbsp;<br />
&nbsp;}
</p>
<p>
&nbsp; // 重心位置と回転行列の取得　calculate positions and orientaitons<br />
&nbsp;&nbsp;for (int i = 0; i &lt; BODY_NUM; i++) {&nbsp;&nbsp;<br />
&nbsp; &nbsp;　pos[i] = dBodyGetPosition(leg[i].body);<br />
&nbsp; &nbsp;　R[i]&nbsp;&nbsp; = dBodyGetRotation(leg[i].body);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp;// 関節中心の取得　　calculate anchor points<br />
&nbsp;dRSetIdentity(R1);<br />
&nbsp;for (int i = 0; i &lt; BODY_NUM-1; i++) {<br />
&nbsp;&nbsp;　dJointGetHingeAnchor(joint[i], ap[i]);<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp; // 関節中心から重心まで直線で描画　draw lines<br />
&nbsp;&nbsp;for (int i = 0; i &lt; BODY_NUM-1; i++) {<br />
&nbsp;&nbsp;　dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);<br />
&nbsp;&nbsp;　dsDrawLine(pos[i], ap[i]);<br />
&nbsp;&nbsp;　dsSetColorAlpha(0.0, 0.0, 0.0, 1.0);<br />
&nbsp;&nbsp;　dsDrawLine(ap[i],&nbsp; pos[i+1]);<br />
&nbsp;}
</p>
<p>
&nbsp;dsSetColorAlpha(1.3, 0.0, 0.0, 0.5);<br />
&nbsp;// 関節中心を中心とした球の描画　draw anchors<br />
&nbsp;for (int i = 0; i &lt; BODY_NUM-1; i++) {<br />
&nbsp;&nbsp;<strong><span style="color: #cc0000">dJointGetHingeAnchor(joint[i], ap[i]);　// 関節中心点の取得</span></strong><br />
&nbsp;&nbsp;　dsDrawSphere(ap[i], R1, ar);&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// ボディの描画　draw legs<br />
&nbsp;<strong><span style="color: #000066">dsSetColorAlpha(0.0, 0.0, 1.3, 0.5);　// 透明色の設定</span></strong><br />
&nbsp;for (int i = 0; i &lt; BODY_NUM; i++) {<br />
&nbsp; &nbsp;　if (drawBody) dsDrawCapsule(pos[i],R[i],leg[i].length,leg[i].radius);<br />
&nbsp; }<br />
}
</p>
<hr />
<p>
demu
</p>
<p>
&nbsp;
</p>]]>
    </content>
</entry>

<entry>
    <title>ODE講座22：ODEでポリゴンを簡単に表示する方法</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/11/ode22ode.html" />
    <id>tag:demura.net,2007://1.457</id>

    <published>2007-11-01T13:49:21Z</published>
    <updated>2008-01-02T10:02:58Z</updated>

    <summary><![CDATA[ &nbsp;Archive3D.netからダウンロードした3DSフォーマットの...]]></summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="92ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="9ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
<img width="656" height="458" title="Open Dynamics Engine" alt="ODE texture" src="http://demura.net/archives/images/ode/rabit.jpg" />
</p>
<p>
<span style="font-size: x-small">&nbsp;<a href="http://archive3d.net/">Archive3D.net</a>からダウンロードした3DSフォーマットの「<a href="http://archive3d.net/?a=download&amp;id=8059">うさちゃん</a>」。lib3dsライブラリを使うことでODE付属のdrawstuffで表示できました。</span>
</p>
<p>
&nbsp;早いものでもう１１月ですね。卒業研究や修士研究に取り組んでいる方はお尻に火か着くころではないでしょうか。
</p>
<p>
さて、ODE (Open Dynamics Engine）講座の22回目です。ODEに付属している３次元グラフィクスライブラリdrawstuffでは３Dモデルのファイルを読み込みません。ひびきのさんはXファイル（あの謎が謎を呼ぶTV番組ではありません。最も最近はPrison Breakに夢中ですが...）を読み込む<a href="http://hwm7.gyao.ne.jp/shinpuku/column05.html">X File　Loader</a>を公開しています。 ここではもう一つの標準的な3Dファイルである3DSを読み込むサンプルプログラムをテスト公開します。
</p>]]>
        <![CDATA[
<p>
3dsファイルを読み込むライブラリとしてlib3dsを使います。これはJan Eric Kyprianidisさんが開発したものでLGPLで公開されています。<a href="http://lib3ds.sourceforge.net/">lib3dsのウェブサイトはここです。</a>
</p>
<p>
まず、lib3dsをインストールしましょう。方法はODEと同じで 以下の要領です。MSYS+MinGW+Windows Vista環境で問題なくできました。
</p>
<ul>
<li>./configure</li>
<li>make</li>
<li>make install</li>
</ul>
<p>
後は、このode3dsloader-0.0.tgzファイルを次のリンクからダウンロードして、
</p>
<ul>
<li>&nbsp;<a href="http://demura.net/archives/images/ode/ode3dsloader-0.0.tgz">3DS Loader for Open Dynamics Engine 0.0</a>(2007-11-1)<br />
</li>
</ul>
<p>
今までのサンプルプログラムと同じように展開し、make、実行してください。ただし、このプログラムは完全ではなく、複数の部品で構成されるモデルを表示しようとするとエラーになります。また、テクスチャも表示できません。そのためにはdrawstuffのソースを変更しなければなりません。今後の宿題とします。
</p>
<p>
なお、3dsファイルを表示するためには、そのファイルが必要になります。上図の<a href="http://archive3d.net/?a=download&amp;id=8059">うさちゃん</a>は<a href="http://archive3d.net/">Archive3D.net</a>の<a href="http://archive3d.net/?a=download&amp;id=8059">ここからダウンロード</a>しました。&nbsp;
</p>
<p>
以下にソースコードの主要部分を掲載します。3dsファイルを読み込む関数がload3dsModel()です。読み込みが終わると頂点配列Vertices[]とインデックス配列Indices[]にデータが格納されるので、後はODE付属のdemoプログラムdemo_moving_trimesh.cppと同じようにプログラムするとポリゴンデータを扱うことができます。<br />
<br />
つまり、一般ユーザはload3dsModel()を一行入れるだけで3dsファイルを読み込むことができます。簡単ですね。<br />
<br />
<strong><span style="color: #cc0000">まだ、テスト公開中で不完全です。複数のオブジェクトで構成される3dsデータを表示できなければなりません。コメント頂ければありがたいです。</span></strong><span style="font-size: x-small">
<hr />
</span>
</p>
<p>
&nbsp;
</p>
<p>
<span style="font-size: x-small">// main.cppから抜粋&nbsp; by Kosei Demura 2007-11-1&nbsp;<br />
//</span><br />
<span style="font-size: x-small">#include &lt;ode/ode.h&gt;<br />
#include &lt;drawstuff/drawstuff.h&gt;<br />
<span style="color: #cc0000">#include &quot;ode3dsloader.h&quot;</span></span><span style="color: #cc0000"><br />
</span><span style="font-size: x-small"><span style="color: #cc0000">extern int MeshCount;　// オブジェクト数<br />
</span><br />
void makeModel()<br />
{<br />
&nbsp; static dReal weight = 10.0;<br />
&nbsp; dReal x0 = 0, y0 = 0, z0 = 1.0;<br />
&nbsp; dMass m;</span>
</p>
<p>
<span style="font-size: x-small"><span style="color: #cc0000">// 3dsファイルをロードする関数。引数は3dsファイル名</span><br />
&nbsp;<span style="color: #cc0000">load3dsModel(&quot;../models/rabbit.3DS&quot;);&nbsp;</span></span>
</p>
<p>
<span style="font-size: x-small">&nbsp;TriData = (dTriMeshDataID *) malloc(MeshCount * sizeof(dTriMeshDataID));</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;model&nbsp; = (MyObject *) malloc (MeshCount * sizeof(MyObject));</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;for (int i = 0; i &lt; MeshCount; i++) {<br />
&nbsp;&nbsp;　// rigid body<br />
&nbsp;&nbsp;　model[i].body = dBodyCreate(world);<br />
&nbsp;&nbsp;　dBodySetPosition(model[i].body, x0, y0, z0);</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;　// for a trimesh object<br />
&nbsp; &nbsp; TriData[i] = dGeomTriMeshDataCreate();&nbsp;&nbsp;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;&nbsp; dGeomTriMeshDataBuildSingle(TriData[i], trimesh[i].vertices, 3 * sizeof(float),&nbsp;trimesh[i].vertexCount, trimesh[i].indices, trimesh[i].indexCount * 3, 3 * sizeof(int));<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; model[i].geom = dCreateTriMesh(space, TriData[i], 0, 0, 0);</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;　// remember the mesh's dTriMeshDataID on its userdata for convenience.<br />
&nbsp;&nbsp;　dGeomSetData(model[i].geom, TriData[i]);&nbsp; &nbsp;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;　dMassSetTrimeshTotal(&amp;m, weight, model[i].geom);<br />
&nbsp;&nbsp;&nbsp;&nbsp;dGeomSetPosition(model[i].geom, -m.c[0], -m.c[1], -m.c[2]);<br />
&nbsp;&nbsp;&nbsp; dMassTranslate(&amp;m, -m.c[0], -m.c[1], -m.c[2]);</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;　dGeomSetBody(model[i].geom, model[i].body);<br />
&nbsp;&nbsp;　dBodySetMass(model[i].body, &amp;m);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;　dMatrix3 Rotation;<br />
&nbsp;&nbsp;&nbsp; dRFromAxisAndAngle(Rotation, 0, 0, 1, -M_PI/4);<br />
&nbsp;&nbsp;&nbsp; dBodySetRotation(model[i].body, Rotation);<br />
&nbsp;　}<br />
}<br />
</span>
</p>
<p>
&nbsp;
</p>
<span style="font-size: x-small">
<hr />
// ode3dsloader.cpp by Kosei Demura 2007-11-01<br />
// 3dsフォーマットで作られたオブジェクトを読み込むプログラム<br />
// このファイルでload3dsModel()関数を実装している。<br />
// Todo：１つの3Dモデルが複数のオブジェクトで構成されているとエラーになる。<br />
// lib3dsライブラリが必要</span><a href="http://lib3ds.sourceforge.net/"><span style="font-size: x-small">http://lib3ds.sourceforge.net/</span></a><br />
<span style="font-size: x-small">#include &quot;ode3dsloader.h&quot;</span><br />
<span style="font-size: x-small">#define BASE_LENGTH&nbsp; 1.0&nbsp;&nbsp;&nbsp; &nbsp; // メッシュモデルのバウンディングボックスの最大長さ[m]<br />
#define MAX_OBJECTS&nbsp; 1000&nbsp;&nbsp; // オブジェクトの数<br />
</span><br />
<span style="font-size: x-small">typedef struct<br />
{<br />
&nbsp;&nbsp;&nbsp; float *vertices;<br />
&nbsp;&nbsp;&nbsp; unsigned int vertexCount;<br />
&nbsp;&nbsp;&nbsp; int *indices;<br />
&nbsp;&nbsp;&nbsp; unsigned int indexCount;<br />
} MyTrimesh;</span>
<p>
<span style="font-size: x-small">extern MyTrimesh *trimesh;</span>
</p>
<p>
<span style="font-size: x-small">dReal MIN_X = dInfinity, MAX_X = - dInfinity;<br />
dReal MIN_Y = dInfinity, MAX_Y = - dInfinity;<br />
dReal MIN_Z = dInfinity, MAX_Z = - dInfinity;<br />
dReal ADJUST;&nbsp;<br />
Lib3dsFile *file=0;</span>
</p>
<p>
<span style="font-size: x-small">int MeshCount&nbsp; = 0;</span>
</p>
<p>
<span style="font-size: x-small">int vCount[MAX_OBJECTS], iCount[MAX_OBJECTS];</span>
</p>
<p>
<span style="font-size: x-small">void calModel(Lib3dsMesh *mesh, int *points, int *faces)<br />
{<br />
&nbsp;　*points = mesh-&gt;points;<br />
&nbsp;　*faces&nbsp; = mesh-&gt;faces;<br />
}</span>
</p>
<p>
<span style="font-size: x-small">int meshDump(int no, Lib3dsMesh *mesh)<br />
{<br />
&nbsp;　if (mesh-&gt;points == 0) return 0;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp; for (int i=0; i&lt; (int) mesh-&gt;points; i++) {<br />
&nbsp; &nbsp; trimesh[no].vertices[3*i]&nbsp;&nbsp; = mesh-&gt;pointL[i].pos[0];<br />
&nbsp;&nbsp;&nbsp; trimesh[no].vertices[3*i+1] = mesh-&gt;pointL[i].pos[1];<br />
&nbsp;&nbsp;&nbsp; trimesh[no].vertices[3*i+2] = mesh-&gt;pointL[i].pos[2];<br />
&nbsp;　&nbsp;if (MIN_X &gt; mesh-&gt;pointL[i].pos[0]) MIN_X = mesh-&gt;pointL[i].pos[0];<br />
&nbsp;　&nbsp;if (MIN_Y &gt; mesh-&gt;pointL[i].pos[1]) MIN_Y = mesh-&gt;pointL[i].pos[1];<br />
&nbsp;&nbsp;if (MIN_Z &gt; mesh-&gt;pointL[i].pos[2]) MIN_Z = mesh-&gt;pointL[i].pos[2];<br />
&nbsp;&nbsp;　if (MAX_X &lt; mesh-&gt;pointL[i].pos[0]) MAX_X = mesh-&gt;pointL[i].pos[0];<br />
&nbsp;　&nbsp;if (MAX_Y &lt; mesh-&gt;pointL[i].pos[1]) MAX_Y = mesh-&gt;pointL[i].pos[1];<br />
&nbsp;　&nbsp;if (MAX_Z &lt; mesh-&gt;pointL[i].pos[2]) MAX_Z = mesh-&gt;pointL[i].pos[2];<br />
&nbsp; }<br />
&nbsp;<br />
for (int i=0; i&lt; (int) mesh-&gt;faces; i++) {<br />
&nbsp;&nbsp;&nbsp; 　trimesh[no].indices[3*i]&nbsp;&nbsp; = mesh-&gt;faceL[i].points[0];<br />
&nbsp;&nbsp;　&nbsp; trimesh[no].indices[3*i+1] = mesh-&gt;faceL[i].points[1];<br />
&nbsp;&nbsp;　&nbsp; trimesh[no].indices[3*i+2] = mesh-&gt;faceL[i].points[2];<br />
&nbsp;&nbsp; }<br />
&nbsp;　return 1;<br />
}</span>
</p>
<p>
<span style="font-size: x-small">// トライメッシュデータのサイズ変更<br />
int normalize(int no, Lib3dsMesh *mesh)<br />
{<br />
&nbsp;if (mesh-&gt;points == 0) return 0;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;for (int i=0; i&lt; (int) mesh-&gt;points; i++) {<br />
&nbsp; &nbsp;trimesh[no].vertices[3*i]&nbsp;&nbsp; 　*= (dReal) ADJUST;<br />
&nbsp;&nbsp;&nbsp;trimesh[no].vertices[3*i+1] *= (dReal) ADJUST;<br />
&nbsp;&nbsp;&nbsp;trimesh[no].vertices[3*i+2] *= (dReal) ADJUST;<br />
&nbsp;}<br />
&nbsp;return 1;<br />
}</span>
</p>
<p>
<span style="font-size: x-small">void load3dsModel(const char *filename)<br />
{<br />
&nbsp; int points, faces, no;<br />
&nbsp; Lib3dsMesh *p;<br />
&nbsp;<br />
&nbsp; file = lib3ds_file_load(filename);<br />
&nbsp; if (!file) {<br />
&nbsp;&nbsp;&nbsp; puts(&quot;3dsplayer: Error: Loading 3DS file failed.\n&quot;);<br />
&nbsp;&nbsp;&nbsp; exit(1);<br />
&nbsp; }</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;for (p=file-&gt;meshes; p!=0; p=p-&gt;next) {<br />
&nbsp;&nbsp;&nbsp; calModel(p, &amp;points, &amp;faces);<br />
&nbsp;&nbsp;&nbsp; if (points == 0) continue;<br />
&nbsp;&nbsp;&nbsp; MeshCount++;<br />
&nbsp; }<br />
<br />
&nbsp;trimesh&nbsp;&nbsp; = (MyTrimesh *) malloc(MeshCount * sizeof(MyTrimesh));<br />
&nbsp;no = 0;<br />
&nbsp;&nbsp;for (p=file-&gt;meshes; p!=0; p=p-&gt;next) {<br />
&nbsp;&nbsp;&nbsp; calModel(p, &amp;points, &amp;faces);<br />
&nbsp;&nbsp; if (points == 0) continue;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;&nbsp;&nbsp; vCount[no] = points;<br />
&nbsp;&nbsp;&nbsp; iCount[no] = faces;&nbsp;<br />
&nbsp;&nbsp; &nbsp;trimesh[no].vertices = (float *) malloc(vCount[no]&nbsp; * sizeof(float) * 3);<br />
&nbsp;&nbsp; &nbsp;trimesh[no].indices&nbsp; = (int *)&nbsp;&nbsp;&nbsp; malloc(iCount[no]&nbsp;&nbsp; * sizeof(int)&nbsp;&nbsp;&nbsp; * 3);<br />
&nbsp; &nbsp; trimesh[no].vertexCount = vCount[no];<br />
&nbsp; &nbsp; trimesh[no].indexCount&nbsp; = iCount[no];<br />
&nbsp; &nbsp; no++;<br />
&nbsp; }</span>
</p>
<p>
<span style="font-size: x-small">&nbsp; no = 0;<br />
&nbsp; for (p=file-&gt;meshes; p!=0; p=p-&gt;next) {<br />
&nbsp;&nbsp;&nbsp;if (meshDump(no, p)) no++;<br />
&nbsp; }</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;dReal maxLength;</span>
</p>
<p>
<span style="font-size: x-small">&nbsp;if (MAX_X - MIN_X &gt;= MAX_Y - MIN_Y) {<br />
&nbsp;&nbsp; if (MAX_X - MIN_X &gt;= MAX_Z - MIN_Z) maxLength = MAX_X - MIN_X;<br />
&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxLength = MAX_Z - MIN_Z;<br />
&nbsp;}<br />
&nbsp;else {<br />
&nbsp;&nbsp; &nbsp;if (MAX_Y - MIN_Y &gt;= MAX_Z - MIN_Z) maxLength = MAX_Y - MIN_Y;<br />
&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxLength = MAX_Z - MIN_Z;<br />
&nbsp;}</span>
</p>
<span style="font-size: x-small">&nbsp;　ADJUST = BASE_LENGTH / maxLength;<br />
&nbsp;<br />
&nbsp;&nbsp;no = 0;<br />
&nbsp; for (p=file-&gt;meshes; p!=0; p=p-&gt;next) {<br />
&nbsp;&nbsp;&nbsp; if (normalize(no, p)) no++;<br />
&nbsp;}<br />
}<br />
</span><span style="font-size: x-small">
<hr />
<p>
// ode3dsloader.h
</p>
<p>
#include &lt;ode/ode.h&gt;<br />
#include &lt;drawstuff/drawstuff.h&gt;<br />
// for lib3ds<br />
#include &lt;lib3ds/chunk.h&gt;<br />
#include &lt;lib3ds/file.h&gt;<br />
#include &lt;lib3ds/camera.h&gt;<br />
#include &lt;lib3ds/mesh.h&gt;<br />
#include &lt;lib3ds/node.h&gt;<br />
#include &lt;lib3ds/material.h&gt;<br />
#include &lt;lib3ds/matrix.h&gt;<br />
#include &lt;lib3ds/vector.h&gt;<br />
#include &lt;lib3ds/light.h&gt;
</p>
<p>
void load3dsModel(const char *filename);<br />
</p>
<hr />
<br />
<p>
&nbsp;
</p>
</span>
<p>
&nbsp;
</p>]]>
    </content>
</entry>

<entry>
    <title>１９万アクセス達成</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/10/post-139.html" />
    <id>tag:demura.net,2007://1.456</id>

    <published>2007-10-29T23:19:36Z</published>
    <updated>2008-01-02T10:02:58Z</updated>

    <summary> １９万アクセスを達成しました。今後ともよろしくお願いします。 アクセスログ ２...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="6news" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
１９万アクセスを達成しました。今後ともよろしくお願いします。
</p>
<ul>
<li>アクセスログ<br />
</li>
<ul>
<li>２００７年１０月２９日：１９００００アクセス&nbsp;</li>
<li>２００７年　９月１１日：１８００００アクセス&nbsp;</li>
<li>２００７年　７月　３日：１７００００アクセス</li>
<li>２００７年　５月３１日：１６００００アクセス&nbsp;</li>
<li>２００７年　４月　８日：１５００００アクセス</li>
<li>２００７年　１月２１日：１４００００アクセス</li>
<li>２００７年　１月　１日：１３６２８５アクセス</li>
<li>２００６年１０月１９日：１２３４５６アクセス</li>
<li>２００６年　６月２８日：１１１１１１アクセス</li>
<li>２００６年　４月１９日：１０００００アクセス</li>
<li>１９９８年　１月　１日：開設</li>
</ul>
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>ODE講座21：テクスチャを切り替えよう！（画像ライブラリ）</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/10/ode21.html" />
    <id>tag:demura.net,2007://1.455</id>

    <published>2007-10-27T08:25:55Z</published>
    <updated>2008-01-02T10:02:57Z</updated>

    <summary> テクスチャを切り替えるサンプルプログラム チップさんから「プログラムに関する質...</summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="92ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<img width="250" height="205" alt="ODE texture" src="http://demura.net/archives/images/ode/texture.jpg" />
<img width="250" height="205" alt="ODE texture" src="http://demura.net/archives/images/ode/texture2.jpg" />
<br />
<span style="font-size: x-small">テクスチャを切り替えるサンプルプログラム</span><br />
<p>
チップさんから「プログラムに関する質問なのですが、テクスチャをたくさん使うにはどうすればいいのでしょうか？LOOPの中でfn.path_to_texturesのパスを変えてもテクスチャが変わらなくて悩んでいます。というご質問を頂きました今回のODE講座で回答します。<br />
</p>
<p>
simloopの中でpath_to_texturesのパスを変えてもテクスチャは変わりません。<br />
dsStartGraphics()を使う必要があります。ただし、drawstuff.hの95行目のdsSimulationLoop()の下に以下の一行を追加して、ode-0.9のフォルダでmake，make installし直してください。ode-0.8だとエラーが出るようです。
</p>
<p>
DS_API void dsStartGraphics(int window_width, int window_height, struct dsFunctions *fn);
</p>
<p>
なお、シミュレーション中の複数の物体に違ったテクスチャを割り当てるためには、dsStartGraphics()を各物体を描画する前に、各物体毎に呼び出さなければいけず、描画速度が遅くなります。drawstuffのソースコードに手を加えるか、他の３Dグラフィクスライブラリを使用することをお勧めします。
</p>
<p>
そもそもdrawstuffはテストプログラムの表示用ライブラリなので凝ったことはできません。その代わりにソースも短くコードも複雑ではないのでOpenGLの勉強にもピッタリです。
</p>
<p>
以下に't'キーと'u'キーを押すとテクスチャが切り替わるサンプルプログラムを紹介しますので参考にしてください。<a href="http://demura.net/archives/images/ode/texture071025.tgz">ここから</a>ダウンロード可能です。<br />
</p>]]>
        <![CDATA[
<p>
// texture.cpp: テクスチャの変更 by Kosei Demura (2007-10-25)<br />
#include &lt;ode/ode.h&gt;<br />
#include &lt;drawstuff/drawstuff.h&gt;
</p>
<p>
#ifdef dDOUBLE<br />
#define dsDrawBox&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsDrawBoxD<br />
#define dsDrawSphere&nbsp;&nbsp; dsDrawSphereD<br />
#define dsDrawCylinder dsDrawCylinderD<br />
#define dsDrawCapsule&nbsp; dsDrawCapsuleD<br />
#endif
</p>
<p>
static dWorldID world;<br />
static dSpaceID space;<br />
static dGeomID&nbsp; capsule;<br />
static int texture_flag = 0;
</p>
<p>
dsFunctions fn;
</p>
<p>
static void simLoop(int pause)<br />
{<br />
&nbsp; const dReal *pos;<br />
&nbsp;const dReal *R;<br />
&nbsp; dReal r, l;<br />
&nbsp;<br />
&nbsp; pos&nbsp;&nbsp; = dGeomGetPosition(capsule);<br />
&nbsp; R&nbsp;&nbsp;&nbsp;&nbsp; = dGeomGetRotation(capsule);
</p>
<p>
&nbsp;&nbsp;if (texture_flag == 0) dsSetTexture(DS_NONE);<br />
&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsSetTexture(DS_WOOD);
</p>
<p>
&nbsp;fn.path_to_textures = &quot;./textures&quot;;<br />
&nbsp; dsSetColor(1.2, 1.2, 1.2);<br />
&nbsp;dGeomCapsuleGetParams(capsule, &amp;r, &amp;l);&nbsp;<br />
&nbsp; dsDrawCapsule(pos, R, l, r);<br />
}
</p>
<p>
void command(int cmd)<br />
{<br />
&nbsp; switch (cmd) {<br />
&nbsp; case 't':<br />
&nbsp;&nbsp;fn.path_to_textures = &quot;./textures&quot;;<br />
&nbsp; &nbsp;dsStartGraphics(640,480,&amp;fn);<br />
&nbsp;&nbsp;texture_flag = 1;<br />
&nbsp; &nbsp;break;<br />
&nbsp; case 'u':<br />
&nbsp;&nbsp;fn.path_to_textures = &quot;../../drawstuff/textures&quot;;<br />
&nbsp; &nbsp;dsStartGraphics(640,480,&amp;fn);<br />
&nbsp;&nbsp;texture_flag = 0;<br />
&nbsp;&nbsp;break;<br />
&nbsp; }<br />
}
</p>
<p>
void start()<br />
{<br />
&nbsp; static float xyz[3] = {&nbsp;&nbsp; 3.0, 0.0, 1.0};<br />
&nbsp; static float hpr[3] = {-180.0, 0.0, 0.0};<br />
&nbsp; dsSetViewpoint(xyz, hpr);<br />
&nbsp; dsSetSphereQuality(3);<br />
}
</p>
<p>
void&nbsp; setDrawStuff()<br />
{<br />
&nbsp; fn.version = DS_VERSION;<br />
&nbsp; fn.start&nbsp;&nbsp; = &amp;start;<br />
&nbsp; fn.step&nbsp;&nbsp;&nbsp; = &amp;simLoop;<br />
&nbsp; fn.command = &amp;command;<br />
&nbsp; fn.stop&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp; fn.path_to_textures = &quot;../../drawstuff/textures&quot;;<br />
}
</p>
<p>
// カプセルジオメトリの生成<br />
void makeCapsule()<br />
{<br />
&nbsp;dReal r = 0.1, l = 1.0;
</p>
<p>
&nbsp;capsule&nbsp; =&nbsp; dCreateCapsule(space, r, l);&nbsp;&nbsp;&nbsp; // 直方体ジオメトリの生成<br />
&nbsp;dGeomSetPosition(capsule,&nbsp;&nbsp; 0, 0, 1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 位置の設定<br />
}
</p>
<p>
int main(int argc, char *argv[])<br />
{<br />
&nbsp; setDrawStuff();<br />
&nbsp; world = dWorldCreate();<br />
&nbsp; space = dHashSpaceCreate(0);<br />
&nbsp; makeCapsule();<br />
&nbsp; dsSimulationLoop(argc,argv,640,480,&amp;fn);<br />
&nbsp; dWorldDestroy(world);<br />
&nbsp; return 0;<br />
}
</p>]]>
    </content>
</entry>

<entry>
    <title>ODE講座20：好きな姿勢に設定しよう！</title>
    <link rel="alternate" type="text/html" href="http://demura.net/archives/2007/10/ode20.html" />
    <id>tag:demura.net,2007://1.454</id>

    <published>2007-10-24T15:39:49Z</published>
    <updated>2008-01-02T10:02:57Z</updated>

    <summary><![CDATA[ &nbsp; お待たせしました。約半年ぶりのODE講座です。さて、任意のベクト...]]></summary>
    <author>
        <name>demu</name>
        
    </author>
    
        <category term="92ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="9ODE" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://demura.net/">
        <![CDATA[
<p>
&nbsp;
<img width="360" height="291" alt="ODE orientation" src="http://demura.net/archives/images/ode/orientation.jpg" />
</p>
<p>
お待たせしました。約半年ぶりのODE講座です。さて、任意のベクトルの向きに沿うように円柱を表示させる方法に関してご質問があったので、試しにサンプルプログラムを作ってみました。
</p>
<p>
ここではdRFromAxisAndAngle()とdRFromZAxis()のAPIを使って実現しています。 この他にdRFromEulerAngles()のAPIもありますが、ODEのオイラー角はロボット関係者にとっては標準的ではないので省略します。 詳細については、<a href="http://demura.net/archives/9ode/faq.html#b9">よくある質問</a>をご覧ください。
</p>]]>
        <![CDATA[
<p>
このプログラムは、２点a[3], b[3]を通るベクトルと同じ姿勢を取るカプセルを２個表示させます。一つはdRFromAxisAndAngle()、もう一つはより簡単なdRFromZAxis()を使った方法です。dRFromZAxisはODEのメーリングリストで紹介された方法で、dRFromAxisAndAngle()は自分で考えてみました。
</p>
<ul>
<li>void<strong>dRFromAxisAndAngle</strong>(dMatrix3 R, dReal rx, dReal ry, dReal rz,&nbsp; dReal angle)<br />
回転軸(rx, ry, rz)を中心にangle [rad]回転したときの回転行列Rを取得する。ソースはode/src/rotation.cppにある。</li>
</ul>
<p>
このAPIを使ってベクトルの向きにカプセルの姿勢を設定するためには、自分で回転軸とその姿勢に必要な角度を計算する必要があります。ジオメトリのデフォルトの初期姿勢は、カプセルや円柱なら直立した状態です。これを重心を通るある軸を中心に回転させ、その姿勢が設定したいベクトルの向きと同じになれば良いわけです。サンプルプログラムではこれを実装しています。
</p>
<ul>
<li>void<strong>dRFromZAxis</strong>(dMatrix3 R, dReal rx, dReal ry, dReal rz)<br />
回転後のz軸(rx, ry, rz)から回転行列Rを取得する。ソースはode/src/rotation.cppにある。</li>
</ul>
<p>
このAPIは回転後のz軸を入力すると自動的にx軸、y軸を求め、それから回転行列Rを求めます。カプセルや円柱をベクトルの向きにするためには、rxにb[0]-a[0]、ryにb[1]-a[1]、rzにb[2]-a[2]を入れてください。カプセルや円柱の長軸方向を中心とした回転を考える必要がない場合は、こちらが簡単です。
</p>
<p>
なお、サンプルプログラムは簡単にするために衝突検出などは省いています。
</p>
<p>
<strong><br />
演習問題</strong>
</p>
<ul>
<li>以下のサンプルプログラムを参考に２点a, bを端点とする円柱を表示しよう。</li>
</ul>
<hr />
<p>
&nbsp;
</p>
<p>
// orientation.cpp: 初期姿勢の設定 by Kosei Demura (2007-10-24)<br />
#include &lt;ode/ode.h&gt;<br />
#include &lt;drawstuff/drawstuff.h&gt;
</p>
<p>
#ifdef dDOUBLE<br />
#define dsDrawBox&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsDrawBoxD<br />
#define dsDrawSphere&nbsp;&nbsp; dsDrawSphereD<br />
#define dsDrawCylinder dsDrawCylinderD<br />
#define dsDrawCapsule&nbsp; dsDrawCapsuleD<br />
#endif
</p>
<p>
// extern void dsStartGraphics(int window_width, int window_height, struct dsFunctions *fn);
</p>
<p>
static dWorldID world;<br />
static dSpaceID space;<br />
static dGeomID&nbsp; ground;<br />
static dGeomID&nbsp; capsule, capsule2;<br />
static dJointGroupID contactgroup;<br />
dsFunctions fn;
</p>
<p>
static void simLoop(int pause)<br />
{<br />
&nbsp; const dReal *pos, *pos2;<br />
&nbsp;const dReal *R, *R2;<br />
&nbsp; dReal r, l;<br />
&nbsp;<br />
&nbsp; pos&nbsp; = dGeomGetPosition(capsule);<br />
&nbsp; pos2 = dGeomGetPosition(capsule2);<br />
&nbsp; R&nbsp;&nbsp;&nbsp; = dGeomGetRotation(capsule);<br />
&nbsp; R2&nbsp;&nbsp; = dGeomGetRotation(capsule2);
</p>
<p>
&nbsp; dGeomCapsuleGetParams(capsule, &amp;r, &amp;l);
</p>
<p>
&nbsp; dsSetColor(1.2, 0.0, 0.0);<br />
&nbsp; dsDrawCapsule(pos, R, l, r);
</p>
<p>
&nbsp; dsSetColor(0.0, 1.2, 0.0);<br />
&nbsp; dsDrawCapsule(pos2, R2, l, r);&nbsp;<br />
}
</p>
<p>
void start()<br />
{<br />
&nbsp; static float xyz[3] = {&nbsp;&nbsp; 3.0, 0.0, 1.0};<br />
&nbsp; static float hpr[3] = {-180.0, 0.0, 0.0};<br />
&nbsp; dsSetViewpoint(xyz, hpr);<br />
&nbsp; dsSetSphereQuality(3);<br />
}
</p>
<p>
void&nbsp; setDrawStuff()<br />
{<br />
&nbsp; fn.version = DS_VERSION;<br />
&nbsp; fn.start&nbsp;&nbsp; = &amp;start;<br />
&nbsp; fn.step&nbsp;&nbsp;&nbsp; = &amp;simLoop;<br />
&nbsp; fn.command = NULL;<br />
&nbsp; fn.stop&nbsp;&nbsp;&nbsp; = NULL;<br />
&nbsp; fn.path_to_textures = &quot;../../drawstuff/textures&quot;;<br />
}
</p>
<p>
// カプセルの生成<br />
void makeCapsule()<br />
{<br />
&nbsp; dReal r = 0.05, l = 1.0;<br />
&nbsp; dReal x&nbsp; = 0, y&nbsp; = -1,&nbsp; z&nbsp; = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　 // 重心の座標<br />
&nbsp; dReal x2 = 0, y2 =&nbsp; 0,&nbsp; z2 = 1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 重心の座標<br />
&nbsp;<br />
&nbsp; dReal angle;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　 // 回転角<br />
&nbsp; dReal a[3] = {0, 0, 0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　 // ベクトルの始点<br />
&nbsp; dReal b[3] = {1, 1, 1};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　 // ベクトルの終点
</p>
<p>
&nbsp; capsule&nbsp; =&nbsp; dCreateCapsule(space, r, l);&nbsp;&nbsp;&nbsp; // 直方体ジオメトリの生成<br />
&nbsp; capsule2 =&nbsp; dCreateCapsule(space, r, l);&nbsp;&nbsp;&nbsp; // 直方体ジオメトリの生成
</p>
<p>
&nbsp; dMatrix3 R, R2;<br />
&nbsp;<br />
if (b[1] &gt; 0.0) 　angle = atan2(-sqrt(b[0]*b[0]+b[1]*b[1]), b[2]);<br />
else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　angle = atan2( sqrt(b[0]*b[0]+b[1]*b[1]), b[2]);
</p>
<p>
&nbsp; if (b[1] != 0.0)&nbsp;&nbsp;&nbsp;dRFromAxisAndAngle(R, 1, - b[0]/b[1], 0, angle);<br />
&nbsp; else&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　dRFromAxisAndAngle(R, 0, 1, 0, angle);<br />
&nbsp;<br />
&nbsp; dRFromZAxis(R2, b[0]-a[0], b[1]-a[1], b[2]-a[2]);
</p>
<p>
&nbsp; dGeomSetPosition(capsule,&nbsp; x , y , z );&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 位置の設定<br />
&nbsp; dGeomSetPosition(capsule2, x2, y2, z2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 位置の設定<br />
&nbsp;<br />
&nbsp; dGeomSetRotation(capsule,&nbsp; R);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　 // 姿勢の設定&nbsp;<br />
&nbsp; dGeomSetRotation(capsule2, R2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 姿勢の設定&nbsp;<br />
}
</p>
<p>
int main(int argc, char *argv[])<br />
{<br />
&nbsp; setDrawStuff();<br />
&nbsp; world = dWorldCreate();<br />
&nbsp; space = dHashSpaceCreate(0);<br />
&nbsp; contactgroup = dJointGroupCreate(0);<br />
&nbsp; makeCapsule();<br />
&nbsp; dsSimulationLoop(argc,argv,640,480,&amp;fn);<br />
&nbsp; dWorldDestroy(world);<br />
&nbsp; return 0;<br />
}<br />
</p>]]>
    </content>
</entry>

</feed>

