การทำแผนที่ปกติใช้งานได้จริงอย่างไร


10

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

ฉันคิดอย่างไรเกี่ยวกับบรรทัดฐานและความสัมพันธ์ของพวกเขากับสี RGB มีดังนี้ หน่วยทรงกลมแสดงถึงหน่วยปกติใด ๆ ที่เป็นไปได้ - กล่าวอีกนัยหนึ่งส่วนประกอบ X, Y และ Z ของเวกเตอร์ปกติหน่วยตั้งแต่ -1 ถึง 1 ส่วนประกอบของสี RGB ทั้งหมดอยู่ระหว่าง 0 ถึง 255 ดังนั้นจึงเหมาะสม ไปที่แผนที่ -1 (องค์ประกอบปกติ) ถึง 0 (องค์ประกอบสี), 0 ถึง 127 หรือ 128 และ 1 ถึง 255 ค่าใด ๆ ที่อยู่ระหว่างนั้นจะถูกประมาณเชิงเส้น

การนำการแมปนี้ไปใช้กับบรรทัดฐานของวัตถุ 3 มิติโดยพลการนั้นจะให้ภาพที่มีสีสันมากไม่ใช่สีน้ำเงินทั้งหมด ตัวอย่างเช่นเมื่อทำการลูกบาศก์ใบหน้าทั้งหกใบหน้าจะมีสีที่ต่างกัน แต่เป็นสีเดียวกัน ตัวอย่างเช่นใบหน้าที่มีค่าปกติ (1,0,0) จะเป็น (255,128,128) ใบหน้าที่มีค่าปกติ (0,0, -1) จะเป็น (128,128,0) เป็นต้น

อย่างไรก็ตามด้วยเหตุผลบางอย่างแผนที่ปกติของลูกบาศก์ที่ฉันพบนั้นมีสีฟ้าอย่างสมบูรณ์เช่น (128,128,255) แต่ชัดเจนบรรทัดฐานไม่ได้อยู่ในทิศทางบวกทั้งหมดเช่น (0,0,1) มันทำงานอย่างไร

[แก้ไข]

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

[แก้ไข 2]

ฉันอาจจะพูดถึงว่าฉันกำลังทำงานกับพื้นผิวแบบพาราเมตริก พื้นผิวเหล่านี้ประกอบด้วยชุดแพตช์พื้นผิวโดยที่แต่ละแพทช์จะเชื่อมโยงกับพื้นที่พาราเมตริกของตัวเอง (u, v) = [0,1] x [0,1] ณ จุดใด ๆ บนพื้นผิวปกติสามารถคำนวณได้อย่างแม่นยำ เห็นได้ชัดว่าเวกเตอร์ T ( แทนเจนต์ ) และ B ( ทวิแทนเจนต์ ) - จำเป็นต้องครอบคลุมพื้นที่แทนเจนต์ - ไม่ใช่แค่อนุพันธ์ย่อยของแพทช์ผิวในทิศทางของ u และ v ...


คุณเคยลองใช้ phong หรืออย่างน้อยก็การแรเงากระจาย? คุณรู้สูตรพื้นฐานเช่นจุด (a, b) = cos (มุม (a, b)) สำหรับเวกเตอร์หน่วย a, b หรือไม่? การใช้งานไม่กี่ชั่วโมงจะช่วยให้คุณประหยัดเวลาหลายปี
Ivan Kuckir

@Ailurus: ดูความคิดเห็นของฉัน / คำตอบเกี่ยวกับวิธีการแก้ไขปัญหาเดียวกันสำหรับวัตถุภูมิประเทศ / ความสูงฟิลด์ มันซับซ้อนกว่าวัตถุอื่น ๆ เล็กน้อย แต่แนวคิดไม่ควรแตกต่างกัน
Teodron

กรณีเฉพาะของการแมปปกติของภูมิประเทศ: gamedev.stackexchange.com/questions/43894//
teodron

คำตอบ:


14

