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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

2回答

970閲覧

画面の真ん中が0,0の座標系を画面の左上が0,0の座標系に修正したい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/06/18 01:59

提示コードですが画面上がスクリーン座標での100,100の位置です。提示画像の左下が100,100の位置に描画したいのですがどうやってもうまく座標変換できません。数式がわからないのですがこういった場合どういう計算なのでしょうか?

イメージ説明

cpp

1 //矩形描画 2 void DrawRectangle(glm::vec2 pos, glm::vec2 size, glm::vec4 color) 3 { 4 float x = 1.0f / FrameWork::getWindowContext()->getSize().x; 5 float y = 1.0f / FrameWork::getWindowContext()->getSize().y; 6 float c = 1.0f / 255.0f; 7 glColor4f(color.x * c, color.y * c, color.z * c, color.w * c); 8 9//////////////////////////////////////////////////////////////////////////////// 10 glm::vec2 posA; 11 glm::vec2 posB; 12 posA.x = ((pos.x * x) - 0.5f) - 0.5f; 13 posA.y = ((pos.y * y) - 0.5f); 14 15 posB.x = ((pos.x + size.x) * x - 0.5f) - 0.5f; 16 posB.y = ((pos.y + size.y)* y - 0.5f); 17///////////////////////////////////////////////////////////////////////////////// 18 19 20 glRectf(posA.x, posA.y, posB.x, posB.y); 21 22 glFlush(); 23 } 24 25 26 27 28

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

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

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

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

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

fana

2021/06/18 03:05

タイトルに書かれている「画面の真ん中が0,0の座標系」においては,画面の左上の座標はいくつになるのか? →仮に(A,B)だとしよう. 他方,「画面の左上が0,0の座標系」においては,そこは当然ながら(0,0)なわけですよね. であれば, 前者の(A,B) と,後者の(0,0) が対応するような式になっているのか? を確認してみればよいのでは. (同様に,右上とか中心とかでも確認してみればいい)
退会済みユーザー

退会済みユーザー

2021/06/18 03:36

そもそもこの行為は正しいのでしょうか?
fana

2021/06/18 03:40

なんか毎度「正しいか?」って言いだすけど,そんなの誰にもわからないよ. あなたのプログラムの中でそれが必要な行為なのであれば,やるしかないのだし. そこのところを 知っている/判断できる のはあなただけだ.
guest

回答2

0

画面のXサイズの半分左にずらし
画面のYサイズの半分、上にずらせばいいだけですよね

投稿2021/06/18 03:52

y_waiwai

総合スコア87719

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

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

0

ベストアンサー

オーケー,話にいろいろと不明な点があるが,提示コードから推測しようじゃないか.

関数 DrawRectangle() に引数として入力されてくる座標は,
ウィンドウのクライアント領域の左上を(0,0)とした座標系の値であって,単位は[pixel]である,と.

で,この関数内の glRectf(posA.x, posA.y, posB.x, posB.y); で指定する座標は,
表示域の中心を(0,0)とした座標系での値にせなばならない(こっちの単位はなんとなく不明である),と.

そういうことかな.

なので,DrawRectangle() の引数の値を,glRectf() に渡す値に変換をしたい,と


コードから察するに,その変換は特別奇抜なものではなくて,ふつーに一次式で書けるものみたいだから,一次式

変換後 = a * 変換前 + b

のパラメータ a と b を決めればいいんだよね.

未知数は a と b の2つだから,
変換前←→変換後 の対応関係が2つあれば解けるよね.

例えば,x方向に関して,
glRectf() に渡す座標の世界では,表示域の左端のx座標は -0.5 なのだとしよう.
この左端はpixelの世界では0なのだから,この関係を使えば

-0.5 = a * 0 + b となり,b = -0.5 がわかる.

ウィンドウのど真ん中の[pixel]な座標が仮に 200 だとすれば,そこはglRectf() に渡す座標の世界では0なのだから,この関係を使えば

0 = a * 200 + b となる.b = -0.5 が分かっているのだから,a = 0.5/200 だよね.

投稿2021/06/18 04:03

編集2021/06/18 04:06
fana

総合スコア11632

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

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

退会済みユーザー

退会済みユーザー

2021/06/19 09:02

なるほど。質問ですが-1~1の座標系はなんていうのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問