Bagaimana cara membuat cakrawala?


8

Saya menambahkan langit ke raytracer saya yang menjadi sampel ketika sinar benar-benar kehilangan objek apa pun.

kelinci

Apa yang saya lakukan di sini adalah jika sinar benar-benar melewatkan apa pun dalam adegan, ia mengembalikan fungsi kebisingan Perlin di (ray.direction.x, ray.direction.y, ray.direction.z) - dengan kata lain itu "sampel" sebuah bola di sekitar titik asal ".

Tapi itu "terlihat salah" (karena langit seperti itu menghadapmu ).

Bagaimana saya bisa memperbaiki langit dan membuatnya lebih seperti cakrawala bumi?

Atau apakah ini kurang lebih seperti apa bentuknya, dan saya hanya perlu menambahkan lebih banyak geometri di lantai?


Saya setuju itu terlihat sangat tidak wajar. BTW bagaimana kamera Anda akan bekerja? Apakah Anda memerlukan skybox penuh atau hanya latar belakang dan apakah Anda ingin menghasilkan langit menggunakan noise atau pengambilan sampel dari tekstur halus? Jika itu hanya latar belakang (ala game 2.5D), Anda dapat mencicipi dari sesuatu seperti gambar ini.bibliocad.com/library/image/00010000/9000/… yang akan tileable adalah panoramiknya.
ClassicThunder

2
Beberapa jenis transformasi ke koordinat Y (atau Z, jika itu koordinat "atas" Anda) mungkin melakukan sesuatu. Misalnya, y '= 1 - (1 - y) ^ 2. Idenya adalah untuk mengompresi koordinat Y sekitar y = 0, dan tetap sama atau memperluasnya di dekat y = 1.
John Calsbeek

@Calsbeek ini akan menjadi jawaban yang bagus! :)
Maik Semder

Jawaban:


7

Atau Anda bisa menggunakan peta kubus dengan tekstur langit daripada menggunakan perlin noise. Dan saya juga berpikir itu akan membuat pemandangan Anda terlihat lebih baik karena memiliki lebih banyak detail dan variasi dalam pemetaan lingkungan. Itulah tepatnya yang saya lakukan ketika saya mengimplementasikan raytracer saya.

Alasan lain yang saya rekomendasikan ini, adalah bahwa lingkungan tidak perlu hanya berupa awan. Bisa memiliki gunung, bisa menjadi adegan dalam ruangan, bisa menjadi adegan dari mars. Menggunakan peta kubus satu-satunya hal yang perlu Anda lakukan adalah menukar tekstur dan Anda selesai.

Jadi langkah pertama adalah menemukan peta kubus yang sesuai dengan kebutuhan Anda. Ini dapat disimpan sebagai enam tekstur terpisah, atau sebagai tekstur tunggal seperti di bawah ini. Periksa juga tautan ini untuk info lebih lanjut tentang cara membuat sendiri:

masukkan deskripsi gambar di sini

Kemudian pada kode Anda, saya sarankan membuat CubeMapkelas untuk merangkum perhitungan sampling. Kelas ini harus tahu cara memuat tekstur peta kubus, dan diberi ray itu harus bisa tahu di mana wajah dan dalam posisi apa untuk sampel. Dalam implementasi saya, saya menemukan lebih mudah untuk menyimpan masing-masing dari enam wajah dalam objek tekstur yang terpisah, dan bercabang berdasarkan arah sinar:

class CubeMap
{
    public void Load(string path);
    public Color GetSample(Ray ray);
    private Texture[6] faces;
}

Jika Anda belum memiliki Texturekelas, buat saja kelas Anda sendiri. Ini bisa sesederhana array warna dua dimensi. Jadi, hanya sebagai referensi, dan tanpa jaminan efisiensi atau kesehatan implementasi ini, inilah kode yang saya gunakan pada proyek saya - CubeMap dan CubeFace .


Jawaban ini mengesampingkan masalah - Saya ingin tahu bagaimana membuat tekstur yang saya hasilkan muncul sebagai kubah langit bumi .
bobobobo

2

Anda dapat mencoba menggunakan 2D Perlin dengan (ray.dir.x / ray.dir.z, ray.dir.y / ray.dir.z). Memproyeksikan vektor arah ke bidang Z = 1. Seharusnya memberi Anda efek langit (datar) yang tak terbatas.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.