🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1442閲覧

カメラを回転させたい。砲台のように

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/21 12:00

提示コードのコメント部ですがX軸をマイナスすることによって横にカメラを回転出来るのですがすぐに速度が下がりやがて回転しなくなるのですがこれはなぜでしょうか?戦車の砲台のようにカメラを回転させたいのですがどうすればいいのでしょうか?

イメージ説明

cpp

1//キー入力 2void Game::KeyInput() 3{ 4#define ROTATE_SPEED 0.1f 5 6 7 //モード切り替え 8 if (mInput->KeyDown(GLFW_KEY_F1) == true) 9 { 10 Function_Key = 1; 11 } 12 else if (mInput->KeyDown(GLFW_KEY_F2) == true) 13 { 14 Function_Key = 2; 15 } 16 else if (mInput->KeyDown(GLFW_KEY_F3) == true) 17 { 18 Function_Key = 3; 19 } 20 else if (mInput->KeyDown(GLFW_KEY_F4) == true) 21 { 22 Function_Key = 4; 23 } 24 else if (mInput->KeyDown(GLFW_KEY_F5) == true) 25 { 26 Function_Key = 5; 27 } 28 else if (mInput->KeyDown(GLFW_KEY_F6) == true) 29 { 30 Function_Key = 6; 31 } 32 else if (mInput->KeyDown(GLFW_KEY_F7) == true) 33 { 34 Function_Key = 7; 35 } 36 else if (mInput->KeyDown(GLFW_KEY_F8) == true) 37 { 38 Function_Key = 8; 39 } 40 else if (mInput->KeyDown(GLFW_KEY_F9) == true) 41 { 42 Function_Key = 9; 43 } 44 else if (mInput->KeyDown(GLFW_KEY_F10) == true) 45 { 46 Function_Key = 10; 47 } 48 else if (mInput->KeyDown(GLFW_KEY_F11) == true) 49 { 50 Function_Key = 11; 51 } 52 else if (mInput->KeyDown(GLFW_KEY_F12) == true) 53 { 54 Function_Key = 12; 55 } 56 57 switch (Function_Key) 58 { 59 60 case 1: //カメラ移動 61 { 62 if (mInput->KeyDownHold(GLFW_KEY_UP) == true) 63 { 64 mCameraPosition.y += +0.1f; 65 }else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true) 66 { 67 mCameraPosition.y += -0.1f; 68 }else if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true) 69 { 70 mCameraPosition.x += +0.1f; 71 } 72 else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true) 73 { 74 mCameraPosition.x += -0.1f; 75 } 76 else if (mInput->KeyDownHold(GLFW_KEY_Z) == true) 77 { 78 mCameraPosition.z += +0.1f; 79 } 80 else if (mInput->KeyDownHold(GLFW_KEY_X) == true) 81 { 82 mCameraPosition.z += -0.1f; 83 } 84 85 //カメラ向き 86 if (mInput->KeyDownHold(GLFW_KEY_W) == true) 87 { 88 mCameraVector.y += +0.1f; 89 } 90 else if (mInput->KeyDownHold(GLFW_KEY_S) == true) 91 { 92 mCameraVector.y += -0.1f; 93 94 } 95 ///////////////////////////////////////////////////////////////////////////////// 96 else if (mInput->KeyDownHold(GLFW_KEY_A) == true) 97 { 98 mCameraVector.x += +0.1f; 99 100 } 101 else if (mInput->KeyDownHold(GLFW_KEY_D) == true) 102 { 103 mCameraVector.x += +0.1f; 104 105 } 106 /////////////////////////////////////////////////////////////////////////////// 107 mCameraVector.z = -1; 108 109 mCamera->setMove(mCameraPosition); //移動 110 mCamera->setCenter(mCameraVector); //向き 111 } 112 break; 113 114 115 case 2: //カメラ移動 116 { 117 if (mInput->KeyDownHold(GLFW_KEY_UP) == true) 118 { 119 printf("aaa\n"); 120 pos.y += 1.0f; 121 } 122 else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true) 123 { 124 pos.y += -1.0f; 125 } 126 else if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true) 127 { 128 pos.x += -1.0f; 129 } 130 else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true) 131 { 132 pos.x += +1.0f; 133 } 134 else if (mInput->KeyDownHold(GLFW_KEY_Z) == true) 135 { 136 137 } 138 else if (mInput->KeyDownHold(GLFW_KEY_X) == true) 139 { 140 141 } 142 } 143 break; 144 } 145 146 ExitGameKey(); //プログラム終了キー入力 147#undef ROTATE_SPEED 148} 149

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Munosuke222

