SAND STORM

朝ぼらけ

2011年10月5日

OFP/ARMA:CWA – 画面解像度と描写範囲

Filed under: 未分類 — Tags: , — sajin @ 00:56

Operation Flashpointという解像度に合わせて自動的に描画量が調整されず、手動で縦と横のFOV(描画範囲)を調整できる3D video gameを例にその正しい比率を探る。

OFP/ARMA: CWAは昔一般的だった4:3のmonitor解像度を前提としており、そのwidthとheightの描画範囲を

fovTop=0.750000;
fovLeft=1.000000;

と設定している。

1920×1200=16:10におけるTop 0.75\Left 1.2という正しい設定での描写。4:3に横方向の描写範囲が追加されており、違和感がない。

(ただし、銃眼などHUD類は2Dで引き伸ばされてしまい、これを4:3以外で避けることはできない。この手の3D部分はFOV変更で合うが、2Dgraphicは調整されないgameは多い)

1920×1200 Top 0.75\Left 1.0のdefault setting。

4:3の量を16:10の解像度で表示すると引き延ばし描画になって、妙に狭いというか近く感じる。

1920×1200 Top 1.0\Left 2.0という縦を4/3倍して横を二倍にしたsetting。今度は描写範囲が広すぎて魚眼lensの様になってしまった。

さっきと逆にTop 2.0/Left 1.0という縦をdefaultの二倍以上にしたsetting。奇妙極まりない描写になっている。

最後はTop 7.5/Left 12という縦横共に十倍にしたsetting。描写範囲が広すぎて最早何がなんだかわからない。恐らく真後ろまで含めた一周分以上が映り込んでいると思われる。


◇Aspect ratioの原理

Coding Horror: Widescreen and FOV

通常の3D video gameでFOVとして設定できるのはx=horizontal(width)のFOVのみだが、OFP/ARMA: CWAではy=vertical(height)のFOVが設定できる。y fovが固定されていればそうややこしくないのだが、両方が変動するので原理的なことから学んでいく。

3D描写の原理的な所でのfovは角度を表す。aspect ratioは以下の式になる。

Aspect Ratio = y/x = tan(vertical FOV/2)/tan(horizontal FOV/2)

tangentは円に接する直角を持つ三角形のopposite(対辺)をadjacent(底辺)で割ると出る。縦横それぞれのfov角度を1/2にして考えると、それはpanelに向けて直角三角形ができるように垂線を降ろしたことになりtangentが算出できる。

Sine, Cosine and Tangent @ MathsIsFun

図にあるようにadjacent辺はpanelまでの長さでありxを算出する際にも、yを算出する際にも同一である。oppositeはそれぞれx辺/2、y辺/2となる。

Aspect Ratio =  tan(vertical FOV/2)/tan(horizontal FOV/2)=(y/2/adj)/(x/2/adj) = y/x

# なぜtangentが用いられるかというとsine,cosine,tangentの中で唯一panelまでの距離すなわち倍率と同期するadjacentと描画sizeすなわち解像度/2になるoppositeを用いるから。sine=op/hy,cosine=ad/hy。円の半径rに値するのはhypotenuse(斜辺)。

aspect ratioすなわちy/xの比率に縮尺(adjacent辺。上の図でのLine of Sight)を適用したものが解像度になる。

ビューポートとクリッピング (Direct3D 9) @ MSDN

[式による算出]

OFP/ARMA: CWAではdefaultで

fovTop=0.750000;
fovLeft=1.000000;

と設定されている。これは4:3を前提としたものでfovTopがvertical,fovLeftがhorizontalだ。以下ではfovLeftをf(x),fovTopをf(y)とする。

4:3におけるf(x)=1.0、f(y)は1にaspect比を掛けた1*3/4=0.75となっており、4:3における4が1であるということがすべての基準となっている。

4:3解像度の縦もしくは横と解像度を同一にすることで、一方の縮尺が合うことになり、widthの解像度を合わせた際は4:3の1が対応し、heightの解像度を合わせた際は0.75が対応する。そうして縮尺(倍率)を合わせた上でOFP側の設定値4:3=1:0.75と目標のaspectのそれを比較する。

・16:10の場合

4:3=40:30

16:10=48:30

48:40=48/40=1.2 , f(x)=1*1.2=1.2

30/30=1 , f(y)=0.75*1=0.75

・5:4の場合

5:4=20:16

4:3=20:15

20/20=1 , f(x)=1*1=1

16/15=1.06666…. , f(y)=0.75*1.07=0.8025

循環小数なので切りのいいところで切り上げる。小数点以下二桁の差異は人間の目にはほとんど意味を為さない。

・16:9の場合

4:3=40:30

16:9=48:27

40:48=1.2 , f(x)=1*1.2=1.2

30:27=0.9 , f(y)=0.75*0.9=0.675

4:3とxもyも一致しない場合はどうすればいいのだろうか。もっとも近い縮尺まで倍率を上げ、その上で両方の比率を計算すればいい。16:10や5:4はたまたまxもしくはyが合致したに過ぎない。

上で出した結果は本来それだけの量の範囲をprogram側が描写しなければならないということ。解像度だけを広げて描画量をそのままにすると、上に挙げた画像の様に狭くなったりやたらと描画量が多い描写になる。

注意しなければならないのは、monitorなどのcatalog specのaspect比率とheight/widthで行った本物のaspect比は必ずしも一緒でないことだ。前者は大体同じだから便宜的にそのaspect比として売っていることがある。もちろん後者の正しい比率を用いて算出しなければ正しい描画範囲、比率にならない。


◇User Interfaceの調整

User InterfaceというよりHUD類の表示位置と長さは同じuserinfo.cfigの

uiTopLeftX=0.000000;
uiTopLeftY=0.000000;
uiBottomRightX=1.000000;
uiBottomRightY=1.000000;

で設定する。

どのような解像度に指定しようと、uiTopLeftX/Yで0が左端、1が右端に、uiTopLeftX/Yで0が上端、1が下端になる。

よって三画面monitorなどにすると、横軸で0は一番左のmonitorの左端、真ん中のmonitorの左端は0.333333…。右monitorの左端は0.66666…、右端が1となる。

このUI設定はgame内の3D描写や銃眼など2D描画には影響せず、hint,隊員,情報表示などHUD類のみに適用される(例外的にtitle画面のみ3D描写もUIにつれて拡大縮小する)。16:10程度なら引き伸ばされてもどうということはないが、monitorを増やしたりすると設定しなければ到底見れたものではない。

銃眼が引き伸ばされるからとこれで直そうとしても無駄である。

OFP Aspect Ratio @ Faguss’ Website – ArmAの設定を元にaspect ratioとUIの調整値を載せてある他、個別のUIを各mod用に細かく調整したものまでfile化してある。


関連記事

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment


sand-storm.net