質問編集履歴

8

提示コードを修正無駄のないものを削除

2020/04/19 04:35

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  回転軸の方向とはどのうような意味なのでしょうか? 調べましたが色々な分野が出来てしまい欲しい情報が手に入りませんUnityの提示画像のようなカメラがキャラクターの後ろをついて行くという3Dアクションゲームでよくある表現のカメラ回転を実装したいのですが**クォータニオンを使いカメラの座標と回転軸の正規化ベクトルとラジアンを使って目的の方向に回転**させるという処理の**回転軸**の意味と取得方法が知りたいです。
4
4
 
5
+ ※その後回答から上に周回回転するベクトルはcamera - target;により解決しましたが 横に周回回転するベクトルを得る方法が知りたいです。
6
+
7
+
8
+
9
+
10
+
5
11
  数式でいうことろの参考サイトの"クォータニオンに回転を与える"原点を中心とした軸ベクトルの意味です。
6
12
 
7
13
 
@@ -252,83 +258,7 @@
252
258
 
253
259
 
254
260
 
255
- /*色 変更*/
261
+
256
-
257
- if(Input::keyboard(KEY_INPUT_SPACE) == 1)
258
-
259
- {
260
-
261
- ModeChange = !ModeChange;
262
-
263
- }
264
-
265
- /* false spcカラーを変更*/
266
-
267
- if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == false)
268
-
269
- {
270
-
271
- color_spc.r += -1;
272
-
273
- color_spc.g += -1;
274
-
275
- color_spc.b += -1;
276
-
277
-
278
-
279
- }
280
-
281
- else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == false)
282
-
283
- {
284
-
285
- color_spc.r += 1;
286
-
287
- color_spc.g += 1;
288
-
289
- color_spc.b += 1;
290
-
291
-
292
-
293
- /*true difカラー変更*/
294
-
295
- }else if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == true)
296
-
297
- {
298
-
299
- color_dif.r += -1;
300
-
301
- color_dif.g += -1;
302
-
303
- color_dif.b += -1;
304
-
305
-
306
-
307
- }
308
-
309
- else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == true)
310
-
311
- {
312
-
313
- color_dif.r += 1;
314
-
315
- color_dif.g += 1;
316
-
317
- color_dif.b += 1;
318
-
319
-
320
-
321
- }
322
-
323
-
324
-
325
- if (Input::keyboard(KEY_INPUT_F1) == 1)
326
-
327
- {
328
-
329
- TextureMode = !TextureMode;
330
-
331
- }
332
262
 
333
263
 
334
264
 

7

タイトルを編集しました。

2020/04/19 04:35

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 回転軸の方向を表すベクトルの求め方が知りたい 三次元
1
+ 回転軸の方向を表すベクトルの求め方が知りたい 周回軌道のように回る回転 三次元
test CHANGED
@@ -26,10 +26,10 @@
26
26
 
27
27
  とりえあず関数を作り必要そうな引数を用意しましたが計算方法がわからないため中身はまだ作れません
28
28
 
