X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 143 (tree) |
|---|---|
| Time | 2016-08-23 01:34:08 |
| Author | |
円柱とレイの当たり判定が、特定の角度で正しく行われないバグの修正。(弾と人の当たり判定に影響があった)
| @@ -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) ){ |