• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision68 (tree)
Zeit2015-03-13 06:01:39
Autorxops-mikan

Log Message

当たり判定関数のバグを修正 (人とマップや、銃弾と人の当たり判定に影響があった)

Ändern Zusammenfassung

Diff

--- trunk/collision.cpp (revision 67)
+++ trunk/collision.cpp (revision 68)
@@ -337,9 +337,9 @@
337337
338338
339339 //外積
340- vx2 = ((data.y[ vID[2] ] - data.y[ vID[1] ]) * (z - data.z[ vID[1] ])) - ((y - data.y[ vID[1] ]) * (data.z[ vID[2] ] - data.z[ vID[0] ]));
341- vy2 = ((data.z[ vID[2] ] - data.z[ vID[1] ]) * (x - data.x[ vID[1] ])) - ((z - data.z[ vID[1] ]) * (data.x[ vID[2] ] - data.x[ vID[0] ]));
342- vz2 = ((data.x[ vID[2] ] - data.x[ vID[1] ]) * (y - data.y[ vID[1] ])) - ((x - data.x[ vID[1] ]) * (data.y[ vID[2] ] - data.y[ vID[0] ]));
340+ vx2 = ((data.y[ vID[2] ] - data.y[ vID[1] ]) * (z - data.z[ vID[1] ])) - ((y - data.y[ vID[1] ]) * (data.z[ vID[2] ] - data.z[ vID[1] ]));
341+ vy2 = ((data.z[ vID[2] ] - data.z[ vID[1] ]) * (x - data.x[ vID[1] ])) - ((z - data.z[ vID[1] ]) * (data.x[ vID[2] ] - data.x[ vID[1] ]));
342+ vz2 = ((data.x[ vID[2] ] - data.x[ vID[1] ]) * (y - data.y[ vID[1] ])) - ((x - data.x[ vID[1] ]) * (data.y[ vID[2] ] - data.y[ vID[1] ]));
343343
344344 //内積
345345 d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出
@@ -1009,13 +1009,8 @@
10091009
10101010 //X・Y・Zの3軸分の処理
10111011 for(int axis=0; axis<3; axis++){
1012- if( (box_min[axis] <= RayPos[axis])&&(RayPos[axis] <= box_max[axis]) ){
1013- //内側に入っていれば、そのまま軸の情報として記録
1014- Ray_min[axis] = RayPos[axis];
1015- Ray_max[axis] = RayPos[axis];
1016- }
1017- else if( RayDir[axis] == 0.0f ){
1018- //(内側に入っていないのに)ベクトルの方向が 0 なら、既にAABBの外
1012+ if( ( (RayPos[axis] < box_min[axis])||(box_max[axis] < RayPos[axis]) )&&(RayDir[axis] == 0.0f) ){
1013+ //内側に入っていないのに ベクトルの方向が 0 なら、既にAABBの外
10191014 return false;
10201015 }
10211016 else{
@@ -1026,10 +1021,6 @@
10261021 t1 = (box_min[axis] - RayPos[axis]) / RayDir[axis];
10271022 t2 = (box_max[axis] - RayPos[axis]) / RayDir[axis];
10281023
1029- //距離がマイナス(=ベクトル逆方向)ならAABBとは あたらない
1030- if( t1 < 0.0f ){ return false; }
1031- if( t2 < 0.0f ){ return false; }
1032-
10331024 //交点までの距離が最小・最大で逆なら、入れ替える。
10341025 if( t1 > t2 ){
10351026 float temp = t1; t1 = t2; t2 = temp;
@@ -1038,6 +1029,15 @@
10381029 //軸の情報として記録
10391030 Ray_min[axis] = t1;
10401031 Ray_max[axis] = t2;
1032+
1033+ if( (box_min[axis] <= RayPos[axis])&&(RayPos[axis] <= box_max[axis]) ){
1034+ //内側に入っていれば、そのまま軸の情報として記録
1035+ Ray_min[axis] = 0.0f;
1036+ }
1037+
1038+ //距離がマイナス(=ベクトル逆方向)ならAABBとは あたらない
1039+ if( Ray_min[axis] < 0.0f ){ return false; }
1040+ if( Ray_max[axis] < 0.0f ){ return false; }
10411041 }
10421042 }
10431043
@@ -1044,10 +1044,10 @@
10441044 //各軸で、最も遠い‘最小距離’と最も近い‘最大距離’を算出
10451045 Ray_tmin = Ray_min[0];
10461046 Ray_tmax = Ray_max[0];
1047- if( Ray_tmin > Ray_min[1] ){ Ray_tmin = Ray_min[1]; }
1048- if( Ray_tmax < Ray_max[1] ){ Ray_tmax = Ray_max[1]; }
1049- if( Ray_tmin > Ray_min[2] ){ Ray_tmin = Ray_min[2]; }
1050- if( Ray_tmax < Ray_max[2] ){ Ray_tmax = Ray_max[2]; }
1047+ if( Ray_tmin < Ray_min[1] ){ Ray_tmin = Ray_min[1]; }
1048+ if( Ray_tmax > Ray_max[1] ){ Ray_tmax = Ray_max[1]; }
1049+ if( Ray_tmin < Ray_min[2] ){ Ray_tmin = Ray_min[2]; }
1050+ if( Ray_tmax > Ray_max[2] ){ Ray_tmax = Ray_max[2]; }
10511051
10521052 //最小距離と最大距離の関係が正しければ〜
10531053 if( (Ray_tmax - Ray_tmin) > 0 ){