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

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

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

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

デバッグ

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

C++

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

Q&A

解決済

2回答

1517閲覧

[デバッグ][OpenGL] 補正しても矩形が画面の0,0の場所に描画されない誤差の原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

0グッド

0クリップ

投稿2021/05/06 04:02

編集2021/05/06 04:33

提示コードのDrawRotate();関数の//Transform部ですがなぜ矩形が0,0の場所にぴったり描画されないのでしょうか?OpenGLでは画面の真ん中が0,0なので画像の半分のサイズを足してるのですが原因がどうしてもわかりません。なぜ画像の位置がずれてしまうのでしょか?回転は真ん中を中心に行っています
イメージ説明

cpp

1 2 3//回転描画 4void Rectangle::DrawRotate(glm::vec2 start, glm::vec2 end,float angle, glm::vec4 color) 5{ 6 if (isDefaultShader == true) { 7 setEnable(); 8 } 9 10 setVertexALLColor(color); //頂点カラーを再設定 11 12 glBindVertexArray(vao); 13 14 //頂点カラー 15 GLint attrib = getAttribLocation("vertexColor"); 16 glEnableVertexAttribArray(attrib); 17 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexColor), rectangleVertex, GL_STATIC_DRAW); 18 glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 19 setBindAttribFragment("vertexColor"); 20 21 //Transform 22 //回転 23 setSizeScale(glm::vec2((end.x - start.x) , (end.y - start.y))); //サイズ 24    setRotate(angle); 25 setScale(glm::vec2(getSizeScale().x, getSizeScale().y)); //スケール 26 setTranslate(glm::vec3(start.x + (getSizeScale().x / 2.0f), start.y + (getSizeScale().y / 2.0f, 0.0f))); //平行移動 27 28 29 //Uniform 30 setUniformMatrix4fv("uTranslate", translate); 31 setUniformMatrix4fv("uRotate", rotate); 32 setUniformMatrix4fv("uScale", scale); 33 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 34 35 glDrawArrays(GL_TRIANGLES, 0, 6); 36 glBindVertexArray(0); 37 38 39 if (isDefaultShader == true) { 40 setDisable(); 41 } 42} 43 44

cpp

1#include "Transform_2D.hpp" 2#include "Actor.hpp" 3 4// ###################### コンストラクタ ###################### 5Transform_2D::Transform_2D() 6{ 7 size = glm::vec2(0,0); 8 9 //行列を初期化 10 scale = glm::scale(glm::mat4(1), glm::vec3(0.0f,0.0f,0.0f)); 11 rotate = glm::rotate(0.0f,glm::vec3(0.0, 0.0, 1.0)); 12 translate = glm::translate(glm::mat4(1), glm::vec3(0.0f,0.0f,0.0f)); 13} 14 15// ###################### メンバ関数 ###################### 16 17//スケール 18void Transform_2D::setScale(glm::vec2 s) 19{ 20 scale = glm::scale(glm::mat4(1), glm::vec3(s.x,s.y,0.0f) + glm::vec3(size.x,size.y,0.0f)); 21} 22 23//回転 24void Transform_2D::setRotate(float a) 25{ 26 glm::mat4 m = glm::translate(translate, glm::vec3(size.x * 0.5f, size.y * 0.5f, 0)); //平行移動 27 rotate = glm::rotate(m, a, glm::vec3(0.0,0.0,1.0)); //回転 28 m = glm::translate(translate, glm::vec3(-size.x * 0.5f, -size.y * 0.5f, 0)); //平行移動 29 rotate = glm::rotate(m, a, glm::vec3(0.0, 0.0, 1.0)); //回転 30} 31 32//平行移動 33void Transform_2D::setTranslate(glm::vec3 t) 34{ 35 translate = glm::translate(glm::mat4(1), t); 36} 37 38//画像サイズを設定 39void Transform_2D::setSizeScale(glm::vec2 s) 40{ 41 size = s; 42 scale = glm::scale(glm::mat4(1), glm::vec3(s.x, s.y, 0.0f)); 43} 44 45//画像サイズを設定 46glm::vec2 Transform_2D::getSizeScale() 47{ 48 return size; 49 50} 51 52// ###################### デストラクタ ###################### 53Transform_2D::~Transform_2D() 54{ 55 56} 57

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

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

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

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

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

guest

回答2

0

ベストアンサー

cpp

1 setSizeScale(glm::vec2((end.x - start.x) , (end.y - start.y))); //サイズ 2    setRotate(angle); 3 setScale(glm::vec2(getSizeScale().x, getSizeScale().y));

部ですがsetRotate()で以下ようになっているためでした。

サイズ足すサイズになっているため座標がずれていました。

cpp

1//スケール 2void Transform_2D::setScale(glm::vec2 s) 3{ 4 scale = glm::scale(glm::mat4(1), glm::vec3(s.x,s.y,0.0f) + glm::vec3(size.x,size.y,0.0f)); 5}

投稿2021/05/06 06:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

※ 回答ではありません

setTranslate(glm::vec3((start.x + getSizeScale().x) / 2.0f, (start.y + getSizeScale().y) / 2.0f, 0.0f)); //平行移動

setTranslate(glm::vec3((start.x - getSizeScale().x) / 2.0f, (start.y - getSizeScale().y) / 2.0f, 0.0f));
が正解だったりしません?

投稿2021/05/06 04:29

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2021/05/06 04:32

自分も編集しましたが違いました。またこれも間違えていました。
episteme

2021/05/06 04:36

アテが外れましたか、スンマセン。 # で、なぜに「高評価」なんですか? (ゴマスリは不要です)
退会済みユーザー

退会済みユーザー

2021/05/06 04:37

何かの誤差だと思されます。
episteme

2021/05/06 04:40 編集

回転した"あと"で画像の中心求めたら誤差出るんちゃいます? (しらんけど)
退会済みユーザー

退会済みユーザー

2021/05/06 04:47

順序を変えましたたがわかりません
episteme

2021/05/06 05:17

あなたが定義したクラスなので、あなたがわからんのなら誰にもわからんかもです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問