teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

8

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

2020/04/19 04:35

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,8 @@
1
1
  DxLibですので座標系は 奥がz右がX上がYです。
2
2
  回転軸の方向とはどのうような意味なのでしょうか? 調べましたが色々な分野が出来てしまい欲しい情報が手に入りませんUnityの提示画像のようなカメラがキャラクターの後ろをついて行くという3Dアクションゲームでよくある表現のカメラ回転を実装したいのですが**クォータニオンを使いカメラの座標と回転軸の正規化ベクトルとラジアンを使って目的の方向に回転**させるという処理の**回転軸**の意味と取得方法が知りたいです。
3
+ ※その後回答から上に周回回転するベクトルはcamera - target;により解決しましたが 横に周回回転するベクトルを得る方法が知りたいです。
4
+
5
+
3
6
  数式でいうことろの参考サイトの"クォータニオンに回転を与える"原点を中心とした軸ベクトルの意味です。
4
7
 
5
8
  参考サイト: https://wgld.org/d/webgl/w031.html
@@ -125,48 +128,10 @@
125
128
  DrawFormatString(100, 200, GetColor(255, 255, 255), "aaa : %f , %f , %f ",tt.x,tt.y,tt.z);
126
129
 
127
130
 
128
- /*色 変更*/
131
+
129
- if(Input::keyboard(KEY_INPUT_SPACE) == 1)
130
- {
131
- ModeChange = !ModeChange;
132
- }
133
- /* false spcカラーを変更*/
134
- if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == false)
135
- {
136
- color_spc.r += -1;
137
- color_spc.g += -1;
138
- color_spc.b += -1;
139
132
 
140
- }
141
- else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == false)
142
- {
143
- color_spc.r += 1;
144
- color_spc.g += 1;
145
- color_spc.b += 1;
146
133
 
147
- /*true difカラー変更*/
148
- }else if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == true)
149
- {
150
- color_dif.r += -1;
151
- color_dif.g += -1;
152
- color_dif.b += -1;
153
134
 
154
- }
155
- else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == true)
156
- {
157
- color_dif.r += 1;
158
- color_dif.g += 1;
159
- color_dif.b += 1;
160
-
161
- }
162
-
163
- if (Input::keyboard(KEY_INPUT_F1) == 1)
164
- {
165
- TextureMode = !TextureMode;
166
- }
167
-
168
-
169
-
170
135
  // SetCameraPositionAndAngle(VGet(cameraPos.x, cameraPos.y, cameraPos.z), r, 0, 0);
171
136
 
172
137
 

7

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

2020/04/19 04:35

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- 回転軸の方向を表すベクトルの求め方が知りたい 三次元
1
+ 回転軸の方向を表すベクトルの求め方が知りたい 周回軌道のように回る回転 三次元
body CHANGED
@@ -12,8 +12,8 @@
12
12
 
13
13
 
14
14
  とりえあず関数を作り必要そうな引数を用意しましたが計算方法がわからないため中身はまだ作れません
15
+ 原点座標に変換して回転して最後にワールド座標に戻すという方法をrotate();関数で実行しています。
15
16
  ```ここに言語を入力
16
- /*座標、ラジアン、中心*/
17
17
 
18
18
  /*回転する座標、ラジアン、中心、軸*/
19
19
  void Game::rotate(Vector *pos,const float ang, const Vector targetV,const Vector axis)

6

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

2020/04/15 04:40

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -14,20 +14,22 @@
14
14
  とりえあず関数を作り必要そうな引数を用意しましたが計算方法がわからないため中身はまだ作れません
15
15
  ```ここに言語を入力
16
16
  /*座標、ラジアン、中心*/
17
+
18
+ /*回転する座標、ラジアン、中心、軸*/
17
19
  void Game::rotate(Vector *pos,const float ang, const Vector targetV,const Vector axis)
18
20
  {
19
21
 
20
22
  //Quaternion Prev(0, Vector(*x - mx, *y - my, *z - mz));
21
-      /*ここの行の計算 ↓ */
23
+
22
24
  Quaternion P(0, Vector(pos->x, pos->y, pos->z));//回転させる点
23
25
  Quaternion P2(0, Vector(pos->x - targetV.x, pos->y - targetV.y, pos->z - targetV.z));//回転させる点
24
26
  Quaternion PP(0, Vector(targetV.x - pos->x, targetV.y - pos->y, targetV.z - pos->z));//回転させる点
25
27
  Quaternion PP3(0,Vector(targetV.x , targetV.y , targetV.z ));//回転させる点
26
- /*ここの行の計算 ↑ */
28
+
27
29
  Quaternion Q(cos(ang / 2), Vector( axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2)));
28
30
  Quaternion R(cos(ang / 2), Vector(-axis.x * sin(ang / 2) , -axis.y * sin(ang / 2), -axis.z * sin(ang / 2)));
29
31
 
30
- Quaternion result = (R * P) * Q;//順番が大事
32
+ Quaternion result = (R * P2) * Q;//順番が大事
31
33
 
