Violet Vreath is Shooter Game for Windows XP+(個人制作シューティングゲーム)
Revision | e939515119644151f58c4107c8efccce5ef42c49 (tree) |
---|---|
Zeit | 2022-05-22 19:54:07 |
Autor | gecchi <gecchi@boch...> |
Commiter | gecchi |
座標計算精度だけを上げようと色々頑張ったが、結局もとに戻った・・・
@@ -8,12 +8,13 @@ | ||
8 | 8 | namespace GgafDx { |
9 | 9 | |
10 | 10 | /** |
11 | - * 単位球と、単位ベクトルの座標の関係を保持するクラスです。 . | |
11 | + * 単位球と、単位ベクトルの座標のマッピング . | |
12 | 12 | * 方向ベクトルからZ軸回転角とY軸回転角、逆にZ軸回転角とY軸回転角から方向ベクトルの相互変換を可能とするために設計。<BR> |
13 | 13 | * 但し保持されている範囲は単位球の、x≧0 y≧0 z≧0 の範囲の方向ベクトルだけです。(1/8球分のみ)<BR> |
14 | 14 | * 【補足】<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> | |
17 | 18 | */ |
18 | 19 | class SphereRadiusVectors : public GgafCore::Object { |
19 | 20 | public: |
@@ -29,9 +30,7 @@ public: | ||
29 | 30 | }; |
30 | 31 | |
31 | 32 | 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; | |
35 | 34 | |
36 | 35 | public: |
37 | 36 | SphereRadiusVectors(); |
@@ -58,8 +58,8 @@ public: | ||
58 | 58 | static double RAD[]; |
59 | 59 | /** |
60 | 60 | * [傾き] → 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] となる。 | |
63 | 63 | */ |
64 | 64 | static angle SLANT2ANG[]; |
65 | 65 | /** |
@@ -1,31 +1,39 @@ | ||
1 | 1 | #include "jp/ggaf/dx/util/SphereRadiusVectors.h" |
2 | 2 | |
3 | +#include "jp/ggaf/dx/util/Util.h" | |
4 | + | |
3 | 5 | #include <math.h> |
4 | 6 | |
5 | 7 | using namespace GgafDx; |
6 | 8 | |
7 | 9 | 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; | |
10 | 12 | double radRotAxisZ, radRotAxisY; |
13 | + | |
11 | 14 | for (s_ang faceAxisZ = 0; faceAxisZ <= D90SANG; faceAxisZ++) { |
12 | 15 | //XY平面上の球表面の点を求める。 |
13 | 16 | radRotAxisZ = (((PI * 2.0) * faceAxisZ) / D360SANG) ; |
14 | 17 | xXY = cos(radRotAxisZ); |
15 | 18 | yXY = sin(radRotAxisZ); |
16 | - n_yXY = yXY * 10000000.0; | |
19 | + n_y = yXY * 10000000.0; | |
17 | 20 | for (s_ang faceAxisY_rev = 0; faceAxisY_rev <= D90SANG; faceAxisY_rev++) { |
18 | 21 | //XY平面上の球表面の点を、Y軸回転する。 |
19 | - //注意:このY軸回転とは、計算の都合上、左手系Y軸回転の逆回転になります。 | |
22 | + //注意:このY軸回転は、計算の都合上、左手系Y軸回転の逆回転になります。 | |
20 | 23 | 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 | |
23 | 29 | 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; | |
29 | 37 | } |
30 | 38 | } |
31 | 39 | } |
@@ -35,10 +43,10 @@ void SphereRadiusVectors::getFaceAngClosely(uint32_t prm_x, | ||
35 | 43 | uint32_t prm_z, |
36 | 44 | s_ang& out_faceZ, |
37 | 45 | 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 | + } | |
42 | 50 | std::map<uint32_t, RzRy>* pVz_RzRy = &(ite_begin_vy->second); |
43 | 51 | std::map<uint32_t, RzRy>::iterator ite_begin_vz = pVz_RzRy->upper_bound(prm_z); |
44 | 52 | if (ite_begin_vz != pVz_RzRy->begin()) { |
@@ -47,20 +55,8 @@ void SphereRadiusVectors::getFaceAngClosely(uint32_t prm_x, | ||
47 | 55 | RzRy* pRzRy = &(ite_begin_vz->second); |
48 | 56 | out_faceZ = pRzRy->rz; |
49 | 57 | 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) | |
63 | 58 | |
59 | +} | |
64 | 60 | |
65 | 61 | SphereRadiusVectors::~SphereRadiusVectors() { |
66 | 62 | } |
@@ -176,12 +176,12 @@ void Util::init() { | ||
176 | 176 | Util::SLANT2ANG[i] = (angle)( (45000-1) + (1.0*d)/(1.0*d_index_slant) ); |
177 | 177 | } |
178 | 178 | 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 | +// | |
185 | 185 | double nvx,nvy,nvz; |
186 | 186 | double prj_rad_xy,prj_rad_xz, prj_rad_zy, prj_rad_zx; |
187 | 187 | s_ang rz, ry_rev; |
@@ -197,18 +197,11 @@ void Util::init() { | ||
197 | 197 | |
198 | 198 | //方向ベクトルを作成 |
199 | 199 | //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) | |
205 | 200 | double t = 1 / sqrt(vx * vx + vy * vy + vz * vz); |
206 | - //求めた t を (1) に代入し (X,Y,Z) を求める。 | |
207 | 201 | nvx = t * vx; |
208 | 202 | nvy = t * vy; |
209 | 203 | nvz = t * vz; |
210 | - //convVectorToRzRy((float)nvx,(float)nvy,(float)nvz,rz,ry,30); | |
211 | - //単位ベクトルからRxRyを求める | |
204 | + //単位ベクトルからRzRy(逆回転)を求める | |
212 | 205 | Util::_srv.getFaceAngClosely( |
213 | 206 | (uint32_t)(nvx*10000000), |
214 | 207 | (uint32_t)(nvy*10000000), |
@@ -218,8 +211,7 @@ void Util::init() { | ||
218 | 211 | ); |
219 | 212 | Util::PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz] = rz*SANG_RATE; |
220 | 213 | 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]<<")"); | |
223 | 215 | } |
224 | 216 | Sleep(2); |
225 | 217 | } |
@@ -238,8 +230,7 @@ void Util::init() { | ||
238 | 230 | nvx = t * vx; |
239 | 231 | nvy = t * vy; |
240 | 232 | nvz = t * vz; |
241 | - //convVectorToRzRy((float)nvx,(float)nvy,(float)nvz,rz,ry,30); | |
242 | - //単位ベクトルからRxRyを求める | |
233 | + //単位ベクトルからRzRy(逆回転)を求める | |
243 | 234 | Util::_srv.getFaceAngClosely( |
244 | 235 | (uint32_t)(nvx*10000000), |
245 | 236 | (uint32_t)(nvy*10000000), |
@@ -255,8 +246,6 @@ void Util::init() { | ||
255 | 246 | //これは上で求めたry_revをD90ANGから引いた値である。 |
256 | 247 | Util::PROJANG_ZY_ZX_TO_ROTANG_x_REV[prj_ang_zy][prj_ang_zx] = rx_rev*SANG_RATE; |
257 | 248 | 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]<<")"); | |
260 | 249 | } |
261 | 250 | Sleep(2); |
262 | 251 | } |
@@ -282,23 +271,24 @@ void Util::init() { | ||
282 | 271 | } |
283 | 272 | Util::_was_GgafDx_Util_inited_flg = true; |
284 | 273 | |
285 | - | |
286 | 274 | // _TRACE_("開始!"); |
287 | 275 | // for (s_ang prm_rz = 0; prm_rz <= D90ANG; prm_rz+=100) { |
288 | 276 | // 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 | +// } | |
302 | 292 | // } |
303 | 293 | // } |
304 | 294 | // } |
@@ -13,15 +13,15 @@ FixedVelocityCurveVecVehicleLeader::FixedVelocityCurveVecVehicleLeader(CurveManu | ||
13 | 13 | VehicleLeader(prm_pManufacture, prm_pVecVehicle_target->_pActor) { |
14 | 14 | _pVecVehicle_target = prm_pVecVehicle_target; |
15 | 15 | _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; | |
18 | 18 | _point_index = -1;//最初は始点[0]に向かうので、始点前の-1になる。 |
19 | 19 | } |
20 | 20 | |
21 | 21 | void FixedVelocityCurveVecVehicleLeader::restart() { |
22 | 22 | 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; | |
25 | 25 | _point_index = -1;//最初は始点[0]に向かうので、始点前の-1になる。 |
26 | 26 | } |
27 | 27 |
@@ -75,7 +75,7 @@ void SmpActor2::processBehavior() { | ||
75 | 75 | pGeoVehicle->setAcceByVc(PX_C(0.01), PX_C(0.02), PX_C(0)); |
76 | 76 | |
77 | 77 | } |
78 | - _TRACE_("x,y,z="<<_x<<", "<<_y<<", "<<_z); | |
78 | +// _TRACE_("x,y,z="<<_x<<", "<<_y<<", "<<_z); | |
79 | 79 | pGeoVehicle->behave(); |
80 | 80 | getVecVehicle()->behave(); |
81 | 81 | } |