Tidak dapat memahami koordinat tekstur UV ini (kisaran TIDAK 0,0 hingga 1,0)

9

Saya mencoba menggambar objek 3D sederhana yang dihasilkan oleh Google SketchUp 8 Pro ke aplikasi WebGL saya, modelnya adalah silinder sederhana.

Saya membuka file yang diekspor dan menyalin posisi simpul, indeks, normals dan koordinat tekstur ke file .json agar dapat menggunakannya pada javascript. Semuanya tampak berfungsi dengan baik, kecuali untuk koordinat tekstur yang memiliki beberapa nilai yang cukup besar, seperti 46,331676 dan juga nilai negatif. Sekarang saya tidak tahu apakah saya salah, tetapi bukankah seharusnya koordinat tekstur 2D berkisar antara 0,0 hingga 1,0 saja?

Nah, menggambar model menggunakan koordinat tekstur ini memberi saya tampilan yang benar-benar aneh, dan saya hanya bisa melihat tekstur dengan benar ketika saya sangat dekat (tidak benar-benar saya, cam) ke model, seolah-olah teksturnya sudah gila-gilaan dikurangi ukurannya dan diulang tanpa batas di wajah model. (Ya, saya menggunakan GL_REPEAT pada bungkus tekstur itu)

Apa yang saya perhatikan adalah bahwa jika saya mendapatkan semua koordinat ini dan membaginya dengan 10 atau 100 saya mendapatkan tampilan yang "normal", tetapi masih belum dalam kisaran 0,0 hingga 1,0.

Ini file json saya: http://pastebin.com/Aa4wvGvv

Berikut adalah Shaders GLSL saya: http://pastebin.com/DR4K37T9

Dan inilah file .X yang diekspor oleh SketchUp: http://pastebin.com/hmYAJZWE

Saya juga mencoba menggambar model ini menggunakan XNA, tetapi masih tidak berfungsi. Menggunakan shaders HLSL ini: http://pastebin.com/RBgVFq08

Saya mencoba mengekspor model yang sama ke berbagai format, collada, fbx, dan x. Semua itu menghasilkan hal yang sama.

Delta
sumber

Jawaban:

8

Anda benar, UV biasanya berubah dari 0-1 meskipun David X menyebutkan ini bukan keharusan. Dalam kasus Anda, masalahnya adalah frekuensi koordinat UV yang dihasilkan SketchUp. Sebagai contoh jika sumbu Y Anda (koordinat V) bergerak dari 0 ke 46 maka tekstur itu, jika pembungkus diaktifkan, akan mengulangi 46 kali dalam arah V. Wrapping juga membuatnya terlihat lebih kecil karena Anda harus menduplikasi gambar berkali-kali di area permukaan yang sama. Mengekspor ulang sebagai FBX atau Collada tidak melakukan apa pun untuk menyelesaikan masalah karena UV-nya sama saja. Untuk memperbaikinya, Anda harus kembali ke SketchUp dan mengubah cara menghasilkan UV untuk silinder. Mungkin Anda dapat menentukan rentang UV sendiri atau mungkin Anda harus mengubah cara geometri parameternya. Saya tidak pernah menggunakan SketchUp jadi saya tidak

Terakhir sepertinya simpul berliku silinder mungkin kebalikan dari kubus Anda. Grafik API seperti OpenGL dan DirectX menggunakan segitiga simpul berliku untuk menentukan arah yang dihadapi segitiga. Ini adalah bagaimana mereka melakukan pemusnahan backface - tidak menjadikan segitiga menghadap jauh dari kamera sebagai pengoptimalan. Dalam kasus silinder Anda, tampak bahwa pandangan memandang ke dalam silinder karena segitiga yang paling dekat dengan kamera menghadap ke arah yang salah. Sekali lagi ini adalah masalah yang perlu diselesaikan di SketchUp dan dapat diverifikasi dengan melihat arah wajah normal untuk setiap segitiga (itu harus menunjuk ke luar, bukan ke dalam).

Corillian
sumber
1

(Koordinat tekstur pasti di luar 0-1.) Saya pikir ini hanya OpenGL yang aneh. IIRC, Spheres menggunakan koordinat tekstur yang menempatkan 0-1 persegi pada ~ 1/16 permukaan, dan saya tidak akan terkejut jika Silinder melakukan sesuatu yang serupa. Perbaiki-bijaksana, Anda mungkin harus menulis kode silinder Anda sendiri, mengeluarkan koordinat tekstur yang tepat.

David X
sumber
1

Jika Anda ingin koordinat uv Anda tepat antara 0 dan 1, Anda bisa menggunakan matriks skala untuk model Anda.

Jadi saat memuat model Anda, Anda dapat memeriksa koordinat u dan v maksimum Anda dan membuat matriks penskalaan yang akan membuatnya lebih "normal". Jadi itu akan menggantikan penskalaan manual Anda dari 10 atau 100. Jadi, agar sesuai, Anda perlu menurunkan koordinat uv Anda ke [0,1].

|1/uMax|0     |
|0     |1/vMax|

Tentu saja ini hanya solusi dan Anda bisa menemukan cara untuk mengatur Sketchup di pengaturan yang tepat (saya pikir eksportir atau Sketchup Anda sendiri salah di sini). Tetapi jika itu tidak berhasil untuk Anda, buat prosesor pasca-muat Anda dan simpan matriks skala tekstur.

Marnix
sumber
@Marmix Ini adalah solusi yang sangat sederhana, efektif dan elegan !!!
3d-indiana-jones
0

Sepertinya SketchUp tidak menormalkan koordinat tekstur Anda, atau menggunakan metrik sendiri. Memiliki texcoords <0 atau> 1 dan GL_REPEAT sebagai pembungkus tekstur berarti bahwa tekstur akan diperkecil agar sesuai dengan geometri dan diulang secara horizontal dan vertikal.

Coba impor mesh dalam paket pemodelan lain (MilkShape, Blender) dan perbaiki peta uv dari sana.

r2d2rigo
sumber
4
Memiliki texcoords <0 atau> 1 dan GL_REPEAT sebagai pembungkus tekstur berarti bahwa tekstur akan [ dihapus pernyataan yang salah ] diulang secara horizontal dan vertikal.
Kromster