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

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

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

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

1336閲覧

ワールド座標変換とビュー射影変換行列を用意したがこの次どうすればいいのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

0クリップ

投稿2020/09/15 03:45

3DCGの座標変換ですが色々な説明があり色々な解説があり困っています。まずワールド座標変換と呼ばれる(スケール、回転、平行移動)の行列を用意しました。そのあとビュー射影行列を用意しましたがこのあとどうすればいいのでしょうか?

参考サイト: http://www.inftyproject.org/suzuki/lectures/java/ToBegin.pdf
参考サイト2: https://yttm-work.jp/gmpg/gmpg_0003.html
参考サイト3: http://marupeke296.com/DXG_No72_ViewProjInfo.html
参考サイト4: https://ja.wikibooks.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/3D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF
参考サイト: https://monolizm.com/sab/pdf/%E7%AC%AC%E4%B8%89%E5%9B%9E_%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E8%B3%87%E6%96%99(%E3%81%AA%E3%82%8B%E3%81%BB%E3%81%A93D%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E6%8F%8F%E7%94%BB%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF).pdf

ビュー行列 * プロジェクション行列 でビュー射影配列を得る事ができるはずです。

cpp

1 2class Game 3{ 4public: 5 Vector3 cv; 6 7 Game(); 8 9 bool Initialization(); 10 11 bool RunLoop(); 12 13 void Update(); 14 void GenerateOutput(); 15 16 17private: 18 bool mIsRunLoop;//メインループ 19 20 21 Vector3 pos; 22 23 24 //ビュー行列 25 GLfloat view[4][4] = { 26 {0,0,0,0}, 27 {0,0,0,0}, 28 29 {0,0,0,0}, 30 {0,0,0,1} 31 32 }; 33 34 //プロジェクション 35 GLfloat projection[4][4] = { 36 { 0,0,0,0 }, 37 { 0,0,0,0 }, 38 39 { 0,0,0,0 }, 40 { 0,0,0,0 }, 41 }; 42 43 44 //頂点バッファー 45 GLfloat Vertex[18] = 46 { 47 -0.5, 0.5, 1.0, 48 -0.5, -0.5, 1.0, 49 0.5, -0.5, 1.0, 50 51 -0.5, 0.5, 1.0, 52 0.5, 0.5, 1.0, 53 0.5, -0.5, 1.0 54 }; 55 56 57 58 59 60 61 //スケール行列 62 const GLfloat scale[4][4] = { 63 {1,0,0,0}, 64 {0,1,0,0}, 65 {0,0,1,0}, 66 {0,0,0,1} 67 }; 68 69 70 //回転 71 float r = 1; 72 const GLfloat rotate[4][4] = { 73 (pos.x * pos.x +(1 - cos(r)) + cos(r)), 74 (pos.x * pos.y +(1 - cos(r)) + pos.z * sin(r)) 75 ,(pos.x * pos.z +(1 - cos(r)) - pos.y * sin(r)),0, 76 77 78 (pos.x * pos.x +(1 - cos(r)) + sin(r)), 79 (pos.y * pos.y +(1 - cos(r)) + cos(r)), 80 (pos.y * pos.z +(1 - cos(r)) + pos.x * sin(r)),0, 81 82 83 (pos.x * pos.z + (1 - cos(r)) - pos.z * sin(r)), 84 (pos.y * pos.z +(1 - cos(r)) - pos.x * sin(r)), 85 (pos.z * pos.z + (1 - cos(r)) + cos(r)),0, 86 }; 87 88 89 //平行移動 90 float mx = 0; 91 float my = 0; 92 float mz = 0; 93 const GLfloat move[4][4] = 94 { 95 1,0,0,mx, 96 0,1,0,my, 97 0,0,1,mz, 98 0,0,0,1, 99 }; 100

GLSL

1#version 400 2//頂点シェーダー 3 4in vec3 position;//頂点座標 5 6uniform mat4 scale;//スケール行列 7uniform mat4 rotate;//回転行列 8uniform mat4 move;//平行移動行列 9 10 11 12void main() 13{ 14 vec4 v = vec4(position ,1.0); 15 v =* scale; 16 v =* rotate; 17 v =* move; 18 19 20 21 22 23 gl_Position = scale * rotate * move * v; 24 //gl_Position = v; 25} 26 27

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • viewやprojectionの中身が全0になっているので,まずはまともな内容にしましょう.

もちろん自前で用意しても良いですが,例えばglmというライブラリを使えば,glm::Perspectiveglm::lookAtで計算してもらえるので楽です.

  • viewやprojectionも(sclaseやrotate等と同じように)シェーダ側に転送してやる必要がありますね.
  • あとは,シェーダ側でviewやprojectionを用いた計算をすればOK

現状,scale,rotate,moveの3個の行列が個別にシェーダ側に渡されていて,シェーダにてそれらを乗じているようですが,
(大抵これらが1セットでしょうから)scale * rotate * moveの結果をCPU側で計算した結果(:1個のマトリクス)を転送すれば済むのではないかと思います.
例えば,この3つを乗じた結果をMとし,同様にprojection * viewも最初に計算しておいた結果をPVとするならば,この2つの行列M,PVをシェーダ側に渡してやれば良いでしょう.
この場合,シェーダ側のコードは,
gl_Position = PV * M * v;
のような形になるかと思います.

投稿2020/09/15 04:07

fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2020/09/15 04:49

質問ですがviewとprojectionはどういう値にすればいいのでしょうか?何段混乱してきましたw
fana

2020/09/15 04:55

それがその膨大な参考サイト群(あるいは私が↑で挙げたやつ)にきっと書いてあるのではないかと…
退会済みユーザー

退会済みユーザー

2020/09/15 04:57

わかりました。頑張ってみます
fana

2020/09/15 04:58

純粋に数学な話かと思うので,把握したいならば,結局そういったのをわかるまで読むしかないですし… 中身の計算内容はよくわからんけど使いたいだけならば,回答に挙げたような,引数を渡せば行列を作ってくれるようなやつを使えば済みます.
退会済みユーザー

退会済みユーザー

2020/09/15 05:17

行列等の数学は自分で調べながら頑張っているのですがどうも目先の成果に目が言ってしまってなんだかこれなんだこれっていう感じになってしまうので質問しました。 https://www.sist.ac.jp/~kanakubo/research/hosoku/gyoretu.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問