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

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

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

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

C++

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

Q&A

解決済

2回答

665閲覧

画面の左上を(0,0)する座標変換する方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2022/01/29 08:47

編集2022/01/30 01:22

提示画像ですがxpos,ypos変数を0\,0にすると画面の真ん中に表示されるのですがこれを画面の左上に描画させるには提示コードの////コメント部の行をどのように変換したらいいのでしょうか?色々試しましたが実装出来ません。座標系は中央が(0,0)のopengl座標系です。

イメージ説明

// ##################################### 描画 ##################################### void FrameWork::Text::Renderer(const glm::mat4 view,const glm::vec2 position, const FrameWork::CharacterTexture* character)const { glm::vec2 screenSize = glm::vec2(1.0f / windowContext->getSize().x, 1.0f / windowContext->getSize().y); if (character != NULL) { glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glm::vec2 pos = position; pos.y = windowContext->getSize().y - position.y - character->pixelSize; //printf("%f\n", (pos.x * screenSize.x) + ((float)screenSize.x / 2.0f)); printf("%f\n",(pos.y * screenSize.y) - ((float)screenSize.y / 2.0f)); ////////////////////////////////////////////////////////////////////////////// float xpos = (pos.x * screenSize.x) + ((float)screenSize.x / 2.0f); float ypos = (pos.y * screenSize.y) - ((float)screenSize.y / 2.0f); ////////////////////////////////////////////////////////////////////////////// float w = (character->size.x * character->scale.x) * screenSize.x; float h = (character->size.y * character->scale.y) * screenSize.y; FrameWork::Text::vertex[0].position[0] = xpos; FrameWork::Text::vertex[0].position[1] = ypos + h; FrameWork::Text::vertex[0].uv[0] = 0.0f; FrameWork::Text::vertex[0].uv[1] = 0.0f; FrameWork::Text::vertex[1].position[0] = xpos; FrameWork::Text::vertex[1].position[1] = ypos; FrameWork::Text::vertex[1].uv[0] = 0.0f; FrameWork::Text::vertex[1].uv[1] = 1.0f; FrameWork::Text::vertex[2].position[0] = xpos + w; FrameWork::Text::vertex[2].position[1] = ypos; FrameWork::Text::vertex[2].uv[0] = 1.0f; FrameWork::Text::vertex[2].uv[1] = 1.0f; FrameWork::Text::vertex[3].position[0] = xpos; FrameWork::Text::vertex[3].position[1] = ypos + h; FrameWork::Text::vertex[3].uv[0] = 0.0f; FrameWork::Text::vertex[3].uv[1] = 0.0f; FrameWork::Text::vertex[4].position[0] = xpos + w; FrameWork::Text::vertex[4].position[1] = ypos; FrameWork::Text::vertex[4].uv[0] = 1.0f; FrameWork::Text::vertex[4].uv[1] = 1.0f; FrameWork::Text::vertex[5].position[0] = xpos + w; FrameWork::Text::vertex[5].position[1] = ypos + h; FrameWork::Text::vertex[5].uv[0] = 1.0f; FrameWork::Text::vertex[5].uv[1] = 0.0f; shader->setEnable(); glBufferSubData(GL_ARRAY_BUFFER, 0, vertex.size() * sizeof(FrameWork::VertexAttribute_Text), vertex.data()); shader->setUniformSampler2D("text",0,character->textureID); glActiveTexture(GL_TEXTURE0); shader->setUniform4f("uFragment", character->color); shader->setUniformMatrix4fv("uViewProjection", view); glDrawArrays(GL_TRIANGLES, 0, vertex.size()); //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); shader->setDisable(); } else { std::cerr << "void FrameWork::D2::Text::Draw(glm::vec2 pos)const Error: character == NULL" << std::endl; assert(0); } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/01/29 11:36

自分の過去の質問欄に出てこないためバグかと思ってもう一回質問してしまいました。削除しました。
guest

回答2

0

ベストアンサー

以下の式で実装出来ました。

cpp

1float xpos = (pos.x * screenSize.x) - 0.5f; 2 float ypos = (pos.y * screenSize.y) - 0.5f; 3

投稿2022/01/30 01:29

編集2022/01/30 01:31
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

横サイズの1/2と縦サイズの1/2を足すか引けばいいのでは

投稿2022/01/29 09:06

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2022/01/29 09:17

どういう意味でしょうか?ちょっとわからないのですがw
y_waiwai

2022/01/29 09:25

中央原点の座標は xは1/2足して、yは1/2引いて極性反転すれば、左上原点の座標になりますね
退会済みユーザー

退会済みユーザー

2022/01/29 09:28

float xpos = (pos.x * screenSize.x) + 0.5f; float ypos = (pos.y * screenSize.y) - 0.5f; でしょうか?画面に何も表示されないのですがこれはこれでまた別の問題でしょか?
y_waiwai

2022/01/29 09:47

float xpos = pos.x + (float)screenSize.x/2; ですね
退会済みユーザー

退会済みユーザー

2022/01/29 10:59 編集

float xpos = (pos.x * screenSize.x) + ((float)screenSize.x / 2.0f); float ypos = (pos.y * screenSize.y) - ((float)screenSize.y / 2.0f); y軸ともにこうでしょうか?
y_waiwai

2022/01/29 12:16

実際にいくつかの中央原点の座標を入れて結果がどうなるのか見ていけば理解できるかと思いますよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問