32
34
  ofs << "pos.x:" << pos->x << std::endl;
33
35
  ofs << "pos.y:" << pos->y << std::endl;
@@ -36,12 +38,142 @@
36
38
  ofs << "result.x:" << result.v.x << std::endl;
37
39
  ofs << "result.y:" << result.v.y << std::endl;
38
40
  ofs << "result.z:" << result.v.z << "\n\n\n" << std::endl;
41
+
42
+
43
+ pos->x = result.v.x + targetV.x;
44
+ pos->y = result.v.y + targetV.y;
45
+ pos->z = result.v.z + targetV.z;
46
+
39
47
 
48
+ /*
40
- pos->x = result.v.x;
49
+ pos->x = result.v.x;
41
50
  pos->y = result.v.y;
42
51
  pos->z = result.v.z;
43
-
52
+ */
44
53
  }
54
+
55
+ void Game::Update()
56
+ {
57
+
58
+
59
+ /*カメラ回転*/
60
+ if (Input::keyboard(KEY_INPUT_LEFT) > 0)
61
+ {
62
+ Vector a = Vector::cross((targetV - cameraPos),Vector(0,-1,0));
63
+ float f = sqrt(pow(a.x,2) + pow(a.y,2) + pow(a.z,2));
64
+ a.x = a.x / f;
65
+ a.y = a.y / f;
66
+ a.z = a.z / f;
67
+
68
+
69
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, -1, 0));
70
+ //r += -ROTATE_SPEED;
71
+ }
72
+ else if (Input::keyboard(KEY_INPUT_RIGHT) > 0)
73
+ {
74
+ Vector a = Vector::cross(targetV - cameraPos, Vector(0, 1, 0));
75
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
76
+ a.x = a.x / f;
77
+ a.y = a.y / f;
78
+ a.z = a.z / f;
79
+
80
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, 1, 0));
81
+ }
82
+ else if (Input::keyboard(KEY_INPUT_UP) > 0)
83
+ {
84
+ Vector a = Vector::cross(targetV - cameraPos, Vector(-1, 0, 0));
85
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
86
+ a.x = a.x / f;
87
+ a.y = a.y / f;
88
+ a.z = a.z / f;
89
+
90
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(-1,0,0));
91
+ DrawFormatString(100,100,GetColor(255,255,255),"UP");
92
+
93
+ }
94
+ else if (Input::keyboard(KEY_INPUT_DOWN) > 0)
95
+ {
96
+
97
+ Vector a = Vector::cross(targetV - cameraPos, Vector(1, 0, 0));
98
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
99
+ a.x = a.x / f;
100
+ a.y = a.y / f;
101
+ a.z = a.z / f;
102
+
103
+
104
+ rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(1, 0, 0));
105
+
106
+ }
107
+ if (Input::keyboard(KEY_INPUT_W) > 0)
108
+ {
109
+
110
+ }
111
+ else if (Input::keyboard(KEY_INPUT_S) > 0)
112
+ {
113
+
114
+ }
115
+
116
+ // Vector aa = Vector::cross(Vector(3,4,1),Vector(3,7,5));
117
+ Vector a = Vector::cross((targetV - cameraPos), Vector(0, -1, 0));
118
+ float f = sqrt(pow(a.x, 2) + pow(a.y, 2) + pow(a.z, 2));
119
+ a.x = a.x / f;
120
+ a.y = a.y / f;
121
+ a.z = a.z / f;
122
+
123
+ Vector tt = (targetV - cameraPos);
124
+ DrawFormatString(100, 100, GetColor(255, 255, 255), "ベクトルの外積: %f , %f , %f ", a.x, a.y, a.z);
125
+ DrawFormatString(100, 200, GetColor(255, 255, 255), "aaa : %f , %f , %f ",tt.x,tt.y,tt.z);
126
+
127
+
128
+ /*色 変更*/
129
+ if(Input::keyboard(KEY_INPUT_SPACE) == 1)
130
+ {
131
+ ModeChange = !ModeChange;
132
+ }
133
+ /* false spcカラーを変更*/
134
+ if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == false)
135
+ {
136
+ color_spc.r += -1;
137
+ color_spc.g += -1;
138
+ color_spc.b += -1;
139
+
140
+ }
141
+ else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == false)
142
+ {
143
+ color_spc.r += 1;
144
+ color_spc.g += 1;
145
+ color_spc.b += 1;
146
+
147
+ /*true difカラー変更*/
148
+ }else if (Input::keyboard(KEY_INPUT_Z) > 0 && ModeChange == true)
149
+ {
150
+ color_dif.r += -1;
151
+ color_dif.g += -1;
152
+ color_dif.b += -1;
153
+
154
+ }
155
+ else if (Input::keyboard(KEY_INPUT_X) > 0 && ModeChange == true)
156
+ {
157
+ color_dif.r += 1;
158
+ color_dif.g += 1;
159
+ color_dif.b += 1;
160
+
161
+ }
162
+
163
+ if (Input::keyboard(KEY_INPUT_F1) == 1)
164
+ {
165
+ TextureMode = !TextureMode;
166
+ }
167
+
168
+
169
+
170
+ // SetCameraPositionAndAngle(VGet(cameraPos.x, cameraPos.y, cameraPos.z), r, 0, 0);
171
+
172
+
173
+
174
+
175
+ }
176
+
45
177
  ```
46
178
 
47
179
  DxLibですが画面はUnity上で再現したものなのです。カメラを視覚的にわかりやすくするためにデバッグ用のカメラモデルと落としてきたり頂点を設定したりと結構大変なのでコードの集中するためUnityでイメージ画像としてキャプチャしました。

5

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

2020/04/15 04:29

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -14,9 +14,33 @@
14
14
  とりえあず関数を作り必要そうな引数を用意しましたが計算方法がわからないため中身はまだ作れません
15
15
  ```ここに言語を入力
