トップページ > プログラム > 2014年09月28日 > uBJ5g3Hm

書き込み順位&時間帯一覧

6 位/220 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000133108



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【C++】 DirectX初心者質問スレ Part38 【C】

書き込みレス一覧

【C++】 DirectX初心者質問スレ Part38 【C】
818 :デフォルトの名無しさん[sage]:2014/09/28(日) 19:11:49.32 ID:uBJ5g3Hm
映画とかアニメの演出で、カメラの画角を広げつつ拡大していくことで、撮影対象である人物の
画面に対する大きさを買えずに遠近感だけ変化させるやつがありますよね?
あれをゲーム画面で実現したいんですが、画角の変化の割合に対して、
拡大率をどのくらいに設定すれば良いのか、計算式はどうなるんでしょうか?
【C++】 DirectX初心者質問スレ Part38 【C】
820 :デフォルトの名無しさん[sage]:2014/09/28(日) 20:22:52.58 ID:uBJ5g3Hm
考えてみました。
被写体が画面にちょうどぴったり収まるサイズだったとして、
被写体Zにおける画面幅に対応するワールド長さが、θ(Y方向の画角)変更前(θa)とθ変更後(θb)で同じになればいいわけですよね。
カメラ自身は移動しないので、被写体Zの値は定数になるから、
Scale = 画角θaでの近クリップ面の高さ / 画角θbでの近クリップ面の高さ でスケーリングすれば良い事になります。
Fov方式だと近クリップ面の高さは znear * tanθ で表せるので、
Scale = (znear * tan(θa)) / (znear * tan(θb))
となって、
Sclae = tan(θa) / tan(θb)
ですかね?
【C++】 DirectX初心者質問スレ Part38 【C】
821 :デフォルトの名無しさん[sage]:2014/09/28(日) 20:29:02.69 ID:uBJ5g3Hm
ちょっと整理してみました。
被写体Zでの、画面高さに対応するワールド長さを H としたとき、
画角θ距離Zの場合 H = Z * tanθ ですから、
画角θa距離Zなら Ha = Z * tan(θa)
画角θb距離Zなら Hb = Z * tan(θb)
このとき、Ha = Hb * scale となるように scale を決定したいから
scale = Ha / Hb = tan(θa) / tan(θb)
【C++】 DirectX初心者質問スレ Part38 【C】
822 :デフォルトの名無しさん[sage]:2014/09/28(日) 20:38:34.98 ID:uBJ5g3Hm
間違えました。tan(θ/2) で計算しないとダメですね。
【C++】 DirectX初心者質問スレ Part38 【C】
825 :デフォルトの名無しさん[sage]:2014/09/28(日) 21:19:21.54 ID:uBJ5g3Hm
カメラも被写体も固定で、画角とスケーリング調整だけで表現するつもりです。
カメラの位置と動きが予め決まっているような場面では、
効果の掛け方によってカメラ座標が影響を受けない方がいいかな、と思ったので。
【C++】 DirectX初心者質問スレ Part38 【C】
829 :デフォルトの名無しさん[sage]:2014/09/28(日) 21:33:39.34 ID:uBJ5g3Hm
単純に ProjectionMatrix に対してスケーリング行列をかけていたのですが、実際にやってみた所、
画角変更前と変更後で得られる画像が全く同じになりました。
画角変更による画面変化が、スケーリングによって相殺された感じです。
ようやくわかりました。ドリーインていうのは必ずカメラ自体を動かす必要があったんですね。
【C++】 DirectX初心者質問スレ Part38 【C】
830 :デフォルトの名無しさん[sage]:2014/09/28(日) 21:47:58.54 ID:uBJ5g3Hm
となると問題はカメラを元位置からどれだけ動かす?って事なんですが、画面にぴったり収まるように写っている長方形(サイズW,H)がカメラからの距離 z にあったとして、画角θを変化させたときに、この長方形の(見かけの)大きさが変わらないようにZを調整してみます。
画角θ距離Zの場合 H = Z * tanθ ですから、
画角θa距離Zaなら Ha = Za * tan(θa)
画角θb距離Zbなら Hb = Zb * tan(θb)
このとき Ha = Hb にしたいわけですから Za * tan(θa) = Zb * tan(θb) の関係を保つように変化させればよいことになりますね
カメラを移動させて Z を変更したなら、移動後の画角は tan(θb) = tan(θa) * Za/Zb ただし tanθ = H/Z なので
tan(θb) = (Ha/Za) * Za/Zb = Ha/Zb すなわち
θb = atan2(Ha, Zb) ですね!
【C++】 DirectX初心者質問スレ Part38 【C】
832 :デフォルトの名無しさん[sage]:2014/09/28(日) 22:34:55.37 ID:uBJ5g3Hm
ありがとうございます。この計算式で試してみます


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。