การทำแผนที่พื้นผิวคือการทำแผนที่ระหว่างจุดบนพื้นผิว 3 มิติและจุดที่สอดคล้องกันบนภาพพื้นผิว หากคุณมีการแมปพื้นผิว 1: 1 ดังนั้นทุกจุดบนแผนที่พื้นผิว 3 มิติจะมีจุดเฉพาะและไม่ซ้ำกันในภาพพื้นผิว (แม้ว่าการย้อนกลับจะไม่จำเป็นต้องเป็นจริงตำแหน่งบางตำแหน่งในพื้นผิวจะไม่จำเป็นต้องแมปไปยังตำแหน่งต่างๆ บนพื้นผิว).

ด้วยการทำแผนที่คุณสามารถผ่านพื้นผิว 3 มิติและจัดเก็บแต่ละปกติที่แตกต่างกันในตำแหน่งที่สอดคล้องกันในพื้นผิว

โอเคเรามาทำกัน เราจะผ่านพื้นผิว 3 มิติและสร้างบรรทัดฐานพื้นที่วัตถุในแผนที่ที่แมปแล้วติดเข้ากับพื้นผิว ดังนั้นเมื่อเราต้องการเรนเดอร์เราก็ดึงเอาอ็อบเจ๊กต์สเปซปกติออกจากพื้นผิวและเราก็เสร็จเรียบร้อยแล้ว ขวา?

ใช่แล้วมันก็ใช้ได้ แต่มันก็หมายความว่าบรรทัดฐานของพื้นผิวสามารถใช้ได้กับวัตถุนั้นเท่านั้น และก็หมายความว่าบรรทัดฐานของพื้นผิวสามารถใช้ได้กับวัตถุนั้นและกับการทำแผนที่พื้นผิวเฉพาะนั้นเท่านั้น ดังนั้นหากคุณต้องการหมุนการจับคู่พื้นผิวด้วยวิธีใดวิธีหนึ่งหรือแก้ไขด้วยการแปลง UV คุณก็โชคไม่ดี

โดยทั่วไปสิ่งที่ผู้คนใช้คือแผนที่ปกติที่บรรทัดฐานอยู่ใน "พื้นที่สัมผัสกัน" แทนเจนต์ - สเปซคือพื้นที่ที่สัมพันธ์กับจุดที่แมปบนพื้นผิว 3 มิติโดยที่ปกติไม่มีการแก้ไขอยู่ในทิศทาง + Z และแกน X และ Y ชี้ไปตามแกน U และ V ที่สัมพันธ์กับพื้นผิว

พื้นที่สัมผัสเป็นหลักปกติบรรทัดฐาน ในพื้นที่สัมผัสแทนปกติ (0, 0, 1) หมายถึง "ไม่มีการแก้ไข" เสมอ; มันเป็นเรื่องปกติที่คุณจะได้รับจากการสอดแทรกจุดยอดปกติ สิ่งนี้นำไปสู่สิ่งที่มีประโยชน์มากมายที่คุณสามารถทำได้หนึ่งในสิ่งที่สำคัญที่สุดคือการเก็บไว้ในข้อมูลน้อยลง

เนื่องจาก Z จะเป็นค่าบวกเสมอดังนั้นคุณสามารถคำนวณได้ในส่วนของคุณจากองค์ประกอบ X และ Y เนื่องจากคุณต้องการเพียง 2 ค่าดังนั้นคุณสามารถใช้ (ในระบบการตั้งชื่อรูปแบบภาพ OpenGL ) GL_RG8ซึ่งเป็นรูปแบบ 2 ไบต์ต่อพิกเซลแทนที่จะGL_RGBA8เป็น 4 ไบต์ต่อพิกเซล ( GL_RGB8จะยังคงเป็น 4 ไบต์ต่อพิกเซล เนื่องจาก GPUs จะบีบแต่ละพิกเซลออกไป 4 ไบต์) ยิ่งไปกว่านั้นคุณสามารถบีบอัดค่าสองค่าเหล่านี้ซึ่งนำไปสู่รูปแบบ 1 ไบต์ต่อพิกเซล ดังนั้นคุณจึงลดขนาดพื้นผิวลงเหลือ 75% ของแผนที่ปกติพื้นที่ว่างในวัตถุ

