• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

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

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


Commit MetaInfo

修订版dc71630142ec14fdf2395cac7bd954d6dd4378a3 (tree)
时间2022-05-27 23:44:41
作者gecchi <gecchi@boch...>
Commitergecchi

Log Message

方向ベクトルから緯度経度に変換を、もうちょっと精度上げる&最適化できないものか・・・

更改概述

差异

--- a/GgafDx/include/jp/ggaf/dx/util/Util.h
+++ b/GgafDx/include/jp/ggaf/dx/util/Util.h
@@ -520,7 +520,7 @@ public:
520520 * @param out_ry [out]Y軸回転アングル値
521521 */
522522 static void convVectorToRzRy(coord vx, coord vy, coord vz, angle& out_rz, angle& out_ry);
523-
523+// static void convVectorToRzRy2(coord vx, coord vy, coord vz, angle& out_rz, angle& out_ry);
524524 /**
525525 * 原点(0,0,0) からパラメータ座標を向く方向ベクトル(単位ベクトル)に対応する「Z軸回転のアングル値」と「Y軸回転のアングル値」を取得 .
526526 * 本クラスの中核とも言うべきメソッドその1<BR>
--- a/GgafDx/src/jp/ggaf/dx/util/Util.cpp
+++ b/GgafDx/src/jp/ggaf/dx/util/Util.cpp
@@ -111,143 +111,144 @@ void Util::init() {
111111 Util::SIN[36000] = 0;
112112 Sleep(1);
113113 //<SLANT2ANG>
114- double rad;
115- double vx,vy,vz;
116- double slant;
117- int index_slant;
118- int index_slant_prev = -1;
119- int d_index_slant = 0;
120- //傾き 0.0 〜 1.0 の 角度を求め配列に収める。収める角度は100倍の整数。
121- //要素番号は、傾き*10000
122-
123- //ang=0 slant=0 vx,vy=1,0
124- //ang=1 slant=0.000174533 vx,vy=1,0.000174533
125- //ang=2 slant=0.000349066 vx,vy=1,0.000349066
126- //ang=3 slant=0.000523599 vx,vy=1,0.000523599
127- //ang=4 slant=0.000698132 vx,vy=1,0.000698132
128- //ang=5 slant=0.000872665 vx,vy=1,0.000872665
129-
130- // SLANT2ANG[0] = 0
131- // SLANT2ANG[1(.7)]〜 = 1000〜
132- // SLANT2ANG[3(.4)]〜 = 2000〜
133- // SLANT2ANG[5(.2)] = 3000〜
134- // SLANT2ANG[6(.9)] = 4000〜
135- // SLANT2ANG[8(.7)] = 5000〜 といった具合になるように調整
136-
137- //ang=4493 slant=0.99756 vx,vy=0.70797,0.706242
138- //ang=4494 slant=0.997908 vx,vy=0.707847,0.706366
139- //ang=4495 slant=0.998256 vx,vy=0.707724,0.706489
140- //ang=4496 slant=0.998605 vx,vy=0.7076,0.706613
141- //ang=4497 slant=0.998953 vx,vy=0.707477,0.706736
142- //ang=4498 slant=0.999302 vx,vy=0.707354,0.70686
143- //ang=4499 slant=0.999651 vx,vy=0.70723,0.706983
144- //ang=4500 slant=1 vx,vy=0.707107,0.707107 <--このあたりまで求める
145- //ang=4501 slant=1.00035 vx,vy=0.706983,0.70723
146- //ang=4502 slant=1.0007 vx,vy=0.70686,0.707354
147-
148- //2010/03/09 SLANT2ANGの精度10倍にアップ
149- //現在は要素番号は、傾き*100000
150- for (int ang = 0; ang <= 45000; ang++) {
151- rad = (PI * 2.0 * ang) / 360000;
152- vx = cos(rad);
153- vy = sin(rad);
154- if (ZEROd_EQ(vx)) {
155- slant = 0.0;
156- } else {
157- slant = vy / vx;
114+ {
115+ double rad;
116+ double vx,vy,vz;
117+ double slant;
118+ int index_slant;
119+ int index_slant_prev = -1;
120+ int d_index_slant = 0;
121+ //傾き 0.0 〜 1.0 の 角度を求め配列に収める。収める角度は100倍の整数。
122+ //要素番号は、傾き*10000
123+
124+ //ang=0 slant=0 vx,vy=1,0
125+ //ang=1 slant=0.000174533 vx,vy=1,0.000174533
126+ //ang=2 slant=0.000349066 vx,vy=1,0.000349066
127+ //ang=3 slant=0.000523599 vx,vy=1,0.000523599
128+ //ang=4 slant=0.000698132 vx,vy=1,0.000698132
129+ //ang=5 slant=0.000872665 vx,vy=1,0.000872665
130+
131+ // SLANT2ANG[0] = 0
132+ // SLANT2ANG[1(.7)]〜 = 1000〜
133+ // SLANT2ANG[3(.4)]〜 = 2000〜
134+ // SLANT2ANG[5(.2)] = 3000〜
135+ // SLANT2ANG[6(.9)] = 4000〜
136+ // SLANT2ANG[8(.7)] = 5000〜 といった具合になるように調整
137+
138+ //ang=4493 slant=0.99756 vx,vy=0.70797,0.706242
139+ //ang=4494 slant=0.997908 vx,vy=0.707847,0.706366
140+ //ang=4495 slant=0.998256 vx,vy=0.707724,0.706489
141+ //ang=4496 slant=0.998605 vx,vy=0.7076,0.706613
142+ //ang=4497 slant=0.998953 vx,vy=0.707477,0.706736
143+ //ang=4498 slant=0.999302 vx,vy=0.707354,0.70686
144+ //ang=4499 slant=0.999651 vx,vy=0.70723,0.706983
145+ //ang=4500 slant=1 vx,vy=0.707107,0.707107 <--このあたりまで求める
146+ //ang=4501 slant=1.00035 vx,vy=0.706983,0.70723
147+ //ang=4502 slant=1.0007 vx,vy=0.70686,0.707354
148+
149+ //2010/03/09 SLANT2ANGの精度10倍にアップ
150+ //現在は要素番号は、傾き*100000
151+ for (int ang = 0; ang <= 45000; ang++) {
152+ rad = (PI * 2.0 * ang) / 360000;
153+ vx = cos(rad);
154+ vy = sin(rad);
155+ if (ZEROd_EQ(vx)) {
156+ slant = 0.0;
157+ } else {
158+ slant = vy / vx;
159+ }
160+ index_slant = (int)(slant * 100000);
161+ d_index_slant = index_slant - index_slant_prev;
162+ for (int i = index_slant_prev+1, d = 1; i <= index_slant; i++, d++) {
163+ if (i > 100000) {
164+ _TRACE_("【警告】想定範囲以上の傾き配列INDEXを設定。メモリが破壊されます。SLANT2ANG["<<i<<"]<="<<(ang*10));
165+ }
166+ //等分する(ここがアバウトのもと)
167+ Util::SLANT2ANG[i] = (angle)( ((ang-1) + (1.0*d)/(1.0*d_index_slant))*1.0);
168+ }
169+ index_slant_prev = index_slant;
158170 }
159- index_slant = (int)(slant * 100000);
160- d_index_slant = index_slant - index_slant_prev;
161- for (int i = index_slant_prev+1, d = 1; i <= index_slant; i++, d++) {
171+ Sleep(10);
172+ d_index_slant = 100000 - index_slant_prev;
173+ for (int i = index_slant_prev+1, d = 1; i <= 100000; i++, d++) {
162174 if (i > 100000) {
163- _TRACE_("【警告】想定範囲以上の傾き配列INDEXを設定。メモリが破壊されます。SLANT2ANG["<<i<<"]<="<<(ang*10));
175+ _TRACE_("【警告】想定範囲以上の傾き配列INDEXを設定。メモリが破壊されます。SLANT2ANG["<<i<<"]<="<<(450000));
164176 }
165- //等分する(ここがアバウトのもと)
166- Util::SLANT2ANG[i] = (angle)( ((ang-1) + (1.0*d)/(1.0*d_index_slant))*1.0);
167- }
168- index_slant_prev = index_slant;
169- }
170- Sleep(10);
171- d_index_slant = 100000 - index_slant_prev;
172- for (int i = index_slant_prev+1, d = 1; i <= 100000; i++, d++) {
173- if (i > 100000) {
174- _TRACE_("【警告】想定範囲以上の傾き配列INDEXを設定。メモリが破壊されます。SLANT2ANG["<<i<<"]<="<<(450000));
177+ Util::SLANT2ANG[i] = (angle)( (45000-1) + (1.0*d)/(1.0*d_index_slant) );
175178 }
176- Util::SLANT2ANG[i] = (angle)( (45000-1) + (1.0*d)/(1.0*d_index_slant) );
179+ Sleep(10);
177180 }
178- Sleep(10);
179181 // //<PROJ_ANG2ROT_ANG> (2009/10/20 経緯・・・速くするためなら何でもやってみよう)
180182 // //ある方向ベクトルから、XY平面、ZY平面に投影した時にできる軸との角(それぞれXY射影角、ZY射影角と呼ぶこととする)と、
181183 // //その方向ベクトルの単位ベクトルが指す単位球の緯度と経度(Z軸回転角、Y軸回転角)を紐つけることを目的とする。
182184 // //つまり、XY射影角、ZY射影角 → Z軸回転角、Y軸回転角 の読み替えを高速に行いたい
183185 // //XY射影角90度分 * ZY射影角90度分 を配列要素、値をZ軸回転角、Y軸回転角を値とする配列を構築。
184186 //
185- double nvx,nvy,nvz;
186- double prj_rad_xy,prj_rad_xz, prj_rad_zy, prj_rad_zx;
187- s_ang rz, ry_rev;
188-
189- vx = 1.0;
190- for (s_ang prj_ang_xy = 0; prj_ang_xy <= D90SANG; prj_ang_xy++) {
191- prj_rad_xy = (PI * 2.0 * prj_ang_xy) / (1.0*D360SANG);
192- vy = tan(prj_rad_xy);
193-
194- for (s_ang prj_ang_xz = 0; prj_ang_xz <= D90SANG; prj_ang_xz++) {
195- prj_rad_xz = (PI * 2.0 * prj_ang_xz) / (1.0*D360SANG);
196- vz = tan(prj_rad_xz);
197-
198- //方向ベクトルを作成
199- //vx,vy,vz を正規化する。
200- double t = 1 / sqrt(vx * vx + vy * vy + vz * vz);
201- nvx = t * vx;
202- nvy = t * vy;
203- nvz = t * vz;
204- //単位ベクトルからRzRy(逆回転)を求める
205- Util::_srv.getFaceAngClosely(
206- (uint32_t)(nvx*10000000),
207- (uint32_t)(nvy*10000000),
208- (uint32_t)(nvz*10000000),
209- rz,
210- ry_rev
211- );
212- Util::PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz] = rz*SANG_RATE;
213- Util::PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz] = ry_rev*SANG_RATE;
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]<<")");
215- }
216- Sleep(2);
217- }
218- Sleep(10);
219- vz = 1.0;
220- for (s_ang prj_ang_zy = 0; prj_ang_zy <= D90SANG; prj_ang_zy++) {
221- prj_rad_zy = (PI * 2.0 * prj_ang_zy) / (1.0*D360SANG);
222- vy = tan(prj_rad_zy);
223-
224- for (s_ang prj_ang_zx = 0; prj_ang_zx <= D90SANG; prj_ang_zx++) {
225- prj_rad_zx = (PI * 2.0 * prj_ang_zx) / (1.0*D360SANG);
226- //方向ベクトルを作成
227- vx = tan(prj_rad_zx);
228-
229- double t = 1 / sqrt(vx * vx + vy * vy + vz * vz);
230- nvx = t * vx;
231- nvy = t * vy;
232- nvz = t * vz;
233- //単位ベクトルからRzRy(逆回転)を求める
234- Util::_srv.getFaceAngClosely(
235- (uint32_t)(nvx*10000000),
236- (uint32_t)(nvy*10000000),
237- (uint32_t)(nvz*10000000),
238- rz,
239- ry_rev
240- );
241-
242- //(0,0,1.0)を0°としX軸の正の方を向いて時計回りを正の角(rx_rev)を考える
243- //これは上で求めたrzと等しくなる。
244- int rx_rev = rz;
245- //(0,0,1.0)を0°としY軸の正の方を向いて反時計回りを正の角(ry)を考える
246- //これは上で求めたry_revをD90ANGから引いた値である。
247- Util::PROJANG_ZY_ZX_TO_ROTANG_x_REV[prj_ang_zy][prj_ang_zx] = rx_rev*SANG_RATE;
248- Util::PROJANG_ZY_ZX_TO_ROTANG_y[prj_ang_zy][prj_ang_zx] = D90ANG - ry_rev*SANG_RATE;
187+ {
188+// double vx,vy,vz;
189+ double vx1 = 1.0;
190+ double vz2 = 1.0;
191+
192+ for (s_ang prj_ang = 0; prj_ang <= D90SANG; prj_ang++) {
193+
194+ double prj_rad_xy = (PI * 2.0 * prj_ang) / (1.0*D360SANG);
195+ double vy1 = tan(prj_rad_xy);
196+
197+ s_ang prj_ang_xy = prj_ang;
198+ for (s_ang prj_ang_xz = 0; prj_ang_xz <= D90SANG; prj_ang_xz++) {
199+ double prj_rad_xz = (PI * 2.0 * prj_ang_xz) / (1.0*D360SANG);
200+ double vz1 = tan(prj_rad_xz);
201+
202+ //方向ベクトルを作成
203+ //vx,vy,vz を正規化する。
204+ double t = 1 / sqrt(vx1 * vx1 + vy1 * vy1 + vz1 * vz1);
205+ double nvx = t * vx1;
206+ double nvy = t * vy1;
207+ double nvz = t * vz1;
208+ //単位ベクトルからRzRy(逆回転)を求める
209+ s_ang rz, ry_rev;
210+ Util::_srv.getFaceAngClosely(
211+ (uint32_t)(nvx*10000000),
212+ (uint32_t)(nvy*10000000),
213+ (uint32_t)(nvz*10000000),
214+ rz,
215+ ry_rev
216+ );
217+ Util::PROJANG_XY_XZ_TO_ROTANG_z[prj_ang_xy][prj_ang_xz] = rz*SANG_RATE;
218+ Util::PROJANG_XY_XZ_TO_ROTANG_y_REV[prj_ang_xy][prj_ang_xz] = ry_rev*SANG_RATE;
219+ }
220+// prj_rad_zy = (PI * 2.0 * prj_ang_zy) / (1.0*D360SANG);
221+// vy2 = tan(prj_rad_zy);
222+ s_ang prj_ang_zy = prj_ang;
223+ double vy2 = vy1;
224+ for (s_ang prj_ang_zx = 0; prj_ang_zx <= D90SANG; prj_ang_zx++) {
225+ double prj_rad_zx = (PI * 2.0 * prj_ang_zx) / (1.0*D360SANG);
226+ //方向ベクトルを作成
227+ double vx2 = tan(prj_rad_zx);
228+
229+ double t = 1 / sqrt(vx2 * vx2 + vy2 * vy2 + vz2 * vz2);
230+ double nvx = t * vx2;
231+ double nvy = t * vy2;
232+ double nvz = t * vz2;
233+ //単位ベクトルからRzRy(逆回転)を求める
234+ s_ang rz, ry_rev;
235+ Util::_srv.getFaceAngClosely(
236+ (uint32_t)(nvx*10000000),
237+ (uint32_t)(nvy*10000000),
238+ (uint32_t)(nvz*10000000),
239+ rz,
240+ ry_rev
241+ );
242+
243+ //(0,0,1.0)を0°としX軸の正の方を向いて時計回りを正の角(rx_rev)を考える
244+ //これは上で求めたrzと等しくなる。
245+ int rx_rev = rz;
246+ //(0,0,1.0)を0°としY軸の正の方を向いて反時計回りを正の角(ry)を考える
247+ //これは上で求めたry_revをD90ANGから引いた値である。
248+ Util::PROJANG_ZY_ZX_TO_ROTANG_x_REV[prj_ang_zy][prj_ang_zx] = rx_rev*SANG_RATE;
249+ Util::PROJANG_ZY_ZX_TO_ROTANG_y[prj_ang_zy][prj_ang_zx] = D90ANG - ry_rev*SANG_RATE;
250+ }
249251 }
250- Sleep(2);
251252 }
252253
253254 Sleep(10);
@@ -271,28 +272,6 @@ void Util::init() {
271272 }
272273 Util::_was_GgafDx_Util_inited_flg = true;
273274
274-// _TRACE_("開始!");
275-// for (s_ang prm_rz = 0; prm_rz <= D90ANG; prm_rz+=100) {
276-// for (s_ang prm_ry = 0; prm_ry <= D90ANG; prm_ry+=100) {
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-// }
292-// }
293-// }
294-// }
295-
296275 }
297276
298277 void Util::calcVecToAng(double prm_x,
@@ -523,6 +502,78 @@ coord Util::getDistance(coord x1, coord y1, coord x2, coord y2) {
523502 //}
524503
525504
505+//void Util::convVectorToRzRy2(coord vx,
506+// coord vy,
507+// coord vz,
508+// angle& out_rz,
509+// angle& out_ry ) {
510+// double dx = ABS(vx);
511+// double dy = ABS(vy);
512+// double dz = ABS(vz);
513+// double out_nvx, out_nvy, out_nvz;
514+// double t = 1.0 / sqrt(dx * dx + dy * dy + dz * dz);
515+// out_nvx = t * dx;
516+// out_nvy = t * dy;
517+// out_nvz = t * dz;
518+// //単位ベクトルからRzRy(逆回転)を求める
519+// s_ang rz, ry_rev;
520+// Util::_srv.getFaceAngClosely(
521+// (uint32_t)(out_nvx*10000000),
522+// (uint32_t)(out_nvy*10000000),
523+// (uint32_t)(out_nvz*10000000),
524+// rz,
525+// ry_rev
526+// );
527+// angle rot_z = rz * SANG_RATE;
528+// angle rot_y_rev = ry_rev * SANG_RATE;
529+// //卦限によって回転角を補正
530+// if (vx >= 0) {
531+// if (vy >= 0) {
532+// if (vz >= 0) {
533+// //第一卦限
534+// out_rz = rot_z;
535+// out_ry = (D360ANG - rot_y_rev);
536+// } else { //vz < 0
537+// //第五卦限
538+// out_rz = rot_z;
539+// out_ry = rot_y_rev;
540+// }
541+// } else { //vy < 0
542+// if (vz >= 0) {
543+// //第四卦限
544+// out_rz = (D360ANG - rot_z);
545+// out_ry = (D360ANG - rot_y_rev);
546+// } else { //vz < 0
547+// //第八卦限
548+// out_rz = (D360ANG - rot_z);
549+// out_ry = rot_y_rev;
550+// }
551+// }
552+// } else { //vx < 0
553+// if (vy >= 0) {
554+// if (vz >= 0) {
555+// //第二卦限
556+// out_rz = rot_z;
557+// out_ry = (D180ANG + rot_y_rev);
558+// } else { //vz < 0
559+// //第六卦限
560+// out_rz = rot_z;
561+// out_ry = (D180ANG - rot_y_rev);
562+// }
563+// } else { //vy < 0
564+// if (vz >= 0) {
565+// //第三卦限
566+// out_rz = (D360ANG - rot_z);
567+// out_ry = (D180ANG + rot_y_rev);
568+// } else { //vz < 0
569+// //第七卦限
570+// out_rz = (D360ANG - rot_z);
571+// out_ry = (D180ANG - rot_y_rev);
572+// }
573+// }
574+// }
575+//}
576+
526577 void Util::convVectorToRzRy(coord vx,
527578 coord vy,
528579 coord vz,
--- a/Mogera/src/scene/MgrSpacetime.cpp
+++ b/Mogera/src/scene/MgrSpacetime.cpp
@@ -8,8 +8,8 @@
88 #include "actor/camera/MgrCameraWorker.h"
99 #include "jp/ggaf/lib/util/VirtualButton.h"
1010
11-
12-
11+using namespace GgafCore;
12+using namespace GgafDx;
1313 using namespace GgafLib;
1414 using namespace Mogera;
1515
@@ -44,30 +44,6 @@ void MgrSpacetime::initialize() {
4444 //世界シーン生成し、自シーンの配下に所属させる
4545 pWorld_ = desireScene(Mogera::MgrWorld);
4646 appendChild(pWorld_);
47-
48-
49-// angle rz,ry;
50-// UTIL::convVectorToRzRy(1.0,1.0,0.0,rz,ry);
51-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
52-// UTIL::convVectorToRzRy(1.0,1.0,1.0,rz,ry);
53-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
54-// UTIL::convVectorToRzRy(1.0,1.0,-1.0,rz,ry);
55-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
56-// UTIL::convVectorToRzRy(1.0,-1.0,1.0,rz,ry);
57-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
58-// UTIL::convVectorToRzRy(1.0,-1.0,-1.0,rz,ry);
59-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
60-// UTIL::convVectorToRzRy(-1.0,1.0,1.0,rz,ry);
61-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
62-// UTIL::convVectorToRzRy(-1.0,1.0,-1.0,rz,ry);
63-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
64-// UTIL::convVectorToRzRy(-1.0,-1.0,1.0,rz,ry);
65-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
66-// UTIL::convVectorToRzRy(-1.0,1.0,-1.0,rz,ry);
67-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
68-// UTIL::convVectorToRzRy(-1.0,-1.0,-1.0,rz,ry);
69-// _TRACE_("(rz,ry)=("<<rz<<","<<ry<<")");
70-
7147 }
7248
7349 void MgrSpacetime::processBehavior() {
--- a/VioletVreath/src/Version.h
+++ b/VioletVreath/src/Version.h
@@ -1 +1 @@
1-#define VERSION "VER 0.30.6953"
1+#define VERSION "VER 0.30.6978"