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

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

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

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

デバッグ

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

C++

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

解決済

opengl カメラの視点を等速で移動させる方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

1回答

-4評価

0クリップ

968閲覧

投稿2021/10/25 09:00

編集2021/10/25 10:25

提示コードのコメント部内部のコードですが提示画像のようにカメラの視点を回転させているのですが最初は早くて回転し続けるたびに少しずつ回転が遅くなるのですがこれはなぜでしょうか?

試したこと

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; }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2021/10/25 10:03

自分で書いたコードではないのなら出典明示を(この指摘は1回や2回じゃないはず) そうでないならせめてきちんとデバッグしてから他人に聞いてください。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

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

デバッグ

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

C++

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