X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 143 (tree) |
---|---|
Zeit | 2016-08-23 01:34:08 |
Autor | xops-mikan |
円柱とレイの当たり判定が、特定の角度で正しく行われないバグの修正。(弾と人の当たり判定に影響があった)
@@ -1124,6 +1124,7 @@ | ||
1124 | 1124 | { |
1125 | 1125 | float x, z, d; |
1126 | 1126 | float cMinDist, cRayDist, cRDist; |
1127 | + float RayXZ_min, RayXZ_max; | |
1127 | 1128 | float Ray_min[2]; |
1128 | 1129 | float Ray_max[2]; |
1129 | 1130 | float Ray_tmin, Ray_tmax; |
@@ -1148,10 +1149,10 @@ | ||
1148 | 1149 | cRDist = sqrt(c_r*c_r - cMinDist*cMinDist); //(点半径から)点に最も近づく距離 |
1149 | 1150 | |
1150 | 1151 | if( d < c_r ){ |
1151 | - Ray_min[0] = 0; //始点が円の中なら距離ゼロ | |
1152 | + RayXZ_min = 0; //始点が円の中なら距離ゼロ | |
1152 | 1153 | } |
1153 | 1154 | else{ |
1154 | - Ray_min[0] = cRayDist - cRDist; //レイ視点最短 - 半径最短 = レイ視点から半径までの最短 | |
1155 | + RayXZ_min = cRayDist - cRDist; //レイ視点最短 - 半径最短 = レイ視点から半径までの最短 | |
1155 | 1156 | } |
1156 | 1157 | |
1157 | 1158 | //点とレイ終点の距離 |
@@ -1160,13 +1161,18 @@ | ||
1160 | 1161 | d = sqrt(x*x + z*z); |
1161 | 1162 | |
1162 | 1163 | if( d < c_r ){ |
1163 | - Ray_max[0] = maxDist; //終点が円の中なら最大距離 | |
1164 | + RayXZ_max = maxDist; //終点が円の中なら最大距離 | |
1164 | 1165 | } |
1165 | 1166 | else{ |
1166 | - Ray_max[0] = cRayDist + cRDist; | |
1167 | + RayXZ_max = cRayDist + cRDist; | |
1167 | 1168 | } |
1168 | 1169 | |
1170 | + //Y軸と比べる前に、Y軸と比較できるよう変換 (底辺の値を斜辺へ変換) | |
1171 | + float Ray_ry = atan2(RayDir_y, sqrt(RayDir_x*RayDir_x + RayDir_z*RayDir_z)); | |
1172 | + Ray_min[0] = RayXZ_min / cos(Ray_ry); | |
1173 | + Ray_max[0] = RayXZ_max / cos(Ray_ry); | |
1169 | 1174 | |
1175 | + | |
1170 | 1176 | //Y軸のみAABBと同様の処理 |
1171 | 1177 | |
1172 | 1178 | if( ( (RayPos_y < c_y)||((c_y+c_h) < RayPos_y) )&&(RayDir_y == 0.0f) ){ |