Komputasi normal dari posisi vertex cukup sederhana menggunakan produk lintas vektor.
Produk silang dari dua vektor dan v (catat u × v , atau kadang-kadang u ∧ v ) adalah vektor yang tegak lurus terhadap u dan v , dengan panjang | | u × v | | = | | kamu | | ⋅ | | v | | s i n ( θ ) , dengan θ sudut antara u dan vkamuvu × vu ∧ vkamuv| | u×v | | = | | kamu | | ⋅ | | v | | sin(θ)θkamuv. Arah vektor akan tergantung pada urutan perkalian: adalah kebalikan dari v × u (dua arah yang tegak lurus terhadap bidang).u × vv × u
Jika Anda tidak terbiasa dengan produk silang, saya mengundang Anda untuk membacanya dan merasa nyaman dengannya. Normalnya akan tampak sederhana.
Normal shading datar
Jika Anda memiliki segitiga , A B × A C adalah vektor tegak lurus terhadap segitiga dan dengan panjang yang proporsional dengan luasnya. Karena yang normal adalah vektor satuan yang tegak lurus terhadap bidang segitiga, Anda bisa mendapatkan yang normal dengan:A B CA B × A C
N= A B × A C| | AB×AC| |
Dalam kode, ini akan terlihat seperti n = normalize(cross(b-a, c-a))
misalnya. Cukup terapkan ini di semua wajah Anda dan Anda akan memiliki normals Anda per wajah.
For each triangle ABC
n := normalize(cross(B-A, C-A))
A.n := n
B.n := n
C.n := n
Perhatikan bahwa ini mengasumsikan simpul tidak dibagi di antara segitiga. Saya tidak terbiasa dengan API Kinect; sangat mungkin bahwa mereka dibagikan, dalam hal ini Anda harus menduplikasi mereka, atau beralih ke solusi berikutnya:
Normal shading normal
Setelah pencahayaan dengan normal dihitung seperti di atas, Anda akan melihat bahwa tepi segitiga terlihat jelas. Jika ini tidak diinginkan, Anda dapat menghitung normal normalnya, dengan memperhitungkan semua wajah yang berbagi titik yang sama.
T1T2T3NN1N2N3T1T2NN1N2
Ingat bagaimana produk silang proporsional dengan area? Jika Anda menjumlahkan produk silang kemudian menormalkan jumlah, itu akan melakukan persis jumlah tertimbang yang kita inginkan. Jadi algoritme menjadi:
For each vertex
vertex.n := (0, 0, 0)
For each triangle ABC
// compute the cross product and add it to each vertex
p := cross(B-A, C-A)
A.n += p
B.n += p
C.n += p
For each vertex
vertex.n := normalize(vertex.n)
Teknik ini dijelaskan lebih rinci pada artikel ini oleh Iñigo Quilez: normalisasi cerdas dari sebuah mesh .
Untuk lebih lanjut tentang normals, lihat juga:
x
merupakan produk silang)