今のところプログラミングでバリバリとシミュレーションして結果を観察・・・ということは全くといいほどできていません。
・・・よくよく考えたらそんな知識はまだない。よくてもあと2年くらい頑張らないと。(とくに流体とか連続体とか)
しかし、まぁその手の物理そのものに関する知識があったところで、高校生でもわかるレベルの基本的なことをするにしても
プログラミングのノウハウのほうがなければどうしようもないのもまた事実
ということでこれからちょくちょく習ったこととか思いついたこととかを日記に書いていくかもしれません
(めんどくさくなってやめるかもしれません)
目指すは物理演算ライブラリの自作!(まぁ10年スパンの話だろうけどw)
さて、何をするにしてもまずは道具がいるのでちょっと頑張って作ってみました。
というより、勉強中のTMP(テンプレートメタプログラミング)の作品第一号です
その名もPhy型
物理演算において若干めんどくさい、そもそも計算が合ってるのか(つまり次元が一致しているのか)どうかということを勝手にコンパイル時にチェックしてくれるという奴です
まぁどうせ試作段階なので、ガタがすぐに出てくるでしょうけれど、とりあえずコードを組んでみます
記念すべき初コードでは高校で一番最初に習う「等加速度運動」、もしくは単純に「自由落下」をシミュレーションしてみます
#include
#include "Phy.h"
#include "Phy\PhyLinear.h"
#include "MyVector.h"
using namespace Physics;
using namespace Linear;
//時間変化は1/60秒
static const Phy dt(1.0/60.0);
//10ピクセルを1mとする
static const Phy toPixel(20.0);
//重力加速度を指定
static const Vector> gAccel(0.0,9.8,0.0);
//重さ10キログラムの円を仮定
class Circle{
public:
Circle():s_(10.0,0.0,0.0),m_(10.0){
}
void Update(){
AddForce(gAccel*m_);
a_ = f_/m_;
v_ += dt * a_;
s_ += dt * v_;
f_ = Vector>(0.0, 0.0, 0.0);
}
void AddForce(const Vector> &f){
f_ += f;
}
Vector> GetPosition(){
return s_;
}
private:
//位置
Vector> s_;
//質量
Phy m_;
//速さ
Vector > v_;
//加速度
Vector> a_;
//このオブジェクトにかかる力のバッファ
Vector > f_;
};
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
Circle c;
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
c.Update();
Vector p = c.GetPosition()*toPixel;
DrawCircle(p.x, p.y, 10,0xff0000,1);
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
(C++を初めて最初に書いたクラスなので、書き直したいところも結構ありますが、今のところ使えるので放置してます)
面倒なことをしていると感じられる方もいるかもしれませんが、やってること自体は極めて単純です
ニュートンの運動方程式
ma = F
を再現しています。
Fは力ですが、この場合重力、すなわち
重力加速度x質量
の値が毎フレーム与えられています
次に毎フレームごとに円の位置情報を更新します
まずは加速度を求めます
a = m/F
次に求めた加速度x時間を速度に足します
v += a*dt
そして位置に速度x時間を加えます
s += v*dt;
以上です。
あとは表示するだけという感じですね
わざわざ質量x重力加速度をしてからまた質量で割っているのは、あとあと楽になりそうな予感がしたからです
確信はありません。単純に予想と直観ですね。
敢えて言うならば、ほかに力が加わった場合、AddForceを外部から呼び出せば簡単に力の合成ができるからです。
さて非常につまんないので、気が向いたらもうちょっとましな奴を考えてみます。
ピンボールくらいまではすぐ行けそうな予感。
変形とかはどうかな~。アイディアはあるけれど実践できるかどうか。
摩擦とかが意外と大変そうな予感。いろいろと試さなければ。
プロジェクトをさらしてみます