![]() |
Springhead
An open source physics engine for virtual reality, haptics and motion generation.
|
このページは内容が古くなっています(ただ今改訂の準備中です)
ここでは,簡単なプログラムとして,PHSimple に沿って説明します.
2つのティーポットにある一定の力を加え,10ステップ後の位置を出力するサンプルプログラムです.
PHSimple をOpenGLでレンダリングした サンプルプログラムは,PHSimpleGL にあります.
まずはインクルードファイルを定義します.
#include <Springhead.h> // Springheadのインタフェース
Springhead2のnamespaceも利用宣言しておきます.
using namespace Spr;
シミュレーションに必要な物理エンジンSDKのインスタンスを作成・取得し, 物体に対する質量・重心・慣性テンソルなどの必要な情報を設定します. これに関係する内容は APIのしくみ にも記載されています.
int main(int argc, char* argv[]){ sdk = CreatePHSdk(); // 物理エンジンSDKの作成 scene = sdk->CreateScene(); // シーンの作成 PHSolidDesc desc; // 剛体のディスクリプタ desc.mass = 2.0; // 質量を2に設定 desc.inertia *= 2.0; // 慣性テンソルの対角成分を2倍する(inertiaの初期値は単位行列) solid1 = scene->CreateSolid(desc); // 剛体1をdescに基づいて作成 desc.center = Vec3f(1,0,0); // 剛体の重心を(1,0,0)に設定 solid2 = scene->CreateSolid(desc); // 剛体2をdescに基づいて作成 :
初期設定を終えたら,シミュレーションを行います. ループ処理で,Step()関数を呼び,シミュレーションステップ数を更新していきます. ここでは,それぞれの剛体の重心から2m上を右方向に10Nの力を加え,Step()関数を呼んでいます. また,ステップを進めるごとに,剛体の位置情報を出力しています.
for(int i=0; i<10; ++i){ solid1->AddForce(Vec3f(10,0,0), Vec3f(0,2,0)+solid1->GetCenterPosition()); solid2->AddForce(Vec3f(10,0,0), Vec3f(0,2,0)+solid2->GetCenterPosition()); scene->Step(); std::cout << solid1->GetFramePosition(); std::cout << solid2->GetFramePosition() << std::endl; }
シミュレーション終了時には,物理エンジンSDKの開放を行います. ただし,物理エンジンSDKは開放しなくても,アプリケーション終了時に開放されるようになっています.
delete sdk;
以上により,剛体にある一定の力を加えたシミュレーションが行えます. なお,ここでは最後に,DBG_NEWでchar型のメモリ配列を用意し,VCでのメモリリーク検出テストを行っています.
char* memoryLeak = DBG_NEW char[123]; return 0; }