X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 68 (tree) |
---|---|
Zeit | 2015-03-13 06:01:39 |
Autor | xops-mikan |
当たり判定関数のバグを修正 (人とマップや、銃弾と人の当たり判定に影響があった)
@@ -337,9 +337,9 @@ | ||
337 | 337 | |
338 | 338 | |
339 | 339 | //外積 |
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] ])); | |
343 | 343 | |
344 | 344 | //内積 |
345 | 345 | d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出 |
@@ -1009,13 +1009,8 @@ | ||
1009 | 1009 | |
1010 | 1010 | //X・Y・Zの3軸分の処理 |
1011 | 1011 | 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の外 | |
1019 | 1014 | return false; |
1020 | 1015 | } |
1021 | 1016 | else{ |
@@ -1026,10 +1021,6 @@ | ||
1026 | 1021 | t1 = (box_min[axis] - RayPos[axis]) / RayDir[axis]; |
1027 | 1022 | t2 = (box_max[axis] - RayPos[axis]) / RayDir[axis]; |
1028 | 1023 | |
1029 | - //距離がマイナス(=ベクトル逆方向)ならAABBとは あたらない | |
1030 | - if( t1 < 0.0f ){ return false; } | |
1031 | - if( t2 < 0.0f ){ return false; } | |
1032 | - | |
1033 | 1024 | //交点までの距離が最小・最大で逆なら、入れ替える。 |
1034 | 1025 | if( t1 > t2 ){ |
1035 | 1026 | float temp = t1; t1 = t2; t2 = temp; |
@@ -1038,6 +1029,15 @@ | ||
1038 | 1029 | //軸の情報として記録 |
1039 | 1030 | Ray_min[axis] = t1; |
1040 | 1031 | 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; } | |
1041 | 1041 | } |
1042 | 1042 | } |
1043 | 1043 |
@@ -1044,10 +1044,10 @@ | ||
1044 | 1044 | //各軸で、最も遠い‘最小距離’と最も近い‘最大距離’を算出 |
1045 | 1045 | Ray_tmin = Ray_min[0]; |
1046 | 1046 | 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]; } | |
1051 | 1051 | |
1052 | 1052 | //最小距離と最大距離の関係が正しければ〜 |
1053 | 1053 | if( (Ray_tmax - Ray_tmin) > 0 ){ |