OpenGL ESで斜面との衝突

というわけで物理シミュレータ。
法線ベクトルを使うと床との衝突がうまくいくということで、
斜面にボールを落としてみた。


割とうまくいってるんじゃないだろうか。


斜面と衝突したよという判定は球の中心から斜面までの距離を求めて、
その距離が球の半径以下なら衝突としてる。
ここでも法線ベクトルが活躍。


ソースは衝突の判定をしてる部分だけ。
normalが法線ベクトルね。動画は反発係数を変えたのを2つ。

そんなわけで以下動作画面とソース。

動作画面

反発係数1.0
http://screencast.com/t/d1eAlq6vj
反発係数0.5
http://screencast.com/t/AId3y7GH

ソース

public void test(PhysicsBall m) {
	double dx = m.getX() - getX();
	double dy = m.getY() - getY();
	double dz = m.getZ() - getZ();
	double d = normal.x * dx + normal.y * dy + normal.z * dz;

	if( Math.abs(d) <= m.getRadius() ) {
		double e = (1 + elastic) * (normal.x * m.velocity.x + 
								normal.y * m.velocity.y + 
								normal.x * m.velocity.z);
		
		m.velocity.x -= normal.x * e;
		m.velocity.y -= normal.y * e;
		m.velocity.z -= normal.z * e;
		int r = m.getRadius();
		m.translate((int)(r * normal.x), (int)(r * normal.y), (int)(r * normal.z));
	}
}