Bagaimana cara membuat matriks proyeksi setengah-setengah-setengah-perspektif

8

Saya sudah mencoba membuat formula untuk matriks proyeksi di mana sumbu vertikal Anda diproyeksikan secara ortografis tetapi sumbu horizontal Anda akan memiliki perspektif untuk itu.

Jadi tampilan frustum akan terlihat seperti ini: Lihat frustrum

Saya mempelajari bagaimana rumus proyeksi ortografis dan proyeksi perspektif dan bagaimana mereka mencapai mana. Dan mencoba memodifikasi mereka untuk mencoba mencapai proyeksi yang saya inginkan. Sepertinya saya tidak mungkin untuk memiliki satu skala sumbu ke Z dan yang lainnya tidak (atau memiliki skala pada faktor yang berbeda).

Mungkinkah untuk mencapai perspektif yang saya inginkan? Jika demikian, seperti apa bentuk proyeksi matriks?

Pepijn Willekens
sumber
3
Itu salah satu frustum yang terlihat sangat aneh ... Bisakah Anda berbagi dengan kami mengapa Anda perlu sesuatu seperti itu?
Alexandre Desbiens
Saya ingin menggunakannya untuk kamera permainan yang sedang saya kerjakan. Ini adalah permainan sideview 2D, tapi saya ingin benda bergerak paralax di atas satu sama lain, tanpa membuatnya berasal dari tanah / langit-langit saat kamera bergerak vertikal.
Pepijn Willekens
Itu adalah proyek dan pertanyaan yang bagus. Saya harap Anda akan menemukan jawaban untuk itu (meskipun jenis kamera ini bukan yang Anda lihat setiap hari).
Alexandre Desbiens

Jawaban:

2

Matriks proyeksi ini harus melakukan trik:

.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 = setengah lebar nearplane

t = setengah ketinggian nearplane

f = jarak ke pesawat jauh

n = jarak ke dekat pesawat

Jadi misalnya, coba pilih:

r = 0,1 (lebar akan menjadi 0,2)

t = 0,5 (tinggi akan 1,0)

f = 1000 (pesawat jauh pada jarak 1000)

n = 1 (nearplane pada jarak 1)

walkingBird
sumber
0

Sayangnya, saya tidak berpikir ini mungkin dengan hanya mengubah matriks proyeksi. Setelah matriks proyeksi, koordinat layar akhir dihitung dengan membagi (x, y, z) dengan w. Untuk matriks perspektif, w diatur ke z. Untuk matriks ortografis, w diatur ke 1. Anda tidak dapat memiliki nilai w yang berbeda untuk horizontal versus vertikal. Jawaban lain untuk pertanyaan ini hanyalah matriks ortografi standar.

Jika Anda memiliki akses ke shader itu sendiri dan bersedia menambahkan langkah lain, Anda bisa menggunakan proyeksi ortografis tetapi melakukan koreksi perspektif horizontal secara manual.

Mach Kobayashi
sumber