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

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

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

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

Q&A

解決済

2回答

2002閲覧

座標変換でどこでどの順番でスケール、回転、平行移動を行うのか知りたい 自分の知識が正しいのか知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/09/03 01:21

編集2020/09/03 01:52

API: OpenGL

ローカル空間--(モデル変換)--------------↓
ワールド空間--(ビュー変換)--------------↓
カメラ空間--(投影変換)-----------------↓
クリップ空間--(透視変換)---------------↓
正規化デバイス座標--(ビューポート変換)--↓
|スクリーン空間 |

上記のように変換を行うことで3dが画面に描画されることを知ったのですが スケール、回転、平行移動はどこのステップどこの順で行うのでしょうか?

また上記の内容は正しいのでしょうか?APIによる多少の違いはあると思いますが概念的な部分は同じだと思うのですがどうなのでしょうか?

参考サイト: https://qiita.com/mebiusbox2/items/044c7a43b94e4ae250b7

{ "version":1, "vertexformat":"PosNormTex", "shader":"BasicMesh", "textures":[ "Assets/Cube.png" ], "specularPower":100.0, "vertices":[ [-0.5,-0.5,-0.5,0,0,-1,0,0], [0.5,-0.5,-0.5,0,0,-1,1,0], [-0.5,0.5,-0.5,0,0,-1,0,-1], [0.5,0.5,-0.5,0,0,-1,1,-1], [-0.5,0.5,0.5,0,1,0,0,-1], [0.5,0.5,0.5,0,1,0,1,-1], [-0.5,-0.5,0.5,0,0,1,0,0], [0.5,-0.5,0.5,0,0,1,1,0], [-0.5,0.5,-0.5,0,0,-1,0,-1], [0.5,-0.5,-0.5,0,0,-1,1,0], [-0.5,0.5,-0.5,0,1,0,0,-1], [0.5,0.5,-0.5,0,1,0,1,-1], [-0.5,0.5,0.5,0,1,0,0,-1], [-0.5,0.5,0.5,0,0,1,0,-1], [0.5,0.5,0.5,0,0,1,1,-1], [-0.5,-0.5,0.5,0,0,1,0,0], [-0.5,-0.5,0.5,0,-1,0,0,0], [0.5,-0.5,0.5,0,-1,0,1,0], [-0.5,-0.5,-0.5,0,-1,0,0,0], [0.5,-0.5,-0.5,0,-1,0,1,0], [0.5,-0.5,-0.5,1,0,0,1,0], [0.5,-0.5,0.5,1,0,0,1,0], [0.5,0.5,-0.5,1,0,0,1,-1], [0.5,0.5,0.5,1,0,0,1,-1], [-0.5,-0.5,0.5,-1,0,0,0,0], [-0.5,-0.5,-0.5,-1,0,0,0,0], [-0.5,0.5,0.5,-1,0,0,0,-1], [-0.5,0.5,-0.5,-1,0,0,0,-1] ], "indices":[ [2,1,0], [3,9,8], [4,11,10], [5,11,12], [6,14,13], [7,14,15], [18,17,16], [19,17,18], [22,21,20], [23,21,22], [26,25,24], [27,25,26] ] }

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

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

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

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

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

guest

回答2

0

ベストアンサー

スケール、回転、平行移動はどこのステップでどこの順で行うのでしょうか?

それらが「何のための計算なのか」とか「演算対象の値」等に完全に依存します.
つまり,あなたが何をやるのか次第.

例えば,あるオブジェクトのモデルデータが
「オブジェクトの「中心」を原点としたローカルな座標系で,X,Y,Zが-1~1の中に納まるサイズで用意されている」みたいなとき,
このモデルを
「ワールド座標系でのどこか(位置)に何らかの向き(回転)で何らかのサイズで配置したい」という場合,

私なら,平行移動を最後にやります.
この例ならば,回転とスケールの順序はどっちでも良い.

