Gambar yang diberikan dari atas dan bawah menggunakan kamera Orthographic tidak cocok

8

Saya menggunakan kamera ortografi untuk membuat irisan model (untuk mengacaukannya). Saya membuat setiap irisan baik dari atas maupun bawah untuk menentukan apa yang ada di dalam setiap irisan.

Model I render adalah bentuk 'T' sederhana yang dibangun dari dua kubus. Kubus memiliki dimensi yang sama dan memiliki koordinat Y (tinggi) yang sama. Berikut ini rendernya di Blender:

Model T.

Saya membuat model ini langsung dari atas dan sekali langsung dari bawah. Harapan saya adalah bahwa saya akan mendapatkan gambar yang persis sama (kecuali untuk mirroring pada sumbu y). Namun ketika saya render menggunakan target render resolusi sangat rendah (25x25) posisi (dalam piksel) dari 'T' berbeda ketika dirender dari atas sebagai lawan render dari bawah. Lihat gambar 2 dan 3. Blok merah muda bukan bagian dari render asli tetapi saya telah menambahkannya sehingga Anda dapat dengan mudah menghitung / melihat perbedaannya.

Diberikan dari atas Dari atas

Diberikan dari bawah Dari bawah

Ini mungkin karena apa yang saya baca tentang koordinat pixel dan texel yang mungkin bias ke kiri atas seperti yang terlihat dari kamera. Karena saya menggunakan vektor 'naik' yang sama untuk kedua kamera saya, bias saya hanya terlihat pada sumbu x. Saya sudah mencoba mengubah posisi kamera dan melihat-oleh, apa yang saya pikir, harus setengah piksel. Saya sudah mencoba menggeser satu kamera dan menggeser kedua kamera dan sementara saya melihat beberapa efek, saya tidak bisa mendapatkan salinan sempurna pixel-by-pixel dari kedua kamera.

Di sini saya menginisialisasi kamera dan menghitung, apa yang saya yakini, setengah piksel. boundsDimX dan boundsDimZ adalah kotak pembatas yang sedikit diperbesar di sekitar model yang juga saya gunakan sebagai lebar dan tinggi volume tampilan kamera ortografis.

Matrix projection = Matrix.CreateOrthographic(boundsDimX, boundsDimZ, 0.5f, sliceHeight + 0.5f);
Vector3 halfPixel = new Vector3(boundsDimX / (float)renderTarget.Width, 0, 
    boundsDimY / (float)renderTarget.Height) * 0.5f;

Ini adalah kode tempat saya mengatur posisi kamera dan tampilan kamera

  // Position camera                      
                if (downwards)
                {
                    float cameraHeight = bounds.Max.Y + 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X, // possibly adjust by half a pixel?
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight - 1.0f, cameraPosition.Z);

                }
                else
                {
                    float cameraHeight = bounds.Max.Y - 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X,
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight + 1.0f, cameraPosition.Z);
                }

Pertanyaan Utama Sekarang Anda telah melihat semua masalah dan kode yang dapat Anda tebak. Pertanyaan utama saya adalah. Bagaimana cara menyelaraskan kedua kamera sehingga masing-masing membuat gambar yang persis sama (dicerminkan di sepanjang sumbu Y)?

Roy T.
sumber
Solusinya sejauh ini tampaknya memindahkan kamera yang mengambil gambar dari tepat satu piksel ke kiri (-x). Namun saya tidak dapat menjelaskan mengapa dan karenanya tidak dapat menjamin bahwa itu akan bekerja untuk semua yang saya lemparkan padanya. Ada ide?
Roy T.
Apakah Anda berpikir tentang menjaga semuanya tetap pada tempatnya, tetapi meningkatkan Y dari model (kubus) dengan -1? Maka Anda akan memiliki semua yang sama kecuali benda yang dibalik. PS Tentu saja Anda perlu -1 wajah normal dan poligon juga.
Kromster
Itu sebenarnya ide yang sangat keren
Roy T.
Sejak Anda menyetujui, saya mempostingnya sebagai jawaban. Katakan padaku jika itu berhasil untukmu!
Kromster

Jawaban:

2

Ini adalah pandangan yang berbeda tentang masalah yang disajikan, yang mungkin membantu untuk menghindari masalah perbedaan rasterisasi sama sekali

Apakah Anda mempertimbangkan untuk menjaga semuanya tetap pada tempatnya, tetapi meningkatkan Y dari model (kubus) dengan '-1' di sepanjang bagian pesawat? Maka Anda akan memiliki segalanya persis sama kecuali untuk benda-benda yang terbalik - artinya Anda akan mendapatkan sisi bawahnya untuk tujuan Anda. Tentu saja Anda perlu '-1' normals dan poligon yang menghadap ke arah juga.

Kromster
sumber
Meskipun jawaban Anda tidak menjelaskan mengapa metode saya tidak berhasil. (Dan di situlah karunia itu untuk) Aku tidak akan menghadiahkan hadiah sekarang. Tapi karena itu saran yang bagus, hadiah 50% otomatis harus diberikan kepada Anda dalam sehari, dan saya pikir Anda layak mendapatkannya :).
Roy T.
@ RoyT: Kedengarannya adil. Namun Anda masih harus memberi tahu kami, jika solusi yang disarankan telah menyelesaikan masalah Anda - sehingga orang lain yang menghadapi masalah yang sama akan tahu cara menanganinya.
Kromster