X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 142 (tree) |
|---|---|
| Time | 2016-08-21 14:01:20 |
| Author | |
人とマップ(歪んだブロック)との当たり判定を改善
| @@ -55,6 +55,9 @@ | ||
| 55 | 55 | int textureID; //!< textureID |
| 56 | 56 | float u[4]; //!< textureUV-U |
| 57 | 57 | float v[4]; //!< textureUV-V |
| 58 | + float center_x; //!< center | |
| 59 | + float center_y; //!< center | |
| 60 | + float center_z; //!< center | |
| 58 | 61 | float vx; //!< normal vector |
| 59 | 62 | float vy; //!< normal vector |
| 60 | 63 | float vz; //!< normal vector |
| @@ -253,10 +253,10 @@ | ||
| 253 | 253 | |
| 254 | 254 | blockdata->Getdata(&bdata, id); |
| 255 | 255 | |
| 256 | - //面の中心を基準点に、座標のベクトルを求める | |
| 257 | - vx = cbdata[id].polygon_center_x[face] - x; | |
| 258 | - vy = cbdata[id].polygon_center_y[face] - y; | |
| 259 | - vz = cbdata[id].polygon_center_z[face] - z; | |
| 256 | + //面の中心を基準点に、座標のベクトルを求める ※正確な中心点を使うこと | |
| 257 | + vx = bdata.material[face].center_x - x; | |
| 258 | + vy = bdata.material[face].center_y - y; | |
| 259 | + vz = bdata.material[face].center_z - z; | |
| 260 | 260 | |
| 261 | 261 | //内積 |
| 262 | 262 | d = bdata.material[face].vx*vx + bdata.material[face].vy*vy + bdata.material[face].vz*vz; |
| @@ -330,10 +330,10 @@ | ||
| 330 | 330 | return false; //面とレイが平行か、面に対してレイが逆向き |
| 331 | 331 | } |
| 332 | 332 | |
| 333 | - //面の中心を基準点に、座標のベクトルを求める | |
| 334 | - vx1 = RayPos_x - cbdata[blockid].polygon_center_x[face]; | |
| 335 | - vy1 = RayPos_y - cbdata[blockid].polygon_center_y[face]; | |
| 336 | - vz1 = RayPos_z - cbdata[blockid].polygon_center_z[face]; | |
| 333 | + //面の中心を基準点に、座標のベクトルを求める ※正確な中心点を使うこと | |
| 334 | + vx1 = RayPos_x - data.material[face].center_x; | |
| 335 | + vy1 = RayPos_y - data.material[face].center_y; | |
| 336 | + vz1 = RayPos_z - data.material[face].center_z; | |
| 337 | 337 | |
| 338 | 338 | //内積 |
| 339 | 339 | d2 = data.material[face].vx*vx1 + data.material[face].vy*vy1 + data.material[face].vz*vz1; //面までの最短距離が求まる |
| @@ -355,9 +355,9 @@ | ||
| 355 | 355 | // 面を形成する各4辺との位置関係を算出し、面の法線と比較する。 |
| 356 | 356 | |
| 357 | 357 | //外積 |
| 358 | - vx2 = ((cbdata[blockid].y[ vID[1] ] - cbdata[blockid].y[ vID[0] ]) * (z - cbdata[blockid].z[ vID[0] ])) - ((y - cbdata[blockid].y[ vID[0] ]) * (cbdata[blockid].z[ vID[1] ] - cbdata[blockid].z[ vID[0] ])); | |
| 359 | - vy2 = ((cbdata[blockid].z[ vID[1] ] - cbdata[blockid].z[ vID[0] ]) * (x - cbdata[blockid].x[ vID[0] ])) - ((z - cbdata[blockid].z[ vID[0] ]) * (cbdata[blockid].x[ vID[1] ] - cbdata[blockid].x[ vID[0] ])); | |
| 360 | - vz2 = ((cbdata[blockid].x[ vID[1] ] - cbdata[blockid].x[ vID[0] ]) * (y - cbdata[blockid].y[ vID[0] ])) - ((x - cbdata[blockid].x[ vID[0] ]) * (cbdata[blockid].y[ vID[1] ] - cbdata[blockid].y[ vID[0] ])); | |
| 358 | + vx2 = ((data.y[ vID[1] ] - data.y[ vID[0] ]) * (z - data.z[ vID[0] ])) - ((y - data.y[ vID[0] ]) * (data.z[ vID[1] ] - data.z[ vID[0] ])); | |
| 359 | + vy2 = ((data.z[ vID[1] ] - data.z[ vID[0] ]) * (x - data.x[ vID[0] ])) - ((z - data.z[ vID[0] ]) * (data.x[ vID[1] ] - data.x[ vID[0] ])); | |
| 360 | + vz2 = ((data.x[ vID[1] ] - data.x[ vID[0] ]) * (y - data.y[ vID[0] ])) - ((x - data.x[ vID[0] ]) * (data.y[ vID[1] ] - data.y[ vID[0] ])); | |
| 361 | 361 | |
| 362 | 362 | //内積 |
| 363 | 363 | d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出 |
| @@ -368,9 +368,9 @@ | ||
| 368 | 368 | |
| 369 | 369 | |
| 370 | 370 | //外積 |
| 371 | - vx2 = ((cbdata[blockid].y[ vID[2] ] - cbdata[blockid].y[ vID[1] ]) * (z - cbdata[blockid].z[ vID[1] ])) - ((y - cbdata[blockid].y[ vID[1] ]) * (cbdata[blockid].z[ vID[2] ] - cbdata[blockid].z[ vID[1] ])); | |
| 372 | - vy2 = ((cbdata[blockid].z[ vID[2] ] - cbdata[blockid].z[ vID[1] ]) * (x - cbdata[blockid].x[ vID[1] ])) - ((z - cbdata[blockid].z[ vID[1] ]) * (cbdata[blockid].x[ vID[2] ] - cbdata[blockid].x[ vID[1] ])); | |
| 373 | - vz2 = ((cbdata[blockid].x[ vID[2] ] - cbdata[blockid].x[ vID[1] ]) * (y - cbdata[blockid].y[ vID[1] ])) - ((x - cbdata[blockid].x[ vID[1] ]) * (cbdata[blockid].y[ vID[2] ] - cbdata[blockid].y[ vID[1] ])); | |
| 371 | + 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] ])); | |
| 372 | + 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] ])); | |
| 373 | + 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] ])); | |
| 374 | 374 | |
| 375 | 375 | //内積 |
| 376 | 376 | d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出 |
| @@ -381,9 +381,9 @@ | ||
| 381 | 381 | |
| 382 | 382 | |
| 383 | 383 | //外積 |
| 384 | - vx2 = ((cbdata[blockid].y[ vID[3] ] - cbdata[blockid].y[ vID[2] ]) * (z - cbdata[blockid].z[ vID[2] ])) - ((y - cbdata[blockid].y[ vID[2] ]) * (cbdata[blockid].z[ vID[3] ] - cbdata[blockid].z[ vID[2] ])); | |
| 385 | - vy2 = ((cbdata[blockid].z[ vID[3] ] - cbdata[blockid].z[ vID[2] ]) * (x - cbdata[blockid].x[ vID[2] ])) - ((z - cbdata[blockid].z[ vID[2] ]) * (cbdata[blockid].x[ vID[3] ] - cbdata[blockid].x[ vID[2] ])); | |
| 386 | - vz2 = ((cbdata[blockid].x[ vID[3] ] - cbdata[blockid].x[ vID[2] ]) * (y - cbdata[blockid].y[ vID[2] ])) - ((x - cbdata[blockid].x[ vID[2] ]) * (cbdata[blockid].y[ vID[3] ] - cbdata[blockid].y[ vID[2] ])); | |
| 384 | + vx2 = ((data.y[ vID[3] ] - data.y[ vID[2] ]) * (z - data.z[ vID[2] ])) - ((y - data.y[ vID[2] ]) * (data.z[ vID[3] ] - data.z[ vID[2] ])); | |
| 385 | + vy2 = ((data.z[ vID[3] ] - data.z[ vID[2] ]) * (x - data.x[ vID[2] ])) - ((z - data.z[ vID[2] ]) * (data.x[ vID[3] ] - data.x[ vID[2] ])); | |
| 386 | + vz2 = ((data.x[ vID[3] ] - data.x[ vID[2] ]) * (y - data.y[ vID[2] ])) - ((x - data.x[ vID[2] ]) * (data.y[ vID[3] ] - data.y[ vID[2] ])); | |
| 387 | 387 | |
| 388 | 388 | //内積 |
| 389 | 389 | d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出 |
| @@ -394,9 +394,9 @@ | ||
| 394 | 394 | |
| 395 | 395 | |
| 396 | 396 | //外積 |
| 397 | - vx2 = ((cbdata[blockid].y[ vID[0] ] - cbdata[blockid].y[ vID[3] ]) * (z - cbdata[blockid].z[ vID[3] ])) - ((y - cbdata[blockid].y[ vID[3] ]) * (cbdata[blockid].z[ vID[0] ] - cbdata[blockid].z[ vID[3] ])); | |
| 398 | - vy2 = ((cbdata[blockid].z[ vID[0] ] - cbdata[blockid].z[ vID[3] ]) * (x - cbdata[blockid].x[ vID[3] ])) - ((z - cbdata[blockid].z[ vID[3] ]) * (cbdata[blockid].x[ vID[0] ] - cbdata[blockid].x[ vID[3] ])); | |
| 399 | - vz2 = ((cbdata[blockid].x[ vID[0] ] - cbdata[blockid].x[ vID[3] ]) * (y - cbdata[blockid].y[ vID[3] ])) - ((x - cbdata[blockid].x[ vID[3] ]) * (cbdata[blockid].y[ vID[0] ] - cbdata[blockid].y[ vID[3] ])); | |
| 397 | + vx2 = ((data.y[ vID[0] ] - data.y[ vID[3] ]) * (z - data.z[ vID[3] ])) - ((y - data.y[ vID[3] ]) * (data.z[ vID[0] ] - data.z[ vID[3] ])); | |
| 398 | + vy2 = ((data.z[ vID[0] ] - data.z[ vID[3] ]) * (x - data.x[ vID[3] ])) - ((z - data.z[ vID[3] ]) * (data.x[ vID[0] ] - data.x[ vID[3] ])); | |
| 399 | + vz2 = ((data.x[ vID[0] ] - data.x[ vID[3] ]) * (y - data.y[ vID[3] ])) - ((x - data.x[ vID[3] ]) * (data.y[ vID[0] ] - data.y[ vID[3] ])); | |
| 400 | 400 | |
| 401 | 401 | //内積 |
| 402 | 402 | d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出 |
| @@ -1311,7 +1311,6 @@ | ||
| 1311 | 1311 | else{ |
| 1312 | 1312 | FallDistance = move_y; |
| 1313 | 1313 | } |
| 1314 | - FallDistance = move_y; | |
| 1315 | 1314 | move_y_flag = true; |
| 1316 | 1315 | } |
| 1317 | 1316 | else{ |
| @@ -1320,7 +1319,11 @@ | ||
| 1320 | 1319 | |
| 1321 | 1320 | //下方向へ当たり判定 |
| 1322 | 1321 | if( CollD->CheckALLBlockIntersectDummyRay(pos_x, pos_y + offset, pos_z, 0, -1, 0, NULL, NULL, &Dist, move_y*-1 + offset) == true ){ |
| 1323 | - CollD->CheckALLBlockIntersectRay(pos_x, pos_y + offset, pos_z, 0, -1, 0, &id, &face, &Dist, move_y + offset); | |
| 1322 | + if( CollD->CheckALLBlockIntersectRay(pos_x, pos_y + offset, pos_z, 0, -1, 0, &id, &face, &Dist, move_y*-1 + offset) == false ){ | |
| 1323 | + //もし、-DummyRay()関数ではブロックが見つかるのに -Ray()関数で見つからないなら、おそらくブロックが歪んでいる。 | |
| 1324 | + //とりあず適当な値で誤魔化し、微振動を防ぐ。 | |
| 1325 | + Dist = offset; | |
| 1326 | + } | |
| 1324 | 1327 | |
| 1325 | 1328 | if( Invincible == false ){ |
| 1326 | 1329 | //ダメージ計算 |
| @@ -203,6 +203,21 @@ | ||
| 203 | 203 | //ブロック頂点データの関連付けを取得 |
| 204 | 204 | blockdataface(j, vID, uvID); |
| 205 | 205 | |
| 206 | + //中心点初期化 | |
| 207 | + data[i].material[j].center_x = 0.0f; | |
| 208 | + data[i].material[j].center_y = 0.0f; | |
| 209 | + data[i].material[j].center_z = 0.0f; | |
| 210 | + | |
| 211 | + //4頂点の中心点を算出 | |
| 212 | + for(int k=0; k<4; k++){ | |
| 213 | + data[i].material[j].center_x += data[i].x[ vID[k] ]; | |
| 214 | + data[i].material[j].center_y += data[i].y[ vID[k] ]; | |
| 215 | + data[i].material[j].center_z += data[i].z[ vID[k] ]; | |
| 216 | + } | |
| 217 | + data[i].material[j].center_x /= 4; | |
| 218 | + data[i].material[j].center_y /= 4; | |
| 219 | + data[i].material[j].center_z /= 4; | |
| 220 | + | |
| 206 | 221 | //面の法線(ベクトル)と、その長さを求める |
| 207 | 222 | xs1 = ((data[i].y[ vID[3] ] - data[i].y[ vID[2] ]) * (data[i].z[ vID[0] ] - data[i].z[ vID[2] ])) - ((data[i].y[ vID[0] ] - data[i].y[ vID[2] ]) * (data[i].z[ vID[3] ] - data[i].z[ vID[2] ])); |
| 208 | 223 | ys1 = ((data[i].z[ vID[3] ] - data[i].z[ vID[2] ]) * (data[i].x[ vID[0] ] - data[i].x[ vID[2] ])) - ((data[i].z[ vID[0] ] - data[i].z[ vID[2] ]) * (data[i].x[ vID[3] ] - data[i].x[ vID[2] ])); |