提示コードのmain.cpp
部のコメント部のコードですが。左に回転したらその回転を維持したまま別の軸に回転する方法が知りたいです。回転行列をどのように触ればいいのでしょうか?提示コードTransform.cpp
のsetRotate()
関数部
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() { }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。