ก่อนที่คุณจะสามารถพูดคุยเกี่ยวกับแผนที่ปกติใด ๆ คุณต้องรู้ก่อนว่ามันเก็บอะไรไว้ มันเป็นแผนที่ปกติของวัตถุ - อวกาศ, แผนที่ปกติแทนเจนต์ - อวกาศหรืออย่างอื่น?


เอาล่ะแผนที่ประเภทแรกที่คุณพูดถึงคือแผนที่ปกติแบบพื้นที่ว่างใช่ไหม? นี่เป็นสีที่มีสีสันมากขึ้นเพราะมันเก็บองค์ประกอบ X, Y และ Z จริงของบรรทัดฐาน ประเภทที่สองแผนที่ปกติพื้นที่สัมผัสแทนดูเหมือนว่าจะเก็บสิ่งที่ชอบเยี่ยงอย่างกับบรรทัดฐานมากกว่าบรรทัดฐานของตัวเอง ฉันจะอ่านแนวคิดของพื้นที่สัมผัสกันและกลับมาตรวจสอบในภายหลัง
Ailurus

ตกลงดังนั้นพื้นที่แทนเจนต์ของจุดบนพื้นผิวเป็นพื้นที่ของเวกเตอร์แทนเจนต์ทั้งหมดของจุดนั้น อย่างไรก็ตามในกรณีที่ผมไม่เห็นว่าปกติเท่าที่เห็นจากพื้นที่สัมผัสสามารถเป็นอะไรอื่นนอกจาก (0,0,1)? กล่าวอีกนัยหนึ่งฉันคาดหวังว่าแผนที่ปกติจะเป็นสีน้ำเงินสม่ำเสมอ (128,128,255) ตัวอย่างที่แสดงในหน้า wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) มีสีอื่น ๆ ฉันเข้าใจว่าแผนที่นี้สามารถใช้ในการเปลี่ยนบรรทัดฐานได้อย่างไร แต่ไม่ใช่วิธีการคำนวณจริง
Ailurus

@Ailurus: " โอเคดังนั้นพื้นที่แทนเจนต์ของจุดบนพื้นผิวเป็นเพียงพื้นที่ของเวกเตอร์แทนเจนต์ทั้งหมดของจุดนั้น " ไม่มันไม่ใช่ มันเป็นพื้นที่ที่กำหนดโดยปกติ (ไม่แปร) และทิศทางของพิกัดพื้นผิวที่จุดนั้นบนพื้นผิว มันทำให้ปกติที่เก็บไว้ในพื้นผิวเป็นสัมพันธ์กับการทำแผนที่พื้นผิวและปกติในปัจจุบันก่อนที่จะแก้ไข
Nicol Bolas

