Objek dua kali lebih dekat muncul dua kali lebih besar?

16

Jadi saya berpikir tentang membuat game 2D di mana Anda juga bisa bergerak di sepanjang sumbu Z, dengan mengubah di lapisan mana Anda berada. Tergantung pada kedalamannya saya ingin skala sprite 2D saya.

Suatu ketika, seseorang telah menunjukkan kepada saya sebuah demo di mana dia memiliki banyak sprite 2d, dan dengan menggulirnya dia bisa mengubah kedalaman kamera. Jadi ketika memperbesar, objek akan mendekati pemain, dan tampak lebih besar. Lalu saya bertanya-tanya, seberapa besar seharusnya sebuah benda ketika mendekati 1 unit. Bagaimana Anda menghitungnya? Jadi pria itu mengatakan kepada saya: Ada satu aturan dasar yang saya gunakan: "objek dua kali lebih dekat, muncul dua kali lebih besar."

Sekarang, dengan mengujinya sendiri, saya tahu aturan itu tidak berlaku di dunia nyata;) Tetapi apakah ada beberapa konstanta yang digunakan dalam perhitungan dunia nyata untuk perspektif atau sesuatu? Atau formula?

Saya tahu ini mungkin bukan tempat terbaik untuk mengajukan pertanyaan seperti itu, tetapi karena ini adalah satu-satunya situs yang saya gunakan untuk pertanyaan yang terkait dengan permainan, dan konteks saya adalah sebuah permainan, saya pikir saya akan mencobanya. Juga, saya agak berharap bahwa ada orang ini di sini yang tahu segalanya tentang perspektif 3D dan matriks atau sesuatu, karena mungkin berhubungan dengan game 3D;)

tl; dr:

"sebuah objek dua kali lebih dekat, muncul dua kali lebih besar" Itu tidak benar di dunia nyata. Tapi konstanta atau rumus mana yang benar?

Berry
sumber
3
Saya tidak tahu apa jawabannya, tetapi saya tahu bagaimana saya bisa mengetahuinya. Ambil beberapa gambar sesuatu. Mungkin selembar kertas. Bawa mereka dari jarak yang diketahui berbeda dan kemudian lakukan perhitungan untuk menghitung berapa banyak gambar yang diambil oleh selembar kertas dan tentukan perbandingannya dengan itu. Bisa jadi eksperimen yang menyenangkan!
SpartanDonut
Saya ingin tahu mengapa tidak ada yang menyebutkan apa pun tentang logaritma alami ...
Chad Harrison
4
Kenapa itu tidak benar? Saya pikir itu benar.
Ivan Kuckir
@hydroparadise Apa hubungannya logaritma natural dengan pertanyaan ini?
Nathan Reed
Aku hanya bertele-tele di sini, aku tahu, tapi "Dua kali sedekat" adalah ungkapan yang aneh. Bukankah seharusnya "Setengah dari jauh"? 'Dua kali' lebih besar, tetapi jika sesuatu semakin dekat maka jarak semakin kecil.
MrVimes

Jawaban:

19

Secara umum itu benar, tergantung pada sudut pandang Anda dan ke arah mana ia bergerak, serta sudut pandangnya.

Contoh perspektif untuk objek

Perhatikan bagaimana dalam tampilan kamera pertama, karena blok Merah tegak lurus terhadap tampilan kamera, objek tampak dua kali lebih besar dalam rasio 1: 2 yang sempurna (Perhatikan panah yang menunjuk bahwa ia menyentuh tepi tampilan setelah dipindahkan) dua kali lebih dekat)

Yang kedua adalah blok ukuran yang sama diputar pada 45 derajat. Saat diputar, tepi bawah tidak lagi pada jarak yang sama dari kamera dengan tepi atas, sehingga tidak terlihat dengan benar skala ke rasio 1: 2 tetapi pada kenyataannya sebenarnya dua kali lebih besar (seperti pada sudut yang sama pada blok biru jauh seperti di blok biru dekat.)

Kesimpulannya ini sebenarnya berarti teman Anda benar dan rasio 1: 1 ("objek dua kali lebih dekat, muncul dua kali lebih besar.") Untuk objek Anda adalah pilihan yang baik.

Piddock Tom 'Blue'
sumber
Jawaban bagus! Gambar-gambar pasti membuatnya lebih jelas. Sebenarnya saya merasa benar-benar bodoh sekarang, karena saya mencoba ini sebelum memposting pertanyaan dengan memegang tangan saya di depan wajah saya dan menggerakkannya lebih dekat. Dan kemudian saya berpikir: tidak, rasanya tidak dua kali lebih besar .... Saya seharusnya mengukurnya lebih akurat;) Perspektif adalah hal yang lucu! Juga, Ifeel seperti aku seharusnya bisa membuat gambar sendiri;) Tapi jawaban yang bagus! Terima kasih!
Berry
@Mason Wheeler - Diurutkan: P
Tom 'Blue' Piddock
8

Objek dua kali lebih dekat muncul dua kali lebih besar. Ini adalah konsekuensi dari Teorema Thales dan itu benar di dunia nyata.

Orang bisa berpendapat bahwa Teorema Thales adalah alat matematika inti di balik proyeksi perspektif dan apa yang dikenal dalam pipa grafis (OpenGL atau DirectX) sebagai divisi perspektif . Ini adalah teorema yang harus Anda ketahui, dan belajarlah untuk mengenali kapan itu dapat digunakan.

sam hocevar
sumber
Referensi yang bagus! Saya pasti akan memeriksa Teorema Thales, dan mencoba memahami pipa grafis dengan lebih baik.
Berry
7