しかし,モデルデータが上記とは異なる形で定義されている場合,例えば,
「全ての頂点に関して,その座標値のx,y,zが全部正の値」みたいな形になっている場合,所望の位置と回転を達成するためには,ちょっと違う演算になるでしょう.
(この場合,私は個人的に「回転」を「モデルの中心まわり」で考えたいので,「並進→回転とスケール→並進」といった演算を行うかな.
まぁ,最初の並進は毎度行うのではなく初期処理あたりで済ませておく気もするが.)

投稿2020/09/03 01:33

編集2020/09/03 01:53
fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2020/09/03 01:36

質問ですが > モデルデータが上記とは異なる形で定義されている場合  とはなんでしょうか? 自分は.jsonで頂点座標を読み込む予定ですがモデルデータがどうというのは正直何が言いたいのでしょうか?例えばエディタの設定等の問題でしょうか?ブレンダー等の?
fana

2020/09/03 01:45

例えば立方体を表示したいとする. じゃあ,その立方体の8個の頂点の値って,どんな値ですかね? 誰か他人に「8個の頂点の(x,y,z)の座標を書いたテキストファイルを作ってくれ」と依頼したら, 結果はどんな座標値が書かれたファイルがもたらされるのか? 特に指定が無ければ,それは「ひとそれぞれ」な結果になると思う. どこかの頂点を(0,0,0)とする人もいるだろうし,立方体のど真ん中を(0,0,0)とする人もいるだろうし,他のパターンもあり得る. サイズが不明なのはまだ良い(?)として,立方体の辺がその座標値を記述する座標系の座標軸に対してわざわざ平行になっていない(なんかてきとーに回転している姿勢)かもしれない.
fana

2020/09/03 01:49

あなたはその渡されたファイルの記述に「応じて」必要な演算を行わねばならないだろう. 例えば,上記のように変な回転姿勢のデータから出発せねばならないのだとしたら,あなたは真っ先にそれに「回転」を施して,あなたが考えやすい姿勢のデータを作り出すのではないだろうか.
退会済みユーザー

退会済みユーザー

2020/09/03 01:54

度々質問ですが。.jsonの提示コードを追加しました。立方体だそうです。。あとは自分で平行移動でキューブのをz-して画面の表示範囲に持ってくるので大丈夫です。がこの場合はスケール、回転、平行移動はどうしたらいいのでしょうか?確認も含め教えていただきたいです。
fana

2020/09/03 02:05 編集

回答やコメントの内容がわかってますか? 端的に言えば,「何をしたいのかが具体的にわからん」相手に「どうしたらいい?」と問う意味は無い,ということなのですが. > 確認 に関しては,とりあえずあなたが思う演算を実際に実装してみたら良いのではないでしょうか. その結果が妥当ならはあなたの考えは正しいという確認が取れる. 演算の適用順序をわざと変えてみて意味を把握するのも良いでしょうし.
退会済みユーザー

退会済みユーザー

2020/09/13 10:56 編集

質問ですが座標の位置はどうなるのでしょうか?正規化デバイス座標系で作成した値をスケール、回転、。 平行移動ということはわかるのですが。何をするおもまずワールドでどの位置というのが重要な気がするのすがそのへんが知りたいです。
guest

0

APIによる多少の違いはあると思いますが概念的な部分は同じだと思うのですがどうなのでしょうか?

基本は同じですね。右手座標か左手座標なのか等の違いがあり、全12パターン程あったハズです。
こちらのサイトが分かりやすく解説してくれています。

投稿2020/09/03 01:31

stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2020/09/03 01:33

質問ですが >基本は同じですね。右手座標か左手座標なのか等の違いがあり、全12パターン程あったハズです。 とはスケール、回転、平行移動の場所と順番でしょうか?自分はOpenGLです
stdio

2020/09/03 01:40 編集

OpenGLならY軸が上の右て座標系なので、記載されているサイトの式がそのまま当てはまります。
退会済みユーザー

退会済みユーザー

2020/09/03 04:42

方程式でやる方法もありますが。もはや行列でやれって感じでいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問