อาจเป็นส่วนที่ยากที่สุดเกี่ยวกับแผนที่ปกติคือการทำแผนที่ตัวเอง (รวมถึงวิธีการคำนวณเวกเตอร์แทนเจนต์) การคำนวณเวกเตอร์แทนเจนต์ไม่ได้เชื่อมโยงกับการทำแผนที่ UV / การห่อของพื้นผิวแบบกระจายและเรขาคณิตของวัตถุทั้งหมดหรือไม่ ใส่อีกวิธีหนึ่ง: คุณมีแผนที่ปกติสองแบบที่แตกต่างกันสำหรับวัตถุ แต่มีการคำนวณฟิลด์แทนเจนต์ (และปกติ) เพียงฟิลด์เดียวเท่านั้น คุณอาจพบว่าคุณไม่สามารถใช้สนามแทนเจนต์อย่างสม่ำเสมอกับพื้นผิวธรรมดาสองแบบที่แตกต่างกัน (แม้ว่าคุณจะพบการแม็ปยูวีที่เหมาะสมในเชิงเรขาคณิต
Teodron

@ NicolBolas อาฉันสับสนเพราะบางแหล่งอ้างว่าเวกเตอร์ T, B และ N เป็นพื้นฐานแบบออร์โธปรกติในขณะที่คนอื่นพูดถึงว่ามันไม่จำเป็นจริง
Ailurus

3

แผนที่ปกติถูกแมปโดยใช้พื้นที่แทนเจนต์ที่เรียกว่าซึ่งเป็นพื้นที่ในท้องถิ่นโดยขึ้นอยู่กับพื้นผิวของแบบจำลอง สิ่งนี้ควรตอบคำถามของคุณทั้งสอง

มันไม่ได้ขึ้นอยู่กับมุมมองเพราะพื้นที่นี้ไม่มีส่วนเกี่ยวข้องกับกล้อง ในแผนที่ปกติ Z คือทิศทางขึ้น หากคุณดูบรรทัดฐานของแบบจำลองเวกเตอร์ปกติส่วนใหญ่จะชี้ออกจากตาข่ายโดยตรง พื้นผิวตาข่ายเป็นพื้นที่ผิวที่ฉันพูดถึงดังนั้นในระบบพิกัดท้องถิ่นนั้นขึ้นมาคือทิศทาง "ออกไปด้านนอก"


ขอบคุณสำหรับการชี้แจงนี้! แต่ฉันไม่ได้ใช้ตาข่ายเหลี่ยมเป็นพื้นผิว แต่ค่ผิวเรียบพารา ดังนั้นบรรทัดฐานทั้งหมดจะถูกบันทึกไว้เมื่อชี้ไปในทิศทาง (0,0,1) ใช่ไหม?
Ailurus

1

เลื่อนลงในหน้านี้

ดูที่การวาดภาพ B / W ทางขวาภายใต้ชุดข้อมูล - นี่คือ (หรืออย่างน้อยก็เคยเป็น) ที่รู้จักกันในนามของการวาดภาพสัตว์ชนิดหนึ่งที่มีขนแหลมคล้ายเม่น, การแสดงผลของพื้นผิว

ดังนั้นเพื่อที่จะเข้าใจแผนที่ปกติแบบดั้งเดิมลองนึกถึงเม่นที่หงุดหงิดที่มีสันทั้งหมดยื่นออกมา - หนามแต่ละอันนั้นเป็นเรื่องปกติกับพื้นผิวของเม่นที่อยู่ด้านล่าง -

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

ตอนนี้ตัวอย่างนี้มุ่งเน้นไปที่แผนที่ปกติของ OBJECT ซึ่งจะกำหนดบรรทัดฐานด้วยความเคารพต่อวัตถุและนี่คือค่าคงที่ภายใต้การหมุนการแปลหรือการปรับสเกลของวัตถุหรือกล้องหรือสิ่งอื่นใดตามที่กล่าวไว้ก่อนหน้านี้ แผนที่ปกติชนิดเดียวเท่านั้น แต่เป็นแผนที่ที่ธรรมดาที่สุด


0

ฉันคิดว่าคุณอาจเข้าใจผิดว่าแผนที่ปกติเป็นอย่างไร โดยทั่วไปมันเป็นวิธีการจำลองลักษณะของบางสิ่งบางอย่างที่เป็นหลุมเป็นบ่อเมื่อในความเป็นจริงรูปทรงเรขาคณิตจะแบนอย่างสมบูรณ์

สีของแผนที่ปกติถูกตีความโดย shader เทคโนโลยีและประมวลผลตามความเข้มแสงและทิศทางรวมถึงมุมมองกล้องของคุณ ซึ่งหมายความว่าคุณอาจมีพื้นอิฐซึ่งเป็นพื้นราบโดยมีพื้นผิวเรียบ แต่เนื่องจากมีแผนที่ปกติที่มีรูปร่างอิฐเหมือนกันเมื่อคุณมองไปรอบ ๆ แสงจะปรากฏออกมาจากด้านข้าง ของก้อนอิฐทำให้มันดู 3D มากกว่าที่เป็นอยู่

แน่นอนว่ามันเป็นเพียงภาพลวงตา แต่ราคาถูกกว่าการมีรูปทรงเรขาคณิตที่ซับซ้อน และไม่สีของแผนที่ปกติไม่เปลี่ยน พวกเขาเพียงแค่แสดงค่าที่จะเปรียบเทียบกับใน shader ฉันแน่ใจว่าคนที่นี่จะสามารถเติมคุณในรายละเอียดเพิ่มเติม


ฉันรู้ แต่ขอบคุณครับสำหรับคำตอบของคุณ :)
Ailurus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.