Sebenarnya itu cukup banyak benar (jika Anda memindahkan objek dua kali lebih jauh terlihat setengah besar) tetapi itu mengaburkan bagaimana ukuran visual objek harus berubah ketika pemirsa bergerak. Khususnya, objek tampak semakin besar semakin cepat semakin dekat. Itu karena pemirsa mencakup setengah jarak jauh lebih cepat ketika objek dekat, dibandingkan dengan ketika objek lebih jauh. Atau dengan kata lain, sementara kecepatan pemirsa konstan, nilai "setengah jarak" berubah ketika jarak ke objek berubah.

jhocking
sumber
2

Karena Anda tidak benar-benar bekerja di ruang 3D, kami dapat menganggap sprite tidak pernah berputar (rotasi dapat disimulasikan dengan skewing, dll.) Kendala sederhana ini membuatnya cukup mudah untuk mendapatkan angka yang agak akurat tentang ukuran yang harusnya tergantung pada jarak dari kamera.

Pertama, Anda perlu memahami bagaimana objek 3D dirender. Meskipun kamera menyatu ke satu titik, ada bidang yang tidak terlihat yang bertindak sebagai layar untuk menggambar objek. Satu-satunya hal yang perlu Anda ketahui tentang layar adalah seberapa jauh jaraknya dari kamera.

Berikut adalah diagram tentang bagaimana suatu objek dirender ke kamera pada dua jarak yang berbeda.

Seperti yang Anda harapkan, ketinggian objek tergantung pada jarak dari kamera. TETAPI karena rending terjadi pada bidang culling dekat, kita harus menghitung ketinggian sprite pada titik itu.

Beberapa perhitungan trigonometri dasar akan mengarahkan Anda ke rumus berikut:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

CONTOH:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

Saya sarankan mulai dengan v=5 dan kemudian menyesuaikan dari sana berdasarkan tampilannya. Saya bisa melempar biola bersama yang memungkinkan Anda untuk melihat perubahan secara realtime.

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

EDIT: Ketika Anda mengatakan bergerak di sepanjang sumbu z, saya berasumsi Anda akan menginginkan tampilan perspektif (seperti kebanyakan game 3D; penembak, dll.) Matematika untuk menghitung ukuran objek berdasarkan jarak juga akan tergantung pada lokasi dalam bingkai, mirip dengan penglihatan tepi. Sebagai gantinya, saya akan mencobanya dengan matematika saya yang merupakan pandangan ortografis (pikirkan Mario, Angry Birds, Super Smash Bros, dll.). Saya tidak tahu tampilan dan perasaan yang Anda coba capai, tetapi selama itu tampak nyata maka para pemain tidak akan pernah tahu!

DEMO!

Jim Buck
sumber
Ya saya benar-benar mengincar pandangan ortografis. Game yang saya "pinjam" dari inspirasi saya saat ini adalah Rayman Origins. Di beberapa bagian gim, Anda bisa melompat ke atas bunga, dan kemudian Anda akan memantul di lapisan lain dengan kedalaman yang berbeda. Kemudian kamera memperbesar atau memperkecil koreksi ke kedalaman itu. Contoh-contoh dapat dilihat di video ini , pada 4:50 dan 5:00.
Berry
Selanjutnya, jawaban yang bagus! Tetapi karena hanya konfirmasi bahwa aturan "dua kali lebih dekat, dua kali lebih besar" dari yang berlaku sudah cukup, saya memilih jawaban Blue sebagai yang terbaik.
Berry
Terima kasih, dan semoga sukses dengan game Anda! Tapi saya ingin menjelaskan kepada orang lain bahwa "dua kali lebih dekat, dua kali lebih besar" akan bekerja dengan baik jika semuanya sangat dekat dengan kamera. Ketika segalanya semakin jauh, perubahan yang dirasakan dalam ukuran berkurang. Misalnya, lihat jempol Anda dari dekat, lalu rentangkan lengan Anda dan lihatlah. Ukuran ibu jari Anda tampak jauh lebih kecil. Setelah itu, lihat sesuatu yang jauh. Ambil satu langkah mundur (hampir sama dengan panjang lengan Anda). Perhatikan bagaimana ukurannya nyaris tidak berubah? Jika sebuah game memiliki bidang pandang yang panjang, menggunakan sedikit matematika akan jauh.
Jim Buck
EDIT: Saya membuat kesalahan dalam komentar saya sebelumnya. "Dua kali sedekat, dua kali lebih besar" benar ketika barang-barang tetap cukup dekat satu sama lain sehubungan dengan jarak mereka dari kamera.
Jim Buck
Berikut ini adalah demo cepat yang saya kumpulkan, gunakan mouse untuk bergerak dan roda gulir untuk mengubah kedalaman.
Jim Buck
0

Ini tidak tercakup dan saya pikir ini mungkin bermanfaat: Ini harus dicatat ketika Anda setengah jarak, menggandakan ukuran di kedua dimensi X dan Y akan melipatgandakan luas total sprite. Hal ini karena:

Area = X * Y

Setelah Memperbesar:

NewArea = (x*2) * (y*2)

Ini dapat memberi Anda kesan bahwa efek pembesaran terjadi dengan cepat atau terlalu kuat. Anda dapat menyesuaikan faktor dengan mengubah 2 pada rumus di atas menjadi nilai float seperti 1,5 atau 1,33.

Atau, apa yang saya lakukan adalah menyimpan kedalaman kamera (jarak) ke ubin Anda dalam nilai byte bersama dengan terjemahan kamera (X dan Y) kemudian menghitung ukuran ubin yang diproyeksikan sebagai berikut:

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

Perhatikan bahwa CameraZharus ketat antara 1-255, dan pembatasan itu mungkin bermanfaat atau merugikan bagi Anda di masa depan.

Mark H.
sumber