提示コードのコメント部内部のコードですが提示画像のようにカメラの視点を回転させているのですが最初は早くて回転し続けるたびに少しずつ回転が遅くなるのですがこれはなぜでしょうか?
試したこと
x,y, をx = 10; としたところその場にカメラの視点が回転します。
camera.cppのコメント部を確認しました、がなぜ段々遅くなるのかわかりません。
Camera.cpp
#include "../header/Camera.hpp" #include <glm/glm.hpp> #include <glm/gtx/transform.hpp> #include <glm/gtc/matrix_transform.hpp> #include "../header/Window.hpp" #include "../header/Init.hpp" std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::vertex = std::make_shared<std::vector<FrameWork::D2::VertexAttribute>>(0); //頂点配列 glm::mat4 FrameWork::Camera::scale = glm::mat4(); //拡大縮小 glm::mat4 FrameWork::Camera::rotate = glm::mat4(); //回転 glm::mat4 FrameWork::Camera::translate = glm::mat4(); //平行移動 //描画行列 glm::vec3 FrameWork::Camera::position = glm::vec3(0,0,0); //座標 glm::vec3 FrameWork::Camera::vecLook = glm::vec3(0,0,-1); //向き(視線) glm::mat4 FrameWork::Camera::view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); //ビュー行列 glm::mat4 FrameWork::Camera::projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 10000.0f); //透視射形行列 // ##################################### 初期化 ##################################### void FrameWork::Camera::Init() { vertex->resize(6); //頂点配列を初期化 } // ##################################### 頂点属性を取得 ##################################### std::shared_ptr<std::vector<FrameWork::D2::VertexAttribute>> FrameWork::Camera::getVertexAttribute() { return vertex; } // ##################################### 座標を設定 ##################################### void FrameWork::Camera::setPosition(glm::vec3 p) { position = p; //座標 } /////////////////////////////////////////////////////////////////////////////////////////////////// // ##################################### 視線を設定 ##################################### void FrameWork::Camera::setLook(glm::vec3 l) { vecLook = l; //向き view = glm::lookAt(glm::vec3(position.x, position.y, position.z), vecLook, glm::vec3(0, 1, 0)); } ////////////////////////////////////////////////////////////////////////////////////////////////// // ##################################### 座標を取得 ##################################### glm::vec3 FrameWork::Camera::getPosition() { return position; } // ##################################### 視線を取得 ##################################### glm::vec3 FrameWork::Camera::getLook() { return vecLook; } // ##################################### 3D ビュー行列を取得 透視射形行列 ##################################### glm::mat4 FrameWork::Camera::getViewProjection() { return projection * view; } // ##################################### 2D ビュー行列を取得 正射形 ##################################### glm::mat4 FrameWork::Camera::getProjection_2D() { return glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f); } // ###################### デストラクタ ###################### FrameWork::Camera::~Camera() { }
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 cubeFile; FrameWork::D3::LoadObj("Model/Cube.obj",cubeFile); FrameWork::D3::Object cube(cubeFile); FrameWork::ObjFile groundFile; FrameWork::D3::LoadObj("Model/ground.obj",groundFile); FrameWork::D3::Object ground(groundFile); float y = 0; float x = 0; float angleY = 0; float angleX = 0; float vecSpeed = 10; while (*FrameWork::windowContext) { FrameWork::windowContext->FrameUpdate(glm::vec4(0,0,0,255)); if(FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) { x += vecSpeed; // printf("left\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) { x += -vecSpeed; // printf("right\n"); // printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) { y += vecSpeed; // printf("up\n"); // printf("%f , %f \n",x,y); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) { y += -vecSpeed; // printf("down\n"); // printf("%f , %f \n",x,y); } if(FrameWork::windowContext->getKeyInput(GLFW_KEY_A) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_D) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(0,1,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_W) > (short)0) { angleY = 0.001; cube.setRotate(glm::vec3(1,0,0),angleY); } else if(FrameWork::windowContext->getKeyInput(GLFW_KEY_S) > (short)0) { angleY = -0.001; cube.setRotate(glm::vec3(1,0,0),angleY); } ////////////////////////////////////////////////////////////////////////// FrameWork::Camera::setLook(glm::vec3(x,y,-1)); FrameWork::Camera::setPosition(glm::vec3(0,0,200.0f)); ////////////////////////////////////////////////////////////////////////// //Cube cube.shader->setEnable(); cube.setPosition(glm::vec3(0,10,0)); cube.setScale(glm::vec3(30,30,30)); cube.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,0,100,255))); //cube.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); //cube.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); //cube.shader->setUniform3f("lightPos", glm::vec3(0,0,10.0f)); //cube.shader->setUniform3f("viewPos",FrameWork::Camera::getPosition()); cube.Renderer(); cube.shader->setDisable(); //Ground ground.shader->setEnable(); ground.setPosition(glm::vec3(0,-50,-5)); ground.setScale(glm::vec3(20,20,20)); //ground.shader->setUniform3f("objectColor", glm::vec3(1.0f, 0.5f, 0.31f)); //ground.shader->setUniform3f("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); //ground.shader->setUniform3f("lightPos", glm::vec3(0,0,10)); //ground.shader->setUniform3f("viewPos", FrameWork::Camera::getPosition()); ground.shader->setUniform4f("uFragment",FrameWork::GetGlColor(glm::vec4(0,100,0,255))); ground.Renderer(); ground.shader->setDisable(); FrameWork::windowContext->Wait(); FrameWork::windowContext->SwapBuffers(); } return 0; }
自分で書いたコードではないのなら出典明示を(この指摘は1回や2回じゃないはず)
そうでないならせめてきちんとデバッグしてから他人に聞いてください。
回答1件
あなたの回答
tips
プレビュー