29
+ 原点座標に変換して回転して最後にワールド座標に戻すという方法をrotate();関数で実行しています。
30
+
29
31
  ```ここに言語を入力
30
32
 
31
- /*座標、ラジアン、中心*/
32
-
33
33
 
34
34
 
35
35
  /*回転する座標、ラジアン、中心、軸*/

6

提示コードを編集しました。

2020/04/15 04:40

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -30,6 +30,10 @@
30
30
 
31
31
  /*座標、ラジアン、中心*/
32
32
 
33
+
34
+
35
+ /*回転する座標、ラジアン、中心、軸*/
36
+
33
37
  void Game::rotate(Vector *pos,const float ang, const Vector targetV,const Vector axis)
34
38
 
35
39
  {
@@ -38,7 +42,7 @@
38
42
 
39
43
  //Quaternion Prev(0, Vector(*x - mx, *y - my, *z - mz));
40
44
 
41
-      /*ここの行の計算 ↓ */
45
+
42
46
 
43
47
  Quaternion P(0, Vector(pos->x, pos->y, pos->z));//回転させる点
44
48
 
@@ -48,7 +52,7 @@
48
52
 
49
53
  Quaternion PP3(0,Vector(targetV.x , targetV.y , targetV.z ));//回転させる点
50
54
 
51
- /*ここの行の計算 ↑ */
55
+
52
56
 
53
57
  Quaternion Q(cos(ang / 2), Vector( axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2)));
54
58
 
@@ -56,7 +60,7 @@
56
60
 
57
61
 
58
62
 
59
- Quaternion result = (R * P) * Q;//順番が大事
63
+ Quaternion result = (R * P2) * Q;//順番が大事
60
64
 
61
65
 
62
66
 
@@ -74,18 +78,278 @@
74
78
 
75
79
  ofs << "result.z:" << result.v.z << "\n\n\n" << std::endl;
76
80
 
81
+
82
+
83
+
84
+
77
-
85
+ pos->x = result.v.x + targetV.x;
86
+
78
-
87
+ pos->y = result.v.y + targetV.y;
88
+
89
+ pos->z = result.v.z + targetV.z;
90
+
91
+
92
+
93
+
94
+
95
+ /*
96
+
79
- pos->x = result.v.x;
97
+ pos->x = result.v.x;
80
98
 
81
99
  pos->y = result.v.y;
82
100
 
83
101
  pos->z = result.v.z;
84
102
 
85
-
103
+ */
86
104
 
87
105
  }
88
106
 
107
+
108
+
109
+ void Game::Update()
110
+
111
+ {
112
+
113
+
114
+
115
+
116
+
117
+ /*カメラ回転*/
118
+
119
+ if (Input::keyboard(KEY_INPUT_LEFT) > 0)
120
+
121
+ {
122
+
123
+ Vector a = Vector::cross((targetV - cameraPos),Vector(0,-1,0));
124
+
125
+ float f = sqrt(pow(a.x,2) + pow(a.y,2) + pow(a.z,2));
126
+
127
+ a.x = a.x / f;
128
+
129
+ a.y = a.y / f;
130
+
131
+ a.z = a.z / f;
132
+
133
+
134
+
135
+
136
+
137
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, -1, 0));
138
+
139
+ //r += -ROTATE_SPEED;
140
+
141
+ }
142
+
143
+ else if (Input::keyboard(KEY_INPUT_RIGHT) > 0)
144
+
145
+ {
146
+
147
+ Vector a = Vector::cross(targetV - cameraPos, Vector(0, 1, 0));
148
+
149
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
150
+
151
+ a.x = a.x / f;
152
+
153
+ a.y = a.y / f;
154
+
155
+ a.z = a.z / f;
156
+
157
+
158
+
159
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, 1, 0));
160
+
161
+ }
162
+
163
+ else if (Input::keyboard(KEY_INPUT_UP) > 0)
164
+
165
+ {
166
+
167
+ Vector a = Vector::cross(targetV - cameraPos, Vector(-1, 0, 0));
168
+
169
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
170
+
171
+ a.x = a.x / f;
172
+
173
+ a.y = a.y / f;
174
+
175
+ a.z = a.z / f;
176
+
177
+
178
+
179
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(-1,0,0));
180
+
181
+ DrawFormatString(100,100,GetColor(255,255,255),"UP");
182
+
183
+
184
+
185
+ }
186
+
187
+ else if (Input::keyboard(KEY_INPUT_DOWN) > 0)
188
+
189
+ {
190
+
191
+
192
+
193
+ Vector a = Vector::cross(targetV - cameraPos, Vector(1, 0, 0));
194
+
195
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
196
+
197
+ a.x = a.x / f;
198
+
199
+ a.y = a.y / f;
200
+
201
+ a.z = a.z / f;
202
+
203
+
204
+
205
+
206
+
207
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(1, 0, 0));
208
+
209
+
210
+
211
+ }
212
+
213
+ if (Input::keyboard(KEY_INPUT_W) > 0)
214
+
215
+ {
216
+
217
+
218
+
219
+ }
220
+
221
+ else if (Input::keyboard(KEY_INPUT_S) > 0)
222
+
223
+ {
224
+
225
+
226
+
227
+ }
228
+
229
+
230
+
231
+ // Vector aa = Vector::cross(Vector(3,4,1),Vector(3,7,5));
232
+
233
+ Vector a = Vector::cross((targetV - cameraPos), Vector(0, -1, 0));
234
+
235
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
236
+
237
+ a.x = a.x / f;
238
+
239
+ a.y = a.y / f;
240
+
241
+ a.z = a.z / f;
242
+
243
+
244
+
245
+ Vector tt = (targetV - cameraPos);
246
+
247
+ DrawFormatString(100, 100, GetColor(255, 255, 255), "ベクトルの外積: %f , %f , %f ", a.x, a.y, a.z);
248
+
249
+ DrawFormatString(100, 200, GetColor(255, 255, 255), "aaa : %f , %f , %f ",tt.x,tt.y,tt.z);
250
+
251
+
252
+
253
+
254
+
255
+ /*色 変更*/
256
+
257
+ if(Input::keyboard(KEY_INPUT_SPACE) == 1)
258
+
259
+ {
260
+
261
+ ModeChange = !ModeChange;
262
+
263
+ }
264
+
265
+ /* false spcカラーを変更*/
266
+
267
+ if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == false)
268
+
269
+ {
270
+
271
+ color_spc.r += -1;
272
+
273
+ color_spc.g += -1;
274
+
275
+ color_spc.b += -1;
276
+
277
+
278
+
279
+ }
280
+
281
+ else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == false)
282
+
283
+ {
284
+
285
+ color_spc.r += 1;
286
+
287
+ color_spc.g += 1;
288
+
289
+ color_spc.b += 1;
290
+
291
+
292
+
293
+ /*true difカラー変更*/
294
+
295
+ }else if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == true)
296
+
297
+ {
298
+
299
+ color_dif.r += -1;
300
+
301
+ color_dif.g += -1;
302
+
303
+ color_dif.b += -1;
304
+
305
+
306
+
307
+ }
308
+
309
+ else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == true)
310
+
311
+ {
312
+
313
+ color_dif.r += 1;
314
+
315
+ color_dif.g += 1;
316
+
317
+ color_dif.b += 1;
318
+
319
+
320
+
321
+ }
322
+
323
+
324
+
325
+ if (Input::keyboard(KEY_INPUT_F1) == 1)
326
+
327
+ {
328
+
329
+ TextureMode = !TextureMode;
330
+
331
+ }
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+ // SetCameraPositionAndAngle(VGet(cameraPos.x, cameraPos.y, cameraPos.z), r, 0, 0);
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+ }
350
+
351
+
352
+
89
353
  ```
