半直交半透視投影行列を作成する方法


8

私は、縦軸が正射投影される射影行列の式を作成しようとしましたが、横軸はそれに対して遠近法を持っています。

したがって、ビュー錐台は次のようになります。 フラストラムを見る

私は、正投影と透視投影の公式と、それらがどのように達成されたかを研究しました。そして、それらを変更して、私が望む投影に到達しようと試みました。私には、1つの軸をZにスケーリングすることはできず、もう1つの軸をZにスケーリングすることは不可能であるように思われました(または、それらを異なる倍率でスケーリングさせることはできませんでした)。

私が望む視点に到達することは可能ですか?もしそうなら、射影行列はどのようになりますか?


3
それはひどく奇妙に見える錐台です...そのようなものが必要な理由を教えてください。
Alexandre Desbiens、2015

今取り組んでいるゲームのカメラに使いたいです。これは2Dサイドビューゲームですが、カメラが垂直に移動するときにオブジェクトが地面や天井から来るのではなく、オブジェクトを互いの上にパララックスで移動させたいです。
Pepijn Willekens、2015

それは素晴らしいプロジェクトであり、そのための質問です。その答えが見つかるといいのですが(この種のカメラは毎日目にするものではありません)。
Alexandre Desbiens、2015

回答:


2

この射影行列がうまくいくはずです:

.tg  {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
<table class="tg">
  <tr>
    <th class="tg-031e">1/r</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
    <th class="tg-031e">0</th>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">1/t</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
  </tr>
  <tr>
    <td class="tg-031e">0</td>
    <td class="tg-031e">0</td>
    <td class="tg-031e">-2/(f-n)</td>
    <td class="tg-031e">-(f+n)/(f-n)</td>
  </tr>
</table>

r =ニアプレーンの幅の半分

t =ニアプレーンの高さの半分

f = farplaneまでの距離

n =ニアプレーンまでの距離

だから、例えば、ピッキングしてみてください:

r = 0.1(幅は0.2になります)

t = 0.5(高さは1.0になります)

f = 1000(距離1000の遠方平面)

n = 1(距離1のニアプレーン)


0

残念ながら、これは単に射影行列を変更するだけでは可能だとは思いません。射影行列の後、最終的なスクリーン座標は(x、y、z)をwで割ることによって計算されます。透視行列の場合、wはzに設定されます。正投影マトリックスの場合、wは1に設定されます。水平と垂直で異なるw値を使用することはできません。この質問に対するもう1つの答えは、単なる標準的な正投影マトリックスです。

シェーダー自体にアクセスでき、別のステップを追加する用意がある場合は、正射投影を使用するだけで、手動で水平遠近法補正を行うことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.