Saya memiliki tekstur yang dimuat dalam three.js, kemudian diteruskan ke shader. Dalam vertex shader saya menghitung yang normal, dan saya simpan ke dalam variabel vektor uv.
<script id="vertexShader" type="x-shader/x-vertex">
varying vec3 N,P;
varying vec2 UV;
void main() {
gl_Position= projectionMatrix * modelViewMatrix * vec4(position,1.0);
P= position;
N= normalMatrix * vec3(normal);
UV= uv;
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
varying vec3 N,P;
varying vec2 UV;
uniform sampler2D texture;
void main() {
gl_FragColor= texture2D(texture,UV);
}
</script>
Bagaimana cara menghitung vektor T dan B?
textures
glsl
uv-mapping
three.js
Ramy Al Zuhouri
sumber
sumber
Jawaban:
Pertama-tama, untuk setiap titik 3D ada vektor garis singgung dan bi-tangen tak terbatas. Gambar di bawah ini menjelaskan mengapa ada jumlah ruang singgung yang tak terbatas untuk setiap titik, garis singgung dan bitangen dapat memiliki arah apa pun di bidang yang ditampilkan.
Jadi, inorder untuk menghitung dengan benar ruang tangen 1 yang paling berguna , kami ingin ruang tangen kami disejajarkan sedemikian rupa sehingga sumbu x (garis singgung) sesuai dengan arah u dalam peta bump dan sumbu y (bitangent) sesuai dengan arah v dalam peta benjolan, kita seharusnya sudah memiliki normal dari simpul yang sudah sesuai dengan arah Z dalam ruang singgung.
(1) paling berguna karena pada akhirnya kami ingin vektor normal disampel dari tekstur
Yang terbaik dijelaskan dengan gambar, kami ingin ruang singgung kami selaras seperti yang
(u, v)
ditunjukkan di bawah ini.Sumber gambar meskipun tidak sepenuhnya terkait dengan grafik komputer
Di komputer, pengembang grafis biasanya menggunakan
(u,v)
juga dikenal sebagai koordinat tekstur. Kami akan menganggap T adalah garis singgung dan B adalah bitangent, danP0
merupakan simpul target kami, yang merupakan bagian dari segitiga(P0,P1,P2)
.Pertama ingat apa yang ingin kita lakukan, adalah menghitung tangen dan bitanget yang:
Intinya adalah kita sudah mengasumsikan bahwa T dan B terletak pada bidang yang sama dan berkorespondensi dengan U dan V sekarang jika kita dapat mengetahui nilai-nilainya, kita dapat melintasi produk dan vektor ketiga untuk membangun matriks transformasi dari dunia ke ruang singgung.
Mengingat bahwa kita tahu bahwa setiap vektor 2D dapat ditulis sebagai kombinasi linear dari dua vektor independen 2 dan karena kita sudah memiliki titik-titik segitiga (tepi), ditunjukkan pada gambar di atas. Kita bisa menulis:
(2) sebenarnya itulah bagaimana basis matriks diturunkan
Persamaan di atas dapat ditulis dalam bentuk matriks,
Dengan menyelesaikan persamaan matriks kita dapat menentukan nilai T dan B kita dapat membangun matriks transformasi.
Kode sumber lengkap dalam C ++
Kode sumber dan derivasi lengkap dapat ditemukan di sini .
sumber