Persimpangan Ray-Sphere: diskriminannya SALAH

Baiklah, jadi saya sedang mengerjakan ray tracer menggunakan phong shading. Sejauh ini, semuanya baik-baik saja. Saya telah melemparkan sinar yang mengenai bola dalam pemandangan saya, menerapkan bayangan phong pada bola tersebut, dan itu terlihat normal.

Sekarang, saya menghitung sinar bayangan, yaitu menembakkan sinar dari titik perpotongan sinar utama ke sumber cahaya, dan melihat apakah sinar tersebut mengenai objek apa pun yang menghalanginya. Jika ya, berarti ia berada dalam bayangan.

Namun, saat menghitung apakah sinar bayangan mengenai bola mana pun, tampaknya ada kesalahan pada diskriminan saya yang dihitung, yang merupakan hal yang aneh karena sejauh ini benar untuk sinar primer.

Berikut pengaturannya:

// Origin of ray (x,y,z)
origin: -1.9865333, 1.0925934, -9.8653316
// Direction of ray (x,y,z), already normalized
ray: -0.99069530, -0.13507602, -0.016648887

// Center of sphere (x,y,z)
cCenter: 1.0, 1.0, -10.0
// Radius of the sphere (x,y,z)
cRadius: 1.0

, dan berikut kode untuk mencari diskriminannya:

// A = d DOT d
float a = dotProd(ray, ray);

// B = 2 * (o - c) DOT d
Point temp (2.0*(origin.getX() - cCenter.getX()), 2.0*(origin.getY() - cCenter.getY()), 2.0*(origin.getZ() - cCenter.getZ()));
float b = dotProd(temp, ray);

// C = (o - c) DOT (o - c) - r^2
temp.setAll(origin.getX() - cCenter.getX(), origin.getY() - cCenter.getY(), origin.getZ() - cCenter.getZ());
float c = dotProd(temp, temp);
c -= (cRadius * cRadius);

// Find the discriminant (B^2 - 4AC)
float discrim = (b*b) - 4*a*c; 

Yang jelas sinarnya menjauhi bola, namun diskriminannya positif (2,88) yang menandakan sinar itu mengenai bola. Dan kode ini berfungsi dengan baik untuk sinar primer karena diskriminannya harus benar, namun tidak untuk sinar bayangan sekunder ini.

Apakah saya melewatkan sesuatu di sini?


person user1115016    schedule 25.12.2011    source sumber
comment
Dugaan saya adalah apa yang Anda lewatkan adalah pemahaman tentang matematika, dan apa yang disampaikannya kepada Anda. Akankah algoritme ini memberi tahu Anda jika GARIS memotong bola, dan bukan sinar? Artinya, suatu garis mempunyai luas tak terhingga pada dua arah.   -  person    schedule 25.12.2011
comment
@woodchips Sinar adalah vektor (suatu titik yang memiliki arah), sehingga tak terhingga pada satu arah (arah yang ditunjuknya). Rumusnya didasarkan pada fungsi bola. Sebuah titik P terletak pada bola jika memenuhi: ||P - Pc|| = r^2, dimana Pc adalah pusat bola, dan r adalah jari-jarinya. Untuk sebuah sinar, sebuah titik P terletak pada sinar tersebut jika P = Q + td, dimana Q adalah titik awal sinar tersebut, d adalah arah, dan t adalah waktu. Berikut ini tautan jika penjelasan saya gagal: wiki.cgsociety.org/index.php/Ray_Sphere_Intersection   -  person user1115016    schedule 25.12.2011
comment
Ya. Dan meskipun Anda telah menyalin definisi garis dan sinar dengan cermat, Anda tidak perlu repot-repot memahami persamaan selanjutnya dan menerapkan persamaan yang Anda referensikan. Diskriminan positif atau negatif TIDAK berarti ada solusi untuk perpotongan suatu sinar. Ini memberitahu Anda bahwa ada solusi untuk GARIS tak terhingga yang memotong bola jika diskriminannya positif!!!!!!! (Sebenarnya, non-negatif adalah kriteria yang diminati.) Bacalah dokumen yang Anda rujuk sendiri, dan bacalah secara menyeluruh.   -  person    schedule 25.12.2011
comment
Jika garis TIDAK memotong bola, selanjutnya dapat ditentukan apakah titik potong tersebut searah dengan sinar yang sebenarnya ditunjuk oleh sinar tersebut.   -  person    schedule 25.12.2011
comment
@woodchips Saya tersanjung menurut Anda saya menyalin definisinya. Dan saya telah membaca dokumen itu sampai tuntas, dan tidak ada baris yang disebutkan di halaman itu. Namun, penjelasan Anda masuk akal, karena ia mendeteksi pukulan di kedua sisi sinar (yaitu garis). Sepertinya itu memberiku sesuatu untuk dikerjakan saat ini. Terima kasih.   -  person user1115016    schedule 30.12.2011
comment
@woodchips Selesaikan! Tes negatif sederhana untuk nilai t berhasil. Sekali lagi terima kasih telah menyembuhkan kegilaanku.   -  person user1115016    schedule 30.12.2011


