ไม่เข้าใจพิกัดพื้นผิว UV เหล่านี้ (ช่วงไม่เท่ากับ 0.0 ถึง 1.0)


9

ฉันกำลังพยายามวาดวัตถุ 3 มิติแบบง่ายที่สร้างโดย Google SketchUp 8 Pro ลงในแอป WebGL ของฉันแบบจำลองนั้นเป็นรูปทรงกระบอกที่เรียบง่าย

ฉันเปิดไฟล์ที่ส่งออกและคัดลอกตำแหน่งจุดยอดดัชนีบรรทัดฐานและพิกัดพื้นผิวเป็นไฟล์. json เพื่อให้สามารถใช้กับจาวาสคริปต์ได้ ดูเหมือนว่าทุกอย่างจะทำงานได้ดียกเว้นพิกัดพื้นผิวที่มีค่ามากเช่น 46.331676 และค่าลบ ตอนนี้ฉันไม่รู้ว่าฉันผิด แต่พิกัดพื้นผิว 2D ไม่ควรอยู่ในช่วงตั้งแต่ 0.0 ถึง 1.0 เท่านั้นใช่หรือไม่

การวาดแบบโดยใช้พิกัดพื้นผิวเหล่านี้ทำให้ฉันดูแปลกประหลาดอย่างสมบูรณ์และฉันสามารถเห็นพื้นผิวได้อย่างถูกต้องเมื่อฉันอยู่ใกล้มาก ลดขนาดและทำซ้ำไปเรื่อย ๆ ทั่วทั้งใบหน้าของนางแบบ (ใช่ฉันใช้ GL_REPEAT กับสิ่งห่อหุ้มพื้นผิวนั้น)

สิ่งที่ฉันสังเกตคือถ้าฉันได้รับพิกัดเหล่านี้ทั้งหมดและหารพวกเขาด้วย 10 หรือ 100 ฉันได้ดู "ปกติ" มาก แต่ก็ยังไม่อยู่ในช่วง 0.0 ถึง 1.0

นี่คือไฟล์ json ของฉัน: http://pastebin.com/Aa4wvGvv

นี่คือ GLSL Shaders ของฉัน: http://pastebin.com/DR4K37T9

และนี่คือไฟล์. X ที่ส่งออกโดย SketchUp: http://pastebin.com/hmYAJZWE

ฉันยังพยายามวาดแบบจำลองนี้โดยใช้ XNA แต่ก็ยังไม่ทำงาน การใช้ HLSL นี้: http://pastebin.com/RBgVFq08

ฉันพยายามส่งออกรุ่นเดียวกันเป็นฟอร์แมทต่าง ๆ collada, fbx และ x สิ่งเหล่านั้นให้ผลเหมือนกัน

คำตอบ:


8

โดยทั่วไปแล้ว UV ของคุณจะถูกต้องตั้งแต่ 0-1 แม้ว่า David X จะกล่าวถึงสิ่งนี้ไม่ใช่ข้อกำหนด ในกรณีของคุณปัญหาคือความถี่ของ SketchUp UV ที่สร้างขึ้น ตัวอย่างเช่นถ้าแกน Y ของคุณ (พิกัด V) เปลี่ยนจาก 0 เป็น 46 ดังนั้นพื้นผิวนั้นถ้าเปิดใช้งานการห่อจะทำซ้ำ 46 ครั้งในทิศทาง V การตัดยังทำให้มันดูเล็กลงเพราะคุณต้องทำซ้ำภาพหลายครั้งในพื้นที่ผิวเดียวกัน การส่งออกอีกครั้งในฐานะ FBX หรือ Collada ไม่ได้ทำอะไรเพื่อแก้ไขปัญหานี้เพราะเป็นวิธีเดียวกับ UV ในการแก้ไขปัญหานี้คุณต้องกลับไปที่ SketchUp และเปลี่ยนวิธีสร้างยูวีสำหรับกระบอกสูบ บางทีคุณสามารถระบุช่วงรังสียูวีด้วยตัวคุณเองหรือบางทีคุณต้องเปลี่ยนวิธีการกำหนดพารามิเตอร์ทางเรขาคณิต ฉันไม่เคยใช้ SketchUp ดังนั้นฉันจึงไม่ '

