tl; dr: ปัญหาทางคณิตศาสตร์ในเรขาคณิตของ Projective: เราจะหาเมทริกซ์กล้อง 4x4 บางตัวที่ให้ภาพดังที่แสดงไว้ด้านล่างเช่นจุด A, B, C, D อยู่ที่ไหนสักแห่งบนขอบของกล่องหน่วย (เช่นอุปกรณ์มาตรฐาน OpenGL พิกัด) และมุมของกล่องยูนิตอยู่ในจุดที่เหมาะสมตามแนว EA, EB, EC, ED?
(นี่อาจเป็นกรณีพิเศษที่เป็นไปได้ของการทำ homography, perspectivity และ / หรือ collineation ไม่คุ้นเคยกับคำศัพท์)
รายละเอียดเพิ่มเติม
ให้ ABCD รูปสี่เหลี่ยมสามรูปในวิวพอร์ตฉันคิดว่ามีการแปลง (?) ที่ไม่ซ้ำกันซึ่งแมปกลับไปเป็นรูปสี่เหลี่ยมผืนผ้า ดังที่เห็นในภาพด้านล่าง: ABCD รูปสี่เหลี่ยมในวิวพอร์ตทำหน้าที่เป็น 'หน้าต่าง' ทางกายภาพและถ้าเราแมปกลับไปที่สี่เหลี่ยมผืนผ้ามันจะปรากฏผิดเพี้ยน
(ช่องทางด้านขวาแสดงถึง NDC ซึ่งฉันพูดถึงในภายหลัง)
เป้าหมายคือการได้รับภาพทางด้านขวาอย่างรวดเร็ว เราสามารถ raytrace ทุกจุดเพื่อให้ได้ภาพ (ซึ่งฉันได้ทำไปแล้ว) แต่ฉันต้องการใช้ OpenGL หรือเทคนิคการฉายภาพอื่น ๆ เพราะฉันต้องการใช้ประโยชน์จากสิ่งต่าง ๆ เช่นการผสมการใช้งานแบบดั้งเดิมเป็นต้น
ความพยายามครั้งแรก
ฉันเชื่อว่าฉันสามารถแก้ปัญหาในการค้นหาเมทริกซ์กล้อง 3x4 ที่ทำให้พิกัด 3 + 1-มิติเป็นเนื้อเดียวกันใน 3-space (ทางซ้าย) และฉายมันลงไปเป็น 2 + 1 มิติแบบมิติเดียวใน 2-space (บน ทางขวา). เราสามารถแก้ปัญหานี้ได้โดยใช้การแปลงเชิงเส้นโดยตรงเพื่อให้ได้ระบบสมการBa=0
สำหรับรายการที่ไม่รู้จักa
ของเมทริกซ์กล้องและการแก้ปัญหาระบบโดยใช้การสลายตัวของค่าเอกพจน์(SVD) ฉันจะใช้เวกเตอร์ EA, EB, EC, ED (โดยที่ E คือดวงตาทางกายภาพของคุณหรือกล้องในอวกาศโลก) เป็นคะแนนในภาพก่อนและ (0,0), (1,0), (1) , 1), (0,1) หรือบางอย่างที่เป็นจุดในภาพโพสต์และแต่ละคู่ของคะแนนจะให้สมการเชิงเส้นสองสามอันที่จะเสียบเข้ากับ SVD เมทริกซ์ที่ได้นั้นจะแมป EA -> (0,0) เป็นต้น (สมมติว่ามีองศาอิสระพอสมควรเช่นถ้าการแก้ปัญหานั้นไม่เหมือนใครซึ่งฉันไม่แน่ใจให้ดู note [a])
แต่สำหรับความผิดหวังของฉันนี่ไม่ใช่วิธีการทำงานของ OpenGL OpenGL ไม่ได้ฉายภาพ 3 มิติเป็น 2d โดยตรงด้วยเมทริกซ์ 3x4 OpenGL ต้องการ "พิกัดอุปกรณ์ปกติ" (NDC) ซึ่งเป็นจุดสามมิติ หลังจากฉายลงใน NDC ทุกอย่างในกล่อง 'หน่วย' จาก (-1, -1, -1,1) ถึง (1,1,1,1) จะถูกวาด ทุกสิ่งที่อยู่ด้านนอกถูกตัด (เนื่องจากเรากำลังจัดการกับพิกัดแบบเอกพันธ์: จุดใด ๆ (x, y, z, w) จะปรากฏบนหน้าจอเฉพาะเมื่อสามพิกัดแรกของ (x / w, y / w, z / w , 1) อยู่ในกล่องหน่วยจาก -1 ถึง 1)
ดังนั้นคำถามจะกลายเป็น: มีการเปลี่ยนแปลงที่สมเหตุสมผลหรือไม่ที่แมปคิวบอยที่ดูแปลก ๆ ในพิกัดที่เป็นเนื้อเดียวกัน (โดยเฉพาะคิวบอยที่วาดทางด้านซ้ายด้วย ABCD (จุดหน้า) และ A'B'C'D '(จุดหลังซ่อน ด้านหลังจุดหน้า)) ถึงคิวบ์ยูนิตเช่นใช้เมทริกซ์ 4x4 หรือไม่ เราจะทำอย่างไร
สิ่งที่ฉันได้ลอง
ฉันลองทำอะไรที่แข็งแกร่งกว่า: ฉันทำ ABCD และ A'B'C'D 'ดูเหมือน pyramidal frustrum ปกติ (เช่น gl frustrum) (เช่นในการตั้งค่าสมมุตินี้ภาพทางด้านซ้ายจะมีสี่เหลี่ยมผืนผ้าสีดำวางอยู่บน มันไม่ใช่รูปสี่เหลี่ยม) และใช้การแปลงเชิงเส้นโดยตรง / DLT เพื่อแก้ปัญหาสำหรับเมทริกซ์ 4x4 ที่ถูกกล่าวหา อย่างไรก็ตามเมื่อฉันลองมันดูเหมือนว่าจะมีอิสระไม่มากพอ ... เมทริกซ์ 4x4 ที่ได้นั้นไม่ได้แมปอินพุตเวกเตอร์ทุกตัวกับเอาต์พุตเวกเตอร์ทุกตัว ในขณะที่ใช้ A, B, C, D, A '(5 คู่ของการแปลงล่วงหน้าและเวกเตอร์หลังการแปลง) ฉัน / เกือบ / รับผลที่ฉันต้องการ ... เวกเตอร์ถูกแมปอย่างถูกต้อง แต่สำหรับตัวอย่าง B' C ', D' กำลังจับคู่กับ (3,3,1,1) แทน (-1, -1,1,1) และถูกตัดออกโดย OpenGL ถ้าฉันลองเพิ่มจุดที่หก (6 คะแนนสำหรับเมทริกซ์ 4x4 ลงในโปรเจ็กต์) คำตอบของฉันดูเหมือนจะแย่ลง (ศูนย์, อินฟินิตี้) ฉันมีอิสรภาพแค่ไหนในระดับนี้และเป็นไปได้ด้วยการทำแผนที่ 4x4 เมทริกซ์ 4vector ปกติ (3 + 1-vector-homogeneous-Coordinate vectors) ที่เรารู้จักและชื่นชอบ?
ความคิดเล็กน้อยแบบสุ่ม
ฉันเดาว่ามันเป็นไปไม่ได้ที่จะแมปคิวบอยแบบสุ่มใด ๆ กับเมทริกซ์ 4x4 แบบใดก็ได้ แต่ฉันสับสนเพราะฉันคิดว่ามันเป็นไปได้ที่จะแมปสี่เหลี่ยมสามมิติแบบนูนกับสี่เหลี่ยมนูนแบบอื่นใน 2d พูดได้ว่า Photoshop? ... จะทำได้หรือไม่ไม่สามารถทำได้ด้วยการแปลงโปรเจค และวิธีทั่วไปในการ 3d? ...... ด้วยความพยายามที่ล้มเหลวในการค้นหาเมทริกซ์ 4x4 พีชคณิตเชิงเส้นบอกว่าเราไม่ควรคาดหวังเมทริกซ์ NxN ในการทำแผนที่มากกว่า N แบบอิสระเชิงเส้นตรงไปยังจุดเป้าหมาย N ในกรณีที่ดีที่สุด แต่ฉันรู้สึกว่าเป็นเนื้อเดียวกัน พิกัดโกงสิ่งนี้เพราะมี colinearity ที่ซ่อนอยู่เกิดขึ้น? ฉันเดาว่าไม่?
ทางออกอื่นได้หรือไม่
ฉันเดาว่าคนหนึ่งอาจทำสิ่งที่น่าเกลียดดังต่อไปนี้ซึ่งคุณใช้เมทริกซ์การฉายภาพด้วยกล้อง frustrum ทั่วไปหาจุด 2d ที่สอดคล้องกับมุมจากนั้นทำการถ่ายภาพมุมมองบิดเบือน 2d แต่ถ้ามันเกิดขึ้นหลังจากพิกเซลแสดงผล (เช่น photoshop) จากนั้นจะมีปัญหากับการแก้ปัญหา ... อาจเป็นไปได้ว่าสมมุติฐานหนึ่งสามารถหาเมทริกซ์เพื่อทำการแปลงนี้บนระนาบ XY ภายใน NDC-space แล้วเขียนมันด้วยเมทริกซ์ frustrum ปกติ?
(หมายเหตุ [a]: ระดับความเป็นอิสระ: ABCD สามารถถูก จำกัด ให้เป็นโพสต์อิมเมจของการแปลงโปรเจคชั่นที่ทำบนสี่เหลี่ยมได้ถ้าจำเป็น ... นั่นคือสี่เหลี่ยมสีดำทางซ้ายอาจกล่าวได้ว่าเป็น ผลการฉายภาพตัดปะแบบกรอบรูปภาพ)