2021/01/21 15:55

xの値って無限にマイナスにできるの?
stdio

2021/01/22 00:52

↑できないよ。 プログラム見てる限りだと、float型なので3.402823e+38ぐらいでオーバーフローして-3.402823e+38に値が帰っていく。 多分このプログラムではそこまでの値になってしまう心配はないと思う。
ikadzuchi

2021/01/22 00:55

「戦車の砲台のように」というのが何を指しているのか分かりませんw X,Y,Z軸の回転と並進を使って表現していただけませんかw
Munosuke222

2021/01/22 01:19

横に回転って書いてあるからてっきり極座標かなんかのxをいじって回転はできるけどxの値を適切に処理しなくて180℃越えたところで動かなくなるのかと思ったが、そもそも回転すらしてなさそうってことなのね…
guest

回答2

0

カメラの操作は視点座標と注視点座標の2つの座標があります。
戦車の砲台のようなカメラということは、視点座標は固定で注視点座標だけが位置を変更するということになります。その時単純に位置を移動させる処理を書いてしまうと、カメラの操作は視点座標と注視点座標の距離が離れてしまう事になるので、これではダメです。

その為、今回貴方がやるべき処理は注視点座標を回転させることです。
wikipediaにも計算式が掲載されていましたので、ここを参考に頑張ってみて下さい。

投稿2021/01/22 01:04

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/01/22 01:30

> 視点座標と注視点座標の距離が離れてしまう事 への対応(ベクトルの正規化的な処理)くらいは, mCamera->setCenter(mCameraVector); の中で然るべく行われている可能性もあり得るのではないかな,とか.
stdio

2021/01/22 01:50

回転しなくなると言う発言から、補正ぐらいは行われていそうですね。逆に行われているから、回転しなくなる現象に見舞われるのでしょう。 考え方の問題ですので、今は放置の方向でお願いします。
guest

0

ベストアンサー

mCamera->setCenter(mCameraVector); //向き

が何を起こすのか?という実装次第だが,
想像するに,

mCameraVector.x += +0.1f;

によって目的が達成されないのは,この操作では「向き」がある方向に漸近する結果になるからであろう.

下図で P がカメラの位置であり,
{A,B,C,D,E,....} と示したのが,mCameraVector に相当する場所だとしよう.
{A,B,C,D,E,....} はそれぞれ mCameraVector.x の値が異なる位置を示している.
仮に,ある時刻における mCameraVector の座標が C であるとしよう.
そこから

mCameraVector.x += +0.1f;

として x座標を増やすことで,注視点の位置はDやEの方向に動いていく.
(逆に,x座標をマイナスすれば,BやAの方向に動く)

このとき,x座標をどれだけ動かしても,「一定の速度で回転」する結果は得られない.
下図で「......」で示したように注視点がずっと右方向(X+側)に動いていくとき,
Pから注視点mCameraVectorへ向かうベクトル(下図ではPからCに向かうベクトルを「↑」で例示している)の向きというのは,水平に近づくけども,決して水平には達しない.

すぐに速度が下がりやがて回転しなくなる

というのはそのような状況であろう.

text

1----------------------------->X軸 2 3A B C D E ......................................... 45 P

投稿2021/01/22 01:25

編集2021/01/22 03:00
fana

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/01/22 01:41 編集

もしも mCameraVector というのが「カメラ座標系での値」だとしたら, mCameraVector.x += +0.1f; とかでも(その他,正規化だのなんだのが然るべく行われていれば)回転できる. 現象から想像するに,そうではない(:カメラ位置を表現している座標系での)値であろう,という仮定の上での回答になっている. その場合,現在の注視方向ベクトルと直交する方向の成分を増減すべきであろう. (回転させるために三角関数等々を持ち出してもよいが,回転量が常に十分に小さいならば,直交成分を増減して正規化する方が処理が簡便であろう.増減量をいくつにすればよいか?という話の側に多少しわ寄せが行くが.)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問