สุดท้ายดูเหมือนว่าจุดยอดที่คดเคี้ยวของกระบอกสูบอาจจะตรงกันข้ามกับลูกบาศก์ของคุณ API ของกราฟิกเช่น OpenGL และ DirectX ใช้สามเหลี่ยมจุดยอดคดเคี้ยวเพื่อกำหนดทิศทางของรูปสามเหลี่ยม นี่คือวิธีที่พวกเขาทำการคัดกลับด้านหลัง - ไม่เรนเดอร์สามเหลี่ยมที่หันหน้าออกจากกล้องเพื่อเป็นการเพิ่มประสิทธิภาพ ในกรณีของทรงกระบอกของคุณปรากฏว่ามุมมองมองเข้าไปในกระบอกสูบเพราะสามเหลี่ยมที่อยู่ใกล้กับกล้องมากที่สุดกำลังหันไปในทิศทางที่ผิด นี่เป็นปัญหาที่ต้องได้รับการแก้ไขใน SketchUp อีกครั้งและสามารถตรวจสอบได้โดยดูที่ทิศทางของใบหน้าปกติสำหรับแต่ละสามเหลี่ยม (ควรชี้ไปด้านนอกไม่ใช่ขาเข้า)


1

(พิกัดของพื้นผิวสามารถอยู่นอก 0-1) ฉันคิดว่านี่เป็นเพียง OpenGL ที่แปลก IIRC, Spheres ใช้พิกัดพื้นผิวที่วาง 0-1 สแควร์ลงบนพื้นผิว ~ 1/16 และฉันจะไม่แปลกใจถ้าถังทำสิ่งที่คล้ายกัน แก้ไขอย่างชาญฉลาดคุณอาจต้องเขียนรหัสรูปทรงกระบอกของคุณเองและออกค่าพิกัดพื้นผิวที่เหมาะสม


1

หากคุณต้องการให้พิกัดยูวีของคุณอยู่ระหว่าง 0 ถึง 1 คุณสามารถใช้เมทริกซ์มาตราส่วนสำหรับโมเดลของคุณได้

ดังนั้นในการโหลดแบบจำลองของคุณคุณสามารถตรวจสอบพิกัดสูงสุดและ v ของคุณและสร้างเมทริกซ์มาตราส่วนที่จะทำให้มัน "ปกติ" มากขึ้น นั่นจะเป็นการแทนที่สเกลด้วยตนเองของคุณเป็น 10 หรือ 100 ดังนั้นเพื่อให้พอดีคุณจะต้องลดพิกัดยูวีลงไปที่ [0,1]

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

แน่นอนว่านี่เป็นเพียงวิธีการแก้ปัญหาและคุณสามารถหาวิธีตั้งค่า Sketchup ในการตั้งค่าที่เหมาะสม (ฉันคิดว่าตัวส่งออกหรือ Sketchup ของคุณผิดพลาดที่นี่) แต่ถ้ามันไม่ได้ผลสำหรับคุณให้สร้าง post-loading-processor และบันทึก matrix scaling matrix


@Marmix นี่คือทางออกที่ง่ายมีประสิทธิภาพและสง่างาม !!!
3d-indiana-jones

0

ดูเหมือนว่า SketchUp จะไม่ทำให้พิกัดพื้นผิวของคุณเป็นปกติหรือใช้ตัวชี้วัดของตัวเอง มี texcoords <0 หรือ> 1 และ GL_REPEAT เนื่องจากการห่อพื้นผิวหมายความว่าพื้นผิวจะถูกลดขนาดลงเพื่อให้พอดีกับเรขาคณิตและทำซ้ำในแนวนอนและแนวตั้ง

ลองนำเข้าตาข่ายในแพ็คเกจการสร้างแบบจำลองอื่น (MilkShape, Blender) และแก้ไขแผนที่ UV จากที่นั่น


4
การมีเท็กซัส <0 หรือ> 1 และ GL_REPEAT เป็นการตัดพื้นผิวหมายความว่าพื้นผิวจะถูก [ ลบคำสั่งที่ผิดพลาด ] ซ้ำไปซ้ำมาทั้งแนวนอนและแนวตั้ง
Kromster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.