X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
Revision | 142 (tree) |
---|---|
Zeit | 2016-08-21 14:01:20 |
Autor | xops-mikan |
人とマップ(歪んだブロック)との当たり判定を改善
@@ -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] ])); |