Jawaban (3)


Jawaban singkat untuk masalah saya, kalau-kalau ada yang menemukan ini dan memiliki masalah yang sama:

Diskriminan memberi tahu Anda apakah ada hit untuk garis (dan tidak untuk ray, seperti dugaan saya). Jika hasilnya positif, maka ia telah mendeteksi adanya serangan di suatu tempat di telepon.

Jadi, saat menghitung nilai t untuk sinar tersebut, periksa apakah nilainya negatif. Jika ya, maka itu adalah pukulan DI BALIK titik asal sinar (yaitu berlawanan arah dengan sinar), jadi buang saja. Hanya pertahankan nilai-nilai positifnya, karena nilai-nilai tersebut mengarah ke arah sinar.

Jawaban yang lebih singkat lagi: buang nilai t negatif.

Penghargaan diberikan kepada woodchips karena telah membuat saya menyadari hal ini.

person user1115016    schedule 30.12.2011

Soalnya, trik mencari perpotongan garis dan bola membutuhkan penyelesaian persamaan kuadrat. Persamaan tersebut mempunyai salah satu dari tiga kemungkinan solusinya - terdapat 0, 1, atau 2 solusi real terhadap persamaan tersebut. Tanda diskriminan memberi tahu kita berapa banyak solusi nyata yang ada (serta membantu kita memecahkan solusi tersebut.)

Jika ada solusi unik, maka garis tersebut hanya menyentuh permukaan bola. Hal ini terjadi jika diskriminannya tepat nol.

Jika ada dua solusi, maka garis melewati bola dan mengenai permukaan di DUA titik berbeda.

Jika tidak ada solusi nyata (kasus di mana diskriminan negatif) maka garis tersebut terletak terlalu jauh dari bola untuk menyentuhnya.

Setelah mengetahui apakah garis tersebut pernah mendekati bola atau tidak, barulah kita khawatir jika sinar tersebut mengenainya. Untuk ini, kita dapat melihat bagaimana kita mendefinisikan sinar. Sinar adalah setengah garis yang memanjang hingga tak terhingga hanya dalam satu arah. Jadi kita melihat di mana pada garis tersebut titik potongnya terjadi. Hanya jika perpotongan terjadi pada separuh garis yang kita pedulikan barulah terdapat perpotongan bola RAY.

Intinya adalah, penghitungan diskriminan (dan sekadar menguji tandanya) HANYA memberi tahu Anda tentang fungsi garis tersebut, bukan tentang di mana perpotongan terjadi di sepanjang garis tersebut.

Tentu saja, membaca dengan cermat tautan yang Anda berikan akan memberi tahu Anda semua hal ini.

person Community    schedule 25.12.2011
comment
Jawaban dalam komentar Anda lebih bermanfaat. - person user1115016; 30.12.2011

Cukup yakin "o-c" seharusnya menjadi "c-o"

Anda menembakkan sinar ke arah yang salah dan menemukan perpotongan di sisi lain bola.

person Jeremiah    schedule 25.12.2011