• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqtwindows誰得cocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

Violet Vreath is Shooter Game for Windows XP+(個人制作シューティングゲーム)


Commit MetaInfo

修订版e939515119644151f58c4107c8efccce5ef42c49 (tree)
时间2022-05-22 19:54:07
作者gecchi <gecchi@boch...>
Commitergecchi

Log Message

座標計算精度だけを上げようと色々頑張ったが、結局もとに戻った・・・

更改概述

差异

--- a/GgafDx/include/jp/ggaf/dx/util/SphereRadiusVectors.h
+++ b/GgafDx/include/jp/ggaf/dx/util/SphereRadiusVectors.h
@@ -8,12 +8,13 @@
88 namespace GgafDx {
99
1010 /**
11- * 単位球と、単位ベクトルの座標の関係を保持するクラスです。 .
11+ * 単位球と、単位ベクトルの座標のマッピング .
1212 * 方向ベクトルからZ軸回転角とY軸回転角、逆にZ軸回転角とY軸回転角から方向ベクトルの相互変換を可能とするために設計。<BR>
1313 * 但し保持されている範囲は単位球の、x≧0 y≧0 z≧0 の範囲の方向ベクトルだけです。(1/8球分のみ)<BR>
1414 * 【補足】<BR>
15- * 保持しているベクトルの各要(X,Y,Z)の単位(uint16_t)は、長さ1 が 10000 に相当する整数になっています。<BR>
16- * 角度の単位(s_ang)は、1度 が 10 に相当します。直角は 900 になります。angle値(1度が1000)と混在しないように注意<BR>
15+ * 保持しているベクトルの各要(X,Y,Z)の単位(uint32_t)は、長さ1 が 10000000 に相当する整数になっています。<BR>
16+ * 角度の単位(s_ang)は、弧度法 1度 が 10 に相当します。直角は 900 になります。
17+ * angle値(弧度法1度が1000)と混在しないように注意<BR>
1718 */
1819 class SphereRadiusVectors : public GgafCore::Object {
1920 public:
@@ -29,9 +30,7 @@ public:
2930 };
3031
3132 SrVec _sr_vec[(D90SANG + 1)][(D90SANG+1)];
32- std::map<uint32_t, std::map<uint32_t, RzRy> > _vy_vz_rzry;
33-
34-
33+ std::map<uint32_t, std::map<uint32_t, RzRy> > _vy_vz_2_rz_ry_rev;
3534
3635 public:
3736 SphereRadiusVectors();
--- a/GgafDx/include/jp/ggaf/dx/util/Util.h
+++ b/GgafDx/include/jp/ggaf/dx/util/Util.h
@@ -58,8 +58,8 @@ public:
5858 static double RAD[];
5959 /**
6060 * [傾き] → angle値変換テーブル
61- * 要素番号範囲:直線 y = ax 傾き a の 10000 倍の整数精度が要素番号となる。
62- * 直線 y = ax の成す角のアングル値は SLANT2ANG[(int)a*10000] となる。
61+ * 要素番号範囲:直線 y = ax 傾き a の 100000 倍の整数精度が要素番号となる。
62+ * 直線 y = ax の成す角のアングル値は SLANT2ANG[(int)a*100000] となる。
6363 */
6464 static angle SLANT2ANG[];
6565 /**
--- a/GgafDx/src/jp/ggaf/dx/util/SphereRadiusVectors.cpp
+++ b/GgafDx/src/jp/ggaf/dx/util/SphereRadiusVectors.cpp
@@ -1,31 +1,39 @@
11 #include "jp/ggaf/dx/util/SphereRadiusVectors.h"
22
3+#include "jp/ggaf/dx/util/Util.h"
4+
35 #include <math.h>
46
57 using namespace GgafDx;
68
79 SphereRadiusVectors::SphereRadiusVectors() : GgafCore::Object() {
8- uint32_t n_yXY, n_xXZ, n_zXZ;
9- double xXY, yXY;
10+ uint32_t n_y, n_x, n_z;
11+ double xXY, yXY, x, y, z;
1012 double radRotAxisZ, radRotAxisY;
13+
1114 for (s_ang faceAxisZ = 0; faceAxisZ <= D90SANG; faceAxisZ++) {
1215 //XY平面上の球表面の点を求める。
1316 radRotAxisZ = (((PI * 2.0) * faceAxisZ) / D360SANG) ;
1417 xXY = cos(radRotAxisZ);
1518 yXY = sin(radRotAxisZ);
16- n_yXY = yXY * 10000000.0;
19+ n_y = yXY * 10000000.0;
1720 for (s_ang faceAxisY_rev = 0; faceAxisY_rev <= D90SANG; faceAxisY_rev++) {
1821 //XY平面上の球表面の点を、Y軸回転する。
19- //注意:このY軸回転とは、計算の都合上、左手系Y軸回転の逆回転になります。
22+ //注意:このY軸回転は、計算の都合上、左手系Y軸回転の逆回転になります。
2023 radRotAxisY = (((PI * 2.0) * faceAxisY_rev) / D360SANG);
21- n_xXZ = xXY * cos(radRotAxisY) * 10000000.0;
22- n_zXZ = xXY * sin(radRotAxisY) * 10000000.0;
24+ x = xXY * cos(radRotAxisY);
25+ z = xXY * sin(radRotAxisY);
26+ n_x = x * 10000000.0;
27+ n_z = z * 10000000.0;
28+ //_sr_vec
2329 SrVec* pVec = &(_sr_vec[faceAxisZ][faceAxisY_rev]);
24- pVec->x = n_xXZ;
25- pVec->y = n_yXY;
26- pVec->z = n_zXZ;
27- _vy_vz_rzry[n_yXY][n_zXZ].rz = faceAxisZ;
28- _vy_vz_rzry[n_yXY][n_zXZ].ry = faceAxisY_rev;
30+ pVec->x = n_x;
31+ pVec->y = n_y;
32+ pVec->z = n_z;
33+
34+ //逆参照を設定
35+ _vy_vz_2_rz_ry_rev[n_y][n_z].rz = faceAxisZ;
36+ _vy_vz_2_rz_ry_rev[n_y][n_z].ry = faceAxisY_rev;
2937 }
3038 }
3139 }
@@ -35,10 +43,10 @@ void SphereRadiusVectors::getFaceAngClosely(uint32_t prm_x,
3543 uint32_t prm_z,
3644 s_ang& out_faceZ,
3745 s_ang& out_faceY_rev) {
38- std::map<uint32_t, std::map<uint32_t, RzRy> >::iterator ite_begin_vy = _vy_vz_rzry.lower_bound(prm_y);
39-// if (ite_begin_vy != _vy_vz_rzry.begin()) {
40-// ite_begin_vy--;
41-// }
46+ std::map<uint32_t, std::map<uint32_t, RzRy> >::iterator ite_begin_vy = _vy_vz_2_rz_ry_rev.lower_bound(prm_y);
47+ if (ite_begin_vy == _vy_vz_2_rz_ry_rev.end()) {
48+ ite_begin_vy--;
49+ }
4250 std::map<uint32_t, RzRy>* pVz_RzRy = &(ite_begin_vy->second);
4351 std::map<uint32_t, RzRy>::iterator ite_begin_vz = pVz_RzRy->upper_bound(prm_z);
4452 if (ite_begin_vz != pVz_RzRy->begin()) {
@@ -47,20 +55,8 @@ void SphereRadiusVectors::getFaceAngClosely(uint32_t prm_x,
4755 RzRy* pRzRy = &(ite_begin_vz->second);
4856 out_faceZ = pRzRy->rz;
4957 out_faceY_rev = pRzRy->ry;
50-}
51-
52-
53-//618175922 <DEBUG> [886][898]=(852,9997014,244320)
54-//618175922 <DEBUG> [886][899]=(426,9997014,244321)
55-//618175922 <DEBUG> [886][900]=(0,9997014,244321)
56-//
57-//
58-//618175921 <DEBUG> [886][809]=(38641,9997014,241246)
59-//618175921 <DEBUG> [886][810]=(38220,9997014,241313)
60-//618175921 <DEBUG> [886][811]=(37799,9997014,241380)
61-//
62-//618201586 <DEBUG> x (88600,81000) -> (88600,89700) ※(0.003822,0.999701,-0.0241313)
6358
59+}
6460
6561 SphereRadiusVectors::~SphereRadiusVectors() {
6662 }
--- a/GgafDx/src/jp/ggaf/dx/util/Util.cpp
+++ b/GgafDx/src/jp/ggaf/dx/util/Util.cpp
@@ -176,12 +176,12 @@ void Util::init() {
176176 Util::SLANT2ANG[i] = (angle)( (45000-1) + (1.0*d)/(1.0*d_index_slant) );
177177 }
178178 Sleep(10);
179- //<PROJ_ANG2ROT_ANG> (2009/10/20 経緯・・・速くするためなら何でもやってみよう)
180- //ある方向ベクトルから、XY平面、ZY平面に投影した時にできる軸との角(それぞれXY射影角、ZY射影角と呼ぶこととする)と、
181- //その方向ベクトルの単位ベクトルが指す単位球の緯度と経度(Z軸回転角、Y軸回転角)を紐つけることを目的とする。
182- //つまり、XY射影角、ZY射影角 → Z軸回転角、Y軸回転角 の読み替えを高速に行いたい
183- //XY射影角90度分 * ZY射影角90度分 を配列要素、値をZ軸回転角、Y軸回転角を値とする配列を構築。
184-
179+// //<PROJ_ANG2ROT_ANG> (2009/10/20 経緯・・・速くするためなら何でもやってみよう)
180+// //ある方向ベクトルから、XY平面、ZY平面に投影した時にできる軸との角(それぞれXY射影角、ZY射影角と呼ぶこととする)と、
181+// //その方向ベクトルの単位ベクトルが指す単位球の緯度と経度(Z軸回転角、Y軸回転角)を紐つけることを目的とする。
182+// //つまり、XY射影角、ZY射影角 → Z軸回転角、Y軸回転角 の読み替えを高速に行いたい
183+// //XY射影角90度分 * ZY射影角90度分 を配列要素、値をZ軸回転角、Y軸回転角を値とする配列を構築。
184+//
185185 double nvx,nvy,nvz;
186186 double prj_rad_xy,prj_rad_xz, prj_rad_zy, prj_rad_zx;
187187 s_ang rz, ry_rev;
@@ -197,18 +197,11 @@ void Util::init() {
197197
198198 //方向ベクトルを作成
199199 //vx,vy,vz を正規化する。
200- //求める単位ベクトルを (X,Y,Z) とすると (X,Y,Z) = t(vx,vy,vz)
201- //関係式 X=t*vx; Y=t*vy; Z=t*vz; ・・・ (1) を得る
202- //単位球は X^2 + Y^2 + Z^2 = 1 ・・・(2)
203- //(1)(2)を連立させて、t について解く。
204- //t = 1 / sqrt(vx^2 + vy^2 + vz^2)
205200 double t = 1 / sqrt(vx * vx + vy * vy + vz * vz);
206- //求めた t を (1) に代入し (X,Y,Z) を求める。
207201 nvx = t * vx;
208202 nvy = t * vy;
209203 nvz = t * vz;
210- //convVectorToRzRy((float)nvx,(float)nvy,(float)nvz,rz,ry,30);
211- //単位ベクトルからRxRyを求める
204+ //単位ベクトルからRzRy(逆回転)を求める
212205 Util::_srv.getFaceAngClosely(
213206 (uint32_t)(nvx*10000000),
214207 (uint32_t)(nvy*10000000),
@@ -218,8 +211,7 @@ void Util::init() {
218211 );
219212 Util::PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz] = rz*SANG_RATE;
220213 Util::PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz] = ry_rev*SANG_RATE;
221- //_TRACE_("["<<prj_ang_xy<<"]["<<prj_ang_xz<<"]=("<<PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz]<<","<<PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz]<<")");
222-
214+// _TRACE_("["<<prj_ang_xy<<"]["<<prj_ang_xz<<"]=("<<PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz]<<","<<PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz]<<")");
223215 }
224216 Sleep(2);
225217 }
@@ -238,8 +230,7 @@ void Util::init() {
238230 nvx = t * vx;
239231 nvy = t * vy;
240232 nvz = t * vz;
241- //convVectorToRzRy((float)nvx,(float)nvy,(float)nvz,rz,ry,30);
242- //単位ベクトルからRxRyを求める
233+ //単位ベクトルからRzRy(逆回転)を求める
243234 Util::_srv.getFaceAngClosely(
244235 (uint32_t)(nvx*10000000),
245236 (uint32_t)(nvy*10000000),
@@ -255,8 +246,6 @@ void Util::init() {
255246 //これは上で求めたry_revをD90ANGから引いた値である。
256247 Util::PROJANG_ZY_ZX_TO_ROTANG_x_REV[prj_ang_zy][prj_ang_zx] = rx_rev*SANG_RATE;
257248 Util::PROJANG_ZY_ZX_TO_ROTANG_y[prj_ang_zy][prj_ang_zx] = D90ANG - ry_rev*SANG_RATE;
258- //_TRACE_("PROJANG_ZY_ZX_TO_ROTANG_y["<<prj_ang_zy<<"]["<<prj_ang_zx<<"] = D90ANG - "<<ry_rev<<"*SANG_RATE = "<<PROJANG_ZY_ZX_TO_ROTANG_y[prj_ang_zy][prj_ang_zx]);
259- //_TRACE_("["<<prj_ang_xy<<"]["<<prj_ang_xz<<"]=("<<PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz]<<","<<PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz]<<")");
260249 }
261250 Sleep(2);
262251 }
@@ -282,23 +271,24 @@ void Util::init() {
282271 }
283272 Util::_was_GgafDx_Util_inited_flg = true;
284273
285-
286274 // _TRACE_("開始!");
287275 // for (s_ang prm_rz = 0; prm_rz <= D90ANG; prm_rz+=100) {
288276 // for (s_ang prm_ry = 0; prm_ry <= D90ANG; prm_ry+=100) {
289-// double out_nvx,out_nvy,out_nvz;
290-// Util::convRzRyToVector(prm_rz,
291-// prm_ry,
292-// out_nvx,
293-// out_nvy,
294-// out_nvz);
295-// angle out_rz,out_ry;
296-// Util::convVectorToRzRy(out_nvx, out_nvy, out_nvz, out_rz, out_ry);
297-// if (prm_rz == out_rz && prm_ry == out_ry) {
298-// _TRACE_N_("o");
299-// } else {
300-// _TRACE_N_("\n");
301-// _TRACE_("x ("<<prm_rz<<","<<prm_ry<<") -> ("<<out_rz<<","<<out_ry<<") ※("<<out_nvx<<","<<out_nvy<<","<<out_nvz<<")");
277+// if (prm_rz == 35400 && prm_ry == 83700) {
278+// double out_nvx,out_nvy,out_nvz;
279+// Util::convRzRyToVector(prm_rz,
280+// prm_ry,
281+// out_nvx,
282+// out_nvy,
283+// out_nvz);
284+// angle out_rz,out_ry;
285+// Util::convVectorToRzRy(out_nvx, out_nvy, out_nvz, out_rz, out_ry);
286+// if (prm_rz == out_rz && prm_ry == out_ry) {
287+// _TRACE_N_("o");
288+// } else {
289+// _TRACE_N_("\n");
290+// _TRACE_("x ("<<prm_rz<<","<<prm_ry<<") -> ("<<out_rz<<","<<out_ry<<") ※("<<out_nvx<<","<<out_nvy<<","<<out_nvz<<")");
291+// }
302292 // }
303293 // }
304294 // }
--- a/GgafDx/src/jp/ggaf/dx/util/curve/FixedVelocityCurveVecVehicleLeader.cpp
+++ b/GgafDx/src/jp/ggaf/dx/util/curve/FixedVelocityCurveVecVehicleLeader.cpp
@@ -13,15 +13,15 @@ FixedVelocityCurveVecVehicleLeader::FixedVelocityCurveVecVehicleLeader(CurveManu
1313 VehicleLeader(prm_pManufacture, prm_pVecVehicle_target->_pActor) {
1414 _pVecVehicle_target = prm_pVecVehicle_target;
1515 _pFixedVeloSplManuf = (FixedVelocityCurveManufacture*)prm_pManufacture;
16- _leadning_double_frames = 0.0f;
17- _double_frame_of_next = -0.00001f;
16+ _leadning_double_frames = 0.0;
17+ _double_frame_of_next = -0.00001;
1818 _point_index = -1;//最初は始点[0]に向かうので、始点前の-1になる。
1919 }
2020
2121 void FixedVelocityCurveVecVehicleLeader::restart() {
2222 VehicleLeader::restart();
23- _leadning_double_frames = 0.0f;
24- _double_frame_of_next = -0.00001f;
23+ _leadning_double_frames = 0.0;
24+ _double_frame_of_next = -0.00001;
2525 _point_index = -1;//最初は始点[0]に向かうので、始点前の-1になる。
2626 }
2727
--- a/Mogera/src/actor/SmpActor2.cpp
+++ b/Mogera/src/actor/SmpActor2.cpp
@@ -75,7 +75,7 @@ void SmpActor2::processBehavior() {
7575 pGeoVehicle->setAcceByVc(PX_C(0.01), PX_C(0.02), PX_C(0));
7676
7777 }
78- _TRACE_("x,y,z="<<_x<<", "<<_y<<", "<<_z);
78+// _TRACE_("x,y,z="<<_x<<", "<<_y<<", "<<_z);
7979 pGeoVehicle->behave();
8080 getVecVehicle()->behave();
8181 }