質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

Q&A

解決済

1回答

2667閲覧

OpenGL 回転を原点を中心に回転する方法

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

0グッド

1クリップ

投稿2020/09/24 05:33

編集2020/09/24 07:29

オブジェクトを中心に位置を固定でそのまま回転させたいのですがどうすればいいのでしょうか?今起きてる現象は視点を中心に回転するということなのですが自分は原点を中心に回転させたいです。

//視点を中心に回転してしまっている現状の画像
イメージ説明

Github: https://github.com/Shigurechan/OpenGL

cpp

1 2//頂点データ 3 vertex[0].Position[0] = -1; 4 vertex[0].Position[1] = 1; 5 vertex[0].Position[2] = -10; 6 7 vertex[1].Position[0] = -1; 8 vertex[1].Position[1] = -1; 9 vertex[1].Position[2] = -10; 10 11 vertex[2].Position[0] = 1; 12 vertex[2].Position[1] = -1; 13 vertex[2].Position[2] = -10; 14 15 vertex[3].Position[0] = 1; 16 vertex[3].Position[1] = 1; 17 vertex[3].Position[2] = -10;

cpp

1//回転行列 2void Game::Set_rotate(float xx,float yy,float zz,float r) 3{ 4 glm::quat someQuat = glm::angleAxis(r,glm::vec3(xx,yy,zz)); 5 glm::mat4 ro = glm::toMat4(someQuat); 6 7 memcpy(rotate, glm::value_ptr(ro), sizeof(float) * 16); 8 9} 10

cpp

1 2//ワールド行列を計算 3void Game::CreateWorldMatrix() 4{ 5 glm::mat4x4 t = glm::make_mat4(move) * glm::make_mat4(scale) * glm::make_mat4(rotate); 6 memcpy(wordlMatrix,glm::value_ptr(t),sizeof(float) * 16); 7} 8

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 07:30

文章を編集しました。
guest

回答1

0

ベストアンサー

//頂点データ
vertex[0].Position[2] = -10; //←これ(他の3つの頂点も同様)

というのが,物事を面倒にしているように思えます.

現状の回転の中心は,この「頂点データ」を考えている世界での原点(0,0,0)であろうと思いますので,この-10のせいで四角形の中心と回転中心とが揃わない形となっているのだと推測します.

おそらく,「四角形を(ワールド座標系かカメラ座標系での)Z=-10の位置に配置する」のがこの-10の意図であろうと思いますが,この「配置」のために平行移動の変換moveが存在するのでしょうから,であれば,大元の頂点座標を-10とする必要はありません.

↓ よって

「頂点データ」の箇所では,四角形の中心が原点(0,0,0)に一致するように頂点座標を与えるのが最もわかりやすいと考えます.
このケースでは,vertex[0].Position[2] = 0;(他の3つの頂点も同様)
とすればそうなるでしょう.
で,この四角形を「配置する位置」に関してはmoveの側で別途解決すればよいでしょう.

投稿2020/09/24 08:52

fana

総合スコア11708

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

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

退会済みユーザー

退会済みユーザー

2020/09/24 09:02 編集

出来ません。なぜか視点を中心に移動してしまい。おかしな動きをしてしまいます。 ですが平行移動は普通に出来ます。原因はなんでしょうか? 質問ですが ワールド行列(回転、移動、拡大縮小) , 透視射形行列  , 頂点 という3つの行列があるということでよろしいのでしょうか?
fana

2020/09/24 09:12

> 原因はなんでしょうか? コード断片だけ見てもこの回答内容以上の事柄はわかりません(だからといって全体コードを提示されてもわざわざ見る暇な人がいるかはわかりません). 結局のところ,他の質問に対して書いたように,各マトリクスの中身の値の妥当性から逐次確認していくしかないと思います.
退会済みユーザー

退会済みユーザー

2020/09/24 09:15

わかりました。質問ですが ワールド行列(回転、移動、拡大縮小) , 透視射形行列  , 頂点 という3つの行列があるということでよろしいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問