90
354
 
91
355
 

5

提示コードを編集しました。

2020/04/15 04:29

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -30,9 +30,57 @@
30
30
 
31
31
  /*座標、ラジアン、中心*/
32
32
 
33
- Vector rotate(const Vector pos,const float ang, const Vector targetV)
33
+ void Game::rotate(Vector *pos,const float ang, const Vector targetV,const Vector axis)
34
34
 
35
35
  {
36
+
37
+
38
+
39
+ //Quaternion Prev(0, Vector(*x - mx, *y - my, *z - mz));
40
+
41
+      /*ここの行の計算 ↓ */
42
+
43
+ Quaternion P(0, Vector(pos->x, pos->y, pos->z));//回転させる点
44
+
45
+ Quaternion P2(0, Vector(pos->x - targetV.x, pos->y - targetV.y, pos->z - targetV.z));//回転させる点
46
+
47
+ Quaternion PP(0, Vector(targetV.x - pos->x, targetV.y - pos->y, targetV.z - pos->z));//回転させる点
48
+
49
+ Quaternion PP3(0,Vector(targetV.x , targetV.y , targetV.z ));//回転させる点
50
+
51
+ /*ここの行の計算 ↑ */
52
+
53
+ Quaternion Q(cos(ang / 2), Vector( axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2)));
54
+
55
+ Quaternion R(cos(ang / 2), Vector(-axis.x * sin(ang / 2) , -axis.y * sin(ang / 2), -axis.z * sin(ang / 2)));
56
+
57
+
58
+
59
+ Quaternion result = (R * P) * Q;//順番が大事
60
+
61
+
62
+
63
+ ofs << "pos.x:" << pos->x << std::endl;
64
+
65
+ ofs << "pos.y:" << pos->y << std::endl;
66
+
67
+ ofs << "pos.z:" << pos->z << "\n" << std::endl;
68
+
69
+
70
+
71
+ ofs << "result.x:" << result.v.x << std::endl;
72
+
73
+ ofs << "result.y:" << result.v.y << std::endl;
74
+
75
+ ofs << "result.z:" << result.v.z << "\n\n\n" << std::endl;
76
+
77
+
78
+
79
+ pos->x = result.v.x;
80
+
81
+ pos->y = result.v.y;
82
+
83
+ pos->z = result.v.z;
36
84
 
