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

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

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

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

C++

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

Q&A

0回答

2220閲覧

[OpenGL] カメラの視点回転が正しいのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/10/28 06:52

編集2021/10/31 07:18

提示コードですがCamera.cppのコメント部内部のコードなのですがsetLook()関数をMain.cppで使っているのですがcos.sinの使い方と視線の動かし方は正しいのでしょうか?

参考サイト: https://learnopengl.com/Getting-started/Camera

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.00001f, 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; //向き glm::vec3 up = glm::vec3(0, 1, 0); glm::vec3 cameraDirection = glm::normalize(position - vecLook); glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection)); glm::vec3 cameraUp = glm::cross(vecLook, cameraRight); view = glm::lookAt(glm::vec3(position.x, position.y, position.z), position + vecLook,up); } //////////////////////////////////////////////////////////////////////////////////////////////////////// // ##################################### 座標を取得 ##################################### 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

cpp

1 2//関数の外に宣言 初期値↓ 3float cameraLookSpeed = PI / 100; //視点移動速度 4 glm::vec3 cameraLook = glm::vec3(PI /2,PI,0); 5 6 7 8 9 if (FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT_CONTROL) > 0) 10 { 11 if (FrameWork::windowContext->getKeyInput(GLFW_KEY_LEFT) > (short)0) 12 { 13 cameraLook.x += -cameraLookSpeed; 14 } 15 else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_RIGHT) > (short)0) 16 { 17 cameraLook.x += cameraLookSpeed; 18 } 19 20 if (FrameWork::windowContext->getKeyInput(GLFW_KEY_UP) > (short)0) 21 { 22 cameraLook.y += cameraLookSpeed; 23 } 24 else if (FrameWork::windowContext->getKeyInput(GLFW_KEY_DOWN) > (short)0) 25 { 26 cameraLook.y += -cameraLookSpeed; 27 } 28 } 29 30FrameWork::Camera::setLook(glm::vec3(cos(cameraLook.x) * cos(cameraLook.y), sin(cameraLook.y), sin(cameraLook.x) * cos(cameraLook.y))); 31FrameWork::Camera::setPosition(cameraPos); 32

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

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

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

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

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

fana

2021/10/28 08:06 編集

とりあえず,この手の3Dの話における「ビュー行列 ("View Matrix")」について知る必要があるでしょう. 激しくググりましょう. あなたが使っている glm::LookAt() は引数から View Matrix を何やら計算して作ってくれる関数です. この関数の中身ってなにをやってるのか? みたいな解説をしている類の話を見つけてみるのもよいでしょう. (gluLookAtとかでも話の内容は同じハズなのでそっちでもよい) (回転行列の要素ってのは正規直交基底の基底ベクトルが並んでいるんだよね,というあたりを理解しておく必要があるかもしれません.) View Matrix が担うのが{並進,回転}からなる座標変換である,というあたりまで理解することと, あとは,回転と並進をまとめて 4x4 行列の形で表す話(同次座標)についてざっくりと学んでください. ここまでくれば,回転と並進を個別のデータとして更新したりそこから View Matrix を作ったりとかができるようになる(自明となる,というべきか)でしょう. 要約:個々の中身は言うほど難しい話ではないのですが,量としてはまぁ相応の勉強が必要でしょう.頑張ってください(そこはもう 頑張るしかない世界 なので). 補足:もちろん,ベクトルと行列とか三角関数とかいうやつらは前提の基礎知識として必要です.
退会済みユーザー

退会済みユーザー

2021/10/28 08:28

提示コードと文章を修正しました。
退会済みユーザー

退会済みユーザー

2021/10/28 08:38 編集

https://learnopengl.com/Getting-started/Camera こちらのサイトを参考にしているのですが、こういった答えが出たのですがこれは正しいのでしょうか? FrameWork::Camera::setLook(glm::vec3(cos(x) * cos(y),sin(y),sin(x) * cos(y))); FrameWork::Camera::setPosition(glm::vec3(0,100,300));
fana

2021/10/28 08:42

> 参考にしているのですが、どうすればいいのでしょうか? しっかりと参考にしてください. ちゃんと読んで理解してください.あなたにとって有用な事柄を学び,それをご自身の実装に活かしてください. それには相当の時間や労力を必要とするでしょうけども, 【この手の「お決まりの話」を把握していない状態で3Dな話のプログラミングをやりつづけることによって浪費された(そしてこのままだとさらに浪費されるであろう)時間や労力】に比べれば,はるかにマシな程度だと思います.
fana

2021/10/28 08:51

念のため述べておきますが, 突き放している とか 厳しく当たっている とかいうことではないです. 単に,前述のとおり, > 頑張るしかない世界 だというだけです. というのは,必要な事柄を説明しようとしても,それは結局,参考先として挙げられてくるような場所に書かれている諸々の話をするしかないわけで,この場ではそんなことはとても無理なのです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問