提示コードですが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
とりあえず,この手の3Dの話における「ビュー行列 ("View Matrix")」について知る必要があるでしょう.
激しくググりましょう.
あなたが使っている glm::LookAt() は引数から View Matrix を何やら計算して作ってくれる関数です.
この関数の中身ってなにをやってるのか? みたいな解説をしている類の話を見つけてみるのもよいでしょう.
(gluLookAtとかでも話の内容は同じハズなのでそっちでもよい)
(回転行列の要素ってのは正規直交基底の基底ベクトルが並んでいるんだよね,というあたりを理解しておく必要があるかもしれません.)
View Matrix が担うのが{並進,回転}からなる座標変換である,というあたりまで理解することと,
あとは,回転と並進をまとめて 4x4 行列の形で表す話(同次座標)についてざっくりと学んでください.
ここまでくれば,回転と並進を個別のデータとして更新したりそこから View Matrix を作ったりとかができるようになる(自明となる,というべきか)でしょう.
要約:個々の中身は言うほど難しい話ではないのですが,量としてはまぁ相応の勉強が必要でしょう.頑張ってください(そこはもう 頑張るしかない世界 なので).
補足:もちろん,ベクトルと行列とか三角関数とかいうやつらは前提の基礎知識として必要です.
勉強の目標を示すならば,
https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=5184
の話に出てきている計算の意味がわかるようになること,かな.
提示コードと文章を修正しました。
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));
> 参考にしているのですが、どうすればいいのでしょうか?
しっかりと参考にしてください.
ちゃんと読んで理解してください.あなたにとって有用な事柄を学び,それをご自身の実装に活かしてください.
それには相当の時間や労力を必要とするでしょうけども,
【この手の「お決まりの話」を把握していない状態で3Dな話のプログラミングをやりつづけることによって浪費された(そしてこのままだとさらに浪費されるであろう)時間や労力】に比べれば,はるかにマシな程度だと思います.
念のため述べておきますが,
突き放している とか 厳しく当たっている とかいうことではないです.
単に,前述のとおり,
> 頑張るしかない世界
だというだけです.
というのは,必要な事柄を説明しようとしても,それは結局,参考先として挙げられてくるような場所に書かれている諸々の話をするしかないわけで,この場ではそんなことはとても無理なのです.
あなたの回答
tips
プレビュー