37
85
 
38
86
 

4

提示画像を追加

2020/04/09 05:38

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -49,3 +49,7 @@
49
49
  ![イメージ説明](9caed2ce9452bdf93b4d08a7f28e2393.jpeg)
50
50
 
51
51
  ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)
52
+
53
+ 横から見た図↓
54
+
55
+ ![イメージ説明](7bd3f19ad4c8e42fe3e75c64fdf18878.jpeg)

3

画像の補足説明を追加

2020/04/08 10:17

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -42,6 +42,10 @@
42
42
 
43
43
 
44
44
 
45
+ DxLibですが画面はUnity上で再現したものなのです。カメラを視覚的にわかりやすくするためにデバッグ用のカメラモデルと落としてきたり頂点を設定したりと結構大変なのでコードの集中するためUnityでイメージ画像としてキャプチャしました。
46
+
47
+
48
+
45
49
  ![イメージ説明](9caed2ce9452bdf93b4d08a7f28e2393.jpeg)
46
50
 
47
51
  ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)

2

文章を編集しました。

2020/04/08 09:51

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
 
12
12
 
13
- pos 現在座標(提示画像のモデルです。)
13
+ pos 現在座標 カメラ
14
14
 
15
- targetV は中心座標(カメラの注視点)
15
+ targetV は中心座標(カメラの注視点)Unity画像ではプレイヤーモデル
16
16
 
17
17
  ang はθ
18
18
 

1

文章を編集しました。

2020/04/08 04:04

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,12 @@
1
- 回転軸方向とどのうような意味なのでしょうか? 調べました色々な分野出来てしまい欲しい情報手に入りません
1
+ DxLibですで座標系は z右X上Yです。
2
+
3
+ 回転軸の方向とはどのうような意味なのでしょうか? 調べましたが色々な分野が出来てしまい欲しい情報が手に入りませんUnityの提示画像のようなカメラがキャラクターの後ろをついて行くという3Dアクションゲームでよくある表現のカメラ回転を実装したいのですが**クォータニオンを使いカメラの座標と回転軸の正規化ベクトルとラジアンを使って目的の方向に回転**させるという処理の**回転軸**の意味と取得方法が知りたいです。
4
+
5
+ 数式でいうことろの参考サイトの"クォータニオンに回転を与える"原点を中心とした軸ベクトルの意味です。
6
+
7
+
8
+
9
+ 参考サイト: https://wgld.org/d/webgl/w031.html
2
10
 
3
11
 
4
12
 
@@ -16,6 +24,8 @@
16
24
 
17
25
 
18
26
 
27
+ とりえあず関数を作り必要そうな引数を用意しましたが計算方法がわからないため中身はまだ作れません
28
+
19
29
  ```ここに言語を入力
20
30
 
21
31
  /*座標、ラジアン、中心*/
@@ -28,10 +38,10 @@
28
38
 
29
39
  }
30
40
 
31
-
32
-
33
41
  ```
34
42
 
35
43
 
36
44
 
37
45
  ![イメージ説明](9caed2ce9452bdf93b4d08a7f28e2393.jpeg)
46
+
47
+ ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)