16
16
  /*座標、ラジアン、中心*/
17
- Vector rotate(const Vector pos,const float ang, const Vector targetV)
17
+ void Game::rotate(Vector *pos,const float ang, const Vector targetV,const Vector axis)
18
18
  {
19
19
 
20
+ //Quaternion Prev(0, Vector(*x - mx, *y - my, *z - mz));
21
+      /*ここの行の計算 ↓ */
22
+ Quaternion P(0, Vector(pos->x, pos->y, pos->z));//回転させる点
23
+ Quaternion P2(0, Vector(pos->x - targetV.x, pos->y - targetV.y, pos->z - targetV.z));//回転させる点
24
+ Quaternion PP(0, Vector(targetV.x - pos->x, targetV.y - pos->y, targetV.z - pos->z));//回転させる点
25
+ Quaternion PP3(0,Vector(targetV.x , targetV.y , targetV.z ));//回転させる点
26
+ /*ここの行の計算 ↑ */
27
+ Quaternion Q(cos(ang / 2), Vector( axis.x * sin(ang / 2), axis.y * sin(ang / 2), axis.z * sin(ang / 2)));
28
+ Quaternion R(cos(ang / 2), Vector(-axis.x * sin(ang / 2) , -axis.y * sin(ang / 2), -axis.z * sin(ang / 2)));
29
+
30
+ Quaternion result = (R * P) * Q;//順番が大事
31
+
32
+ ofs << "pos.x:" << pos->x << std::endl;
33
+ ofs << "pos.y:" << pos->y << std::endl;
34
+ ofs << "pos.z:" << pos->z << "\n" << std::endl;
35
+
36
+ ofs << "result.x:" << result.v.x << std::endl;
37
+ ofs << "result.y:" << result.v.y << std::endl;
38
+ ofs << "result.z:" << result.v.z << "\n\n\n" << std::endl;
39
+
40
+ pos->x = result.v.x;
41
+ pos->y = result.v.y;
42
+ pos->z = result.v.z;
43
+
20
44
  }
21
45
  ```
22
46
 

4

提示画像を追加

2020/04/09 05:38

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -23,4 +23,6 @@
23
23
  DxLibですが画面はUnity上で再現したものなのです。カメラを視覚的にわかりやすくするためにデバッグ用のカメラモデルと落としてきたり頂点を設定したりと結構大変なのでコードの集中するためUnityでイメージ画像としてキャプチャしました。
24
24
 
25
25
  ![イメージ説明](9caed2ce9452bdf93b4d08a7f28e2393.jpeg)
26
- ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)
26
+ ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)
27
+ 横から見た図↓
28
+ ![イメージ説明](7bd3f19ad4c8e42fe3e75c64fdf18878.jpeg)

3

画像の補足説明を追加

2020/04/08 10:17

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -20,5 +20,7 @@
20
20
  }
21
21
  ```
22
22
 
23
+ DxLibですが画面はUnity上で再現したものなのです。カメラを視覚的にわかりやすくするためにデバッグ用のカメラモデルと落としてきたり頂点を設定したりと結構大変なのでコードの集中するためUnityでイメージ画像としてキャプチャしました。
24
+
23
25
  ![イメージ説明](9caed2ce9452bdf93b4d08a7f28e2393.jpeg)
24
26
  ![イメージ説明](394fd77c3758367ea4dcca5a18e92781.png)

2

文章を編集しました。

2020/04/08 09:51

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  参考サイト: https://wgld.org/d/webgl/w031.html
6
6
 
7
- pos 現在座標(提示画像のモデルです。)
7
+ pos 現在座標 カメラ
8
- targetV は中心座標(カメラの注視点)
8
+ targetV は中心座標(カメラの注視点)Unity画像ではプレイヤーモデル
9
9
  ang はθ
10
10
 
11
11
  ですこの情報から回転軸の方向を取得できるのでしょうか?

1

文章を編集しました。

2020/04/08 04:04

投稿

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