![]() |
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;
}