提示コードの///コメント内部のコードですが原点を中心ではなく画像の中心を中心に回転させたいのですがなぜ画像自体が動いてしまうのでしょか?本来であれば画面の左上に描画されるはずのですが?これはなぜなのでしょうか?
画像は提示コードのangle 変数部の数値0の場合とそうじゃない場合の画像です。
このコードで原点を真ん中にずらしたものを変数mに入れてその行列をvecRotate分回転させて値がrorate変数格納という処理なのでがこの処理で
図形の場所がずれる原因がわかりません。
cpp
1 glm::mat4 m = glm::translate(translate, glm::vec3(size.x * 0.5f, size.y * 0.5f,0)); //平行移動 2 rotate = glm::rotate(m,angle, vecRotate);
#include "DrawTest_2D.hpp" #include <iostream> #include "Shader.hpp" #include <glm/glm.hpp> #include <glm/gtx/transform.hpp> #include <glm/gtc/matrix_transform.hpp> //コンストラクタ DrawTest_2D::DrawTest_2D() { shader = std::make_shared<Shader>("BasicMono_2D.vert", "BasicMono_2D.frag"); //シェーダー //頂点配列 struct Vertex { GLfloat position[2]; }; //頂点情報 Vertex rectangleVertex[6] = { //頂点 {0.0f, 1.0f}, {1.0f, 0.0f}, {0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f}, }; //vao glGenVertexArrays(1, &vao); glBindVertexArray(vao); //vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); //頂点 GLint attrib = shader->getAttribLocation("vertexPosition"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); //モデル行列のパラメータを初期化 size = glm::vec2(100.0f,100.0f); vecScale = glm::vec3(size.x, size.y, 1.0f); //拡大縮小 vecRotate = glm::vec3(0.0f, 0.0f, -1.0f); //回転 angle = 20.0f; //回転量 vecTranslate = glm::vec3(0.0f, 0.0f, 0.0f); //平行移動 //モデル行列 translate = glm::translate(glm::mat4(1), vecTranslate); //平行移動 glm::mat4 m = glm::translate(translate, glm::vec3(size.x * 0.5f, size.y * 0.5f,0)); //平行移動 std::cout << "m 行列" << std::endl; std::cout << m[0].x << " , " << m[0].y << " , " << m[0].z << " , " << m[0].w << std::endl; std::cout << m[1].x << " , " << m[1].y << " , " << m[1].z << " , " << m[1].w << std::endl; std::cout << m[2].x << " , " << m[2].y << " , " << m[2].z << " , " << m[2].w << std::endl; std::cout << m[3].x << " , " << m[3].y << " , " << m[3].z << " , " << m[3].w << std::endl; std::cout << std::endl; std::cout << std::endl; rotate = glm::rotate(m,angle, vecRotate); //回転 std::cout << "rotate 行列" << std::endl; std::cout << rotate[0].x << " , " << rotate[0].y << " , " << rotate[0].z << " , " << rotate[0].w << std::endl; std::cout << rotate[1].x << " , " << rotate[1].y << " , " << rotate[1].z << " , " << rotate[1].w << std::endl; std::cout << rotate[2].x << " , " << rotate[2].y << " , " << rotate[2].z << " , " << rotate[2].w << std::endl; std::cout << rotate[3].x << " , " << rotate[3].y << " , " << rotate[3].z << " , " << rotate[3].w << std::endl; std::cout << std::endl; std::cout << std::endl; //translate = glm::translate(translate, vecTranslate); //平行移動 scale = glm::scale(glm::mat4(1), vecScale); //拡大縮小 //ビュー /* glm::vec3 pos = glm::vec3(0, 0, 1); //座標 glm::vec3 center = glm::vec3(0, 0, -1); //向き glm::vec3 up = glm::vec3(0, 1, 0); //上方向 view = glm::lookAt(pos, center, up); */ //projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形 projection = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f, -1.0f, 1.0f); //透視射形 } //更新 void DrawTest_2D::Update() { } //描画 void DrawTest_2D::Draw() { shader->setEnable(); shader->setBindAttribVertex("vertexPosition"); /*########## Unifrom ##########*/ shader->setUniform4f("uFragment", glm::vec4(0.0, 0.0, 1.0, 1.0)); shader->setUniformMatrix4fv("uTranslate", translate); shader->setUniformMatrix4fv("uRotate", rotate); shader->setUniformMatrix4fv("uScale", scale); shader->setUniformMatrix4fv("uProjection", projection); shader->setUniformMatrix4fv("uView", view); glDrawArrays(GL_TRIANGLES, 0, 6); shader->setDisable(); } //デストラクタ DrawTest_2D::~DrawTest_2D() { glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); }
glsl
1/*######################################################################### 2# 単色の2D描画 3###########################################################################*/ 4#extension GL_ARB_explicit_attrib_location: enable 5 6/*########## 頂点情報 ##########*/ 7layout(location = 0) in vec2 vertexPosition; //頂点座標 8 9/*########## フラグメント ##########*/ 10layout(location = 1) out vec4 vFragment; //頂点カラー 11 12/*########## Uniform ##########*/ 13uniform mat4 uScale; //スケール 14uniform mat4 uRotate; //回転 15uniform mat4 uTranslate; //平行移動 16uniform mat4 uProjection; //正射形行列 17uniform mat4 uView; //ビュー行列 18uniform vec4 uFragment; //描画色 19 20void main() 21{ 22 23 24 25 26 27 vec4 vertex = vec4(vertexPosition,0.0,1.0); //頂点座標 28 mat4 model = uTranslate * uRotate * uScale; //モデル行列 29 //gl_Position = (uProjection * uView * model) * vertex; 30 gl_Position = uProjection * model * vertex; 31 32 33 34 35 vFragment = uFragment; //カラー 36}
回答1件
あなたの回答
tips
プレビュー