• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision142 (tree)
Zeit2016-08-21 14:01:20
Autorxops-mikan

Log Message

人とマップ(歪んだブロック)との当たり判定を改善

Ändern Zusammenfassung

Diff

--- trunk/datafile.h (revision 141)
+++ trunk/datafile.h (revision 142)
@@ -55,6 +55,9 @@
5555 int textureID; //!< textureID
5656 float u[4]; //!< textureUV-U
5757 float v[4]; //!< textureUV-V
58+ float center_x; //!< center
59+ float center_y; //!< center
60+ float center_z; //!< center
5861 float vx; //!< normal vector
5962 float vy; //!< normal vector
6063 float vz; //!< normal vector
--- trunk/collision.cpp (revision 141)
+++ trunk/collision.cpp (revision 142)
@@ -253,10 +253,10 @@
253253
254254 blockdata->Getdata(&bdata, id);
255255
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;
260260
261261 //内積
262262 d = bdata.material[face].vx*vx + bdata.material[face].vy*vy + bdata.material[face].vz*vz;
@@ -330,10 +330,10 @@
330330 return false; //面とレイが平行か、面に対してレイが逆向き
331331 }
332332
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;
337337
338338 //内積
339339 d2 = data.material[face].vx*vx1 + data.material[face].vy*vy1 + data.material[face].vz*vz1; //面までの最短距離が求まる
@@ -355,9 +355,9 @@
355355 //  面を形成する各4辺との位置関係を算出し、面の法線と比較する。
356356
357357 //外積
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] ]));
361361
362362 //内積
363363 d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出
@@ -368,9 +368,9 @@
368368
369369
370370 //外積
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] ]));
374374
375375 //内積
376376 d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出
@@ -381,9 +381,9 @@
381381
382382
383383 //外積
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] ]));
387387
388388 //内積
389389 d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出
@@ -394,9 +394,9 @@
394394
395395
396396 //外積
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] ]));
400400
401401 //内積
402402 d1 = data.material[face].vx*vx2 + data.material[face].vy*vy2 + data.material[face].vz*vz2; //ブロック面の法線との関係を算出
--- trunk/object.cpp (revision 141)
+++ trunk/object.cpp (revision 142)
@@ -1311,7 +1311,6 @@
13111311 else{
13121312 FallDistance = move_y;
13131313 }
1314- FallDistance = move_y;
13151314 move_y_flag = true;
13161315 }
13171316 else{
@@ -1320,7 +1319,11 @@
13201319
13211320 //下方向へ当たり判定
13221321 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+ }
13241327
13251328 if( Invincible == false ){
13261329 //ダメージ計算
--- trunk/datafile.cpp (revision 141)
+++ trunk/datafile.cpp (revision 142)
@@ -203,6 +203,21 @@
203203 //ブロック頂点データの関連付けを取得
204204 blockdataface(j, vID, uvID);
205205
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+
206221 //面の法線(ベクトル)と、その長さを求める
207222 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] ]));
208223 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] ]));