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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

1回答

919閲覧

opnegl その回転を維持したまま別の軸を回転する方法

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

0クリップ

投稿2021/10/17 05:13

提示コードのmain.cpp部のコメント部のコードですが。左に回転したらその回転を維持したまま別の軸に回転する方法が知りたいです。回転行列をどのように触ればいいのでしょうか?提示コードTransform.cppsetRotate()関数部

イメージ説明

main.cpp
#include "../header/FrameWork.hpp" #include "../header/Resource.hpp" #include <iostream> #include "../header/Camera.hpp" int main() { FrameWork::Init(glm::ivec2(800, 600), glm::ivec2(4,2), "FrameWork"); // 初期化 FrameWork::Camera::Init(); //カメラ初期化 FrameWork::ObjFile file; FrameWork::D3::LoadObj("Model/test.obj",file); FrameWork::D3::Object object(file); float y = 0; float x = 0; float angleY = 0; float angleX = 0; while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255)); if(FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) { x += 0.01; // printf("left\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) { x += -0.01; // printf("right\n"); // printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) { y += 0.01; // printf("up\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) { y += -0.01; // printf("down\n"); // printf("%f , %f \n",x,y); } //////////////////////////////////////////////////////////////////////////////////////////// if(FrameWork::windowContext->getKeyInput(GLFW_KEY_A) > (short)0) { angleY += 0.001; object.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_D) > (short)0) { angleY += -0.001; object.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_W) > (short)0) { angleY += 0.001; object.setRotate(glm::vec3(1,0,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_S) > (short)0) { angleY += -0.001; object.setRotate(glm::vec3(1,0,0),angleY); } ///////////////////////////////////////////////////////////////////////////////////////////// FrameWork::Camera::setLook(glm::vec3(x,y,-1)); FrameWork::Camera::setPosition(glm::vec3(0,0,200)); object.Renderer(); FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }
Transfrom.cpp
/*##################################################################################################################################### # 3D Transform ########################################################################################################################################*/ // ##################################### コンストラクタ ##################################### FrameWork::D3::Transform::Transform() { position = glm::vec3(0,0,0); //座標 scale = glm::vec3(1,1,1); //スケール rotateAngle = 0.0f; //回転ラジアン rotateVector = glm::vec3(0,0,0); //回転方向 //行列を初期化 matScale = glm::scale(glm::mat4(1), glm::vec3(1.0f, 1.0f, 1.0f)); //スケール matRotate = glm::rotate(0.0f, glm::vec3(0.0, 0.0, 0.0)); //回転 matTranslation = glm::translate(glm::mat4(1), glm::vec3(0.0f, 0.0f, 0.0f)); //平行移動 } /* ############################################################### 設定 ############################################################### */ // ##################################### 座標 設定 ##################################### void FrameWork::D3::Transform::setPosition(glm::vec3 p) { position = p; matTranslation = glm::translate(glm::mat4(1), glm::vec3(p.x, p.y,p.z)); } // ##################################### スケール 設定 ##################################### void FrameWork::D3::Transform::setScale(glm::vec3 s) { matScale = glm::scale(glm::mat4(1), glm::vec3(s.x, s.y, s.z)); } // ##################################### 回転 設定 ##################################### void FrameWork::D3::Transform::setRotate(glm::vec3 vec,float r) { rotateAngle = r; rotateVector = vec; //matRotate = glm::rotate(glm::mat4(1), glm::degrees(r), glm::vec3(0.0, 0.0, 0.0)); matRotate = glm::rotate(glm::degrees(r), vec); //matRotate = glm::toMat4(qu); } /* ############################################################### 取得 ############################################################### */ // ##################################### 座標 取得 ##################################### glm::vec3 FrameWork::D3::Transform::getPosition() { return position; } // ##################################### スケール 取得 ##################################### glm::vec3 FrameWork::D3::Transform::getScale() { return scale; } // ##################################### 回転 取得 ##################################### glm::vec3 FrameWork::D3::Transform::getRotateVector() { return rotateVector; } // ##################################### 回転ラジアン 取得 ##################################### float FrameWork::D3::Transform::getRotateAngle() { return rotateAngle; } /* ############################################################### 行列 取得 ############################################################### */ // ##################################### 平行移動 行列 取得 ##################################### glm::mat4 FrameWork::D3::Transform::getMatTranslation() { return matTranslation; } // ##################################### スケール 行列 取得 ##################################### glm::mat4 FrameWork::D3::Transform::getMatScale() { return matScale; } // ##################################### 回転 行列 取得 ##################################### glm::mat4 FrameWork::D3::Transform::getMatRotate() { return matRotate; } // ##################################### デストラクタ ##################################### FrameWork::D3::Transform::~Transform() { }

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

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

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

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

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

guest

回答1

0

ベストアンサー

回転マトリクス R に,追加の回転を表す回転マトリクス R' を乗じることによって更新すれば良いのではないでしょうか.
その場合,

  • R = R * R'
  • R = R' * R

の2パターンが考えられるので,
RFrameWork::D3::Transform クラスが管理する形なのであれば,このクラスに両方のメソッドを追加すればよいのではないでしょうか.(メソッドを呼ぶ側がどちらを使うかを判断する)

投稿2021/10/18 01:15

fana

総合スコア11712

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問