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

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

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

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

1回答

1596閲覧

透視変換のズームに関して 「ゲームプログラマになる前に覚えておきたい技術」と本の内容での質問

aaaaaaaaaaa

総合スコア13

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

0クリップ

投稿2016/09/04 02:57

ゲームプログラマになる前に覚えておきたい技術
という本で質問です

p402の「画角の導入」
というところで

透視変換とズーム(拡大縮小?)の式

qx = (px * s) / -pz

qx 変換後のx座標
px 変換前のx座標
pz 変換前のz座標
s ズーム係数(x座標を何倍するか?)


あり

sを視野から求めたい
(
例えば、視野が90度だとs = 1
視野が45度だとs = 0.4142...
)
のです

この本でこのsを視野から求める為の式
s = 1 / tan(0.5*θ)

求めているのですが
この本での
求め方がよくわかりません

本では以下の様にかかれてありました


透視変換のxの式を思い出してみると

qx = (px * s) / -pz

となる

このsをθ(視野の角度)から求める方法を考えるわけだ
まず、sイコールの形に直してみよう

s = (-pz * qx) / px

そして、
ここではプラスを使おう

s = -px / px

つまり、sというのはz/xのことである
だから、xを底辺、zを高さとする直角三角形があれば
タンジェントからsが求まるはずだ視界ギリギリのことを考える
視界ギリギリにおいてqxは1か-1になる
透視変換後の座標の範囲は-1から1だからだ
(中略)

px / -pz = tan(0.5*θ)

これは逆数を取れば、まさにsイコールの式の右辺に一致し、

-pz / px = 1 / tan(0.5*θ) = s

となる
これでめでたく角度からズーム係数sが求まった

なぜqxに1(か-1)を代入しているのかが
(意味が)わかりません
(
qxに1を代入して得られるのは
任意の頂点?px
を1にするようなsが求められるだけではないのですか
)
回答お願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

px/-pz = tan(0.5*θ) となるような点(px,pz)が
投影面の境界ぎりぎりの位置に投影してほしい.
境界ぎりぎりの位置というのはここでは qx=±1 であるということなので,

qx = (px * s) / -pz

なる式に,これらの条件を入れればsの値が得られます.

投稿2016/09/05 07:38

fana

総合スコア11656

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

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

aaaaaaaaaaa

2016/09/05 10:56

回答ありがとうございます なぜ投影面の境界ギリギリの位置に投影するのですか これをしても 任意の頂点が投影面のギリギリにくるようなsが求められる だけなのではないのですか 変な事をいっていたらすみません
aaaaaaaaaaa

2016/09/05 11:11

任意の頂点を投影面の任意の位置に投影したい場合 など の事が考えられていない と思うのです
fana

2016/09/05 11:53

仮想的なピンホールカメラの画角がθになるようなパラメタsの値を求めるという話ではないのですか? 手元に,パラメタsの値を自由に変化させて画角を調整できるカメラがある状態を想像してください. このカメラを例えば「画角90度に調整しろ」と言われたらどうするでしょうか. カメラを固定し,カメラからの方向が45度(画角90度の半分)の所に存在する対象を観測しながら, sを増やしたり減らしたりして,観測対象が丁度画像ギリギリに映るように調整すれば もくてきが達せられるのではないでしょうか.
aaaaaaaaaaa

2016/09/05 12:14

回答ありがとうございます >仮想的なピンホールカメラの画角がθになるようなパラメタsの値を求めるという話ではないのですか? そうだと思いますが 聞きたいのは 仮想的なピンホールカメラの画角がθになるようなパラメタsの値を求める のに なぜ qxに1を代入するかということです 自分の解釈がおかしいかもしれないので へんな事を言っていたらすみません
aaaaaaaaaaa

2016/09/05 12:55

>観測対象(px、pzの事?)が丁度画像ギリギリに映るように調整すれば(qx = 1になる様にする?) 頂点(px,pz) て 投影面ギリギリに投影させたい頂点なのですか px、pzとはどの様な変数なのですか
aaaaaaaaaaa

2016/09/05 13:48

先ほどの回答のおかげで理解できそうです px、pzが何なのかよくわかっていなかったので 本の内容がわからなくなっていたと思われます px、pzは投影面の端に投影したい頂点だという事がわかっていませんでした px、pzは投影面の端に投影したい頂点だから 1 = (px * s) / -pz これから求められたsは投影面の端に投影したいpx、pzを1にするようなsだから (対象の頂点(のx座標)を画面の端にうつす様なsだから) このsを他の全ての頂点にかければ pxを1にする様な画面が得られる ということでよろしいでしょうか
aaaaaaaaaaa

2016/09/05 13:57

↑ 訂正 × px、pzを1にするようなsだから 〇 pxを1にするようなsだから
fana

2016/09/06 00:24

> このsを他の全ての頂点にかければ > pxを1にする様な画面が得られる 末尾のこの部分が何を言わんとしているのかがわかりません. 「画角がθであるならば,θ/2の方角(にある物)が丁度画像端に投影される」 ということを利用して「画角がθになるsの値」を算出しているという話ですから, 当然,算出されたsの値というのは 「その値を用いて投影結果画像を作成したならば,画像の画角がθになるようなs」でしょう. 他の頂点というのが何を指しているのかわかりませんが,各頂点の(カメラ座標系での)位置に対応する場所にそれぞれ投影されることになると思います. (カメラの真正面にある点は画像のど真ん中に,カメラから見てちょっとだけ右方向にある点は画像の真ん中よりもそれなりにちょっとだけ右の位置に…)
aaaaaaaaaaa

2016/09/06 01:43

回答ありがとうございます >他の頂点というのが何を指しているのかわかりませんが,各頂点の(カメラ座標系での)位置に対応する場所にそれぞれ投影されることになると思います. 関数などで視野角を指定して透視変換行列を作って (例えばDirectXではD3DXMatrixPrespectiveFovLH関数で透視変換行列を作って) その透視変換行列を(カメラ座標系での)各頂点に掛けて 透視変換とズームが適用された各頂点を得る 他の頂点とはそのときズームが適用される(カメラ座標系での)各頂点 の事 という事が言いたいのですが (たぶん) >各頂点の(カメラ座標系での)位置に対応する場所にそれぞれ投影されることになる と同じ事を言っています 後 できれば px、pzがどのような値?なのか と 前に投稿したしたコメントの末尾 の 上の部分の考え方 でいいのかも 明示してほしいのです 回答よろしくお願いします
aaaaaaaaaaa

2016/09/06 01:58

表現がおかしかったかもしれません 画面の端にする頂点 と 他の頂点 という意味で書いたのですが ではなく 各頂点 と書いたほうが良かったかもしれません 何を言っているのかわからなかったらすみません
fana

2016/09/06 02:29

> px、pzがどのような値?なのか 画角がθとなるためのsを算出する際に考える(px,pz)についてであれば, >「画角がθであるならば,θ/2の方角(にある物)が丁度画像端に投影される」 > ということを利用して「画角がθになるsの値」を算出 するわけですので,「θ/2の方向に位置する点(px,pz)」を考えます. ここで,「θ/2の方向に位置する」とは,すなわち pxとpzとの関係が > px/-pz = tan(0.5*θ) を満たすということですよね. なので,この条件を満たす(px,pz)であれば何でもよいです. (必要な条件はカメラから点を見たときの方角だけであって,  カメラから点までの距離は(0でさえなければ)どうでもいい(投影箇所に影響が無い)ので,(px,pz)の候補は無限にあります.  どれか好きなのを使えばよいです.) 例えば,pzの方を「カメラからの奥行が1になるように(すなわちpz=-1かな)」とか適当に決めてしまえば, (px,pz) = ( tan(0.5*θ), -1 ) です.これが簡単で良いかもしれません. 一旦所望画角θになるためのsの値を求めたら あとはそのsの値を,実際に投影処理を行いたい対象である頂点群の投影処理(=例えば変換行列を作ってどうの…)に用いればよいです.
aaaaaaaaaaa

2016/09/06 03:55

回答ありがとうございます >「画角がθであるならば,θ/2の方角(にある物)が丁度画像端に投影される」 > ということを利用して という箇所がよくわかりません 例えば 画角が90度であるならば45度の方角にある物が端にうつる ということは解りますが これをどう利用するのかがわかりません
aaaaaaaaaaa

2016/09/06 11:07 編集

>「画角がθであるならば,θ/2の方角(にある物)が丁度画像端に投影される」 > ということを利用して っていうのは 画角がθの視野のθ/2の方角にある頂点が 1(qx = 1)になるという 事を言っているのですか つまりこれを式に直して 1 = (px * s) / -pz から sを求めれば px/-pzを1(画面の端)にする様なsが求められる という事でしょうか
aaaaaaaaaaa

2016/09/06 13:56 編集

自分で考えてわかったので書きたいと思います 画角θの視野内にある物を画面いっぱいにうつしたい 画角がθの視野のθ/2の方角にある頂点が 1(qx = 1)になる様にsを作れば (sを各頂点に掛ければ) 画角θの視野にうつっている物が 画面いっぱいにうつる これらの考えから 視野の端になる点px/-pz(px/-pz = tan(0.5θ)を満たす点) を 1(画面の端の頂点)に変換するようなsを求める 1 = (qx * s) / -pz s = -pz/px 視野内に移っている物 を画面いっぱいにうつすようなsは -pz / px という事がわかった px、pzは視野の端の頂点で画角と関係があるから -pz / px は 画角で表せる -pz / px = 1 / tan(0.5*θ) これらから s = 1 / tan(0.5*θ) これで画角θから 視野内の各頂点を画面のいっぱいに映すようなs が求まった という解釈でよろしいでしょうか
fana

2016/09/07 00:21

よいと思います.
aaaaaaaaaaa

2016/09/07 00:54

回答ありがとうございます 何度も答えていただきありがとうございました 助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問