ทำไมเราถึงย้ายโลกแทนกล้อง


87

ฉันได้ยินมาว่าในเกม OpenGL สิ่งที่เราทำเพื่อให้ผู้เล่นเคลื่อนไหวไม่ใช่เพื่อขยับกล้อง แต่เพื่อเคลื่อนย้ายโลกทั้งใบ

ตัวอย่างเช่นที่นี่เป็นส่วนหนึ่งของบทช่วยสอนนี้: OpenGL View matrix

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

ทำไมเราทำเช่นนั้น?


1
กล้องไม่ได้หมายถึงอะไรนอกจากมุมมองการฉายภาพ ดังนั้นคุณเปลี่ยนโลกให้ได้ภาพที่คุณต้องการ แนวคิดแปลก แต่จริง ๆ แล้วมันสมเหตุสมผล ... ในทาง ... ฉันคิดว่า
Sidar

@sharethis ฉันได้ปรับปรุงคำตอบของฉันพร้อมคำอธิบายที่ดีกว่า เพิ่มมุมมองของการฉายภาพด้วยตัวเลือกคณิตศาสตร์และกล้อง 3 มิติ (กล้องเสมือน) อาจเป็นประโยชน์สำหรับคุณและคนอื่น ๆ
Md Mahbubur Rahman

4
สิ่งนี้ไม่เป็นความจริงเนื่องจากการดำเนินการทั้งสอง (การย้ายกล้องหรือวัตถุในโลก) มีความสมมาตรจึงไม่มีทางบอกได้เลยว่าการดำเนินการใดเกิดขึ้น คุณกำลังคิดเกี่ยวกับโลกที่เคลื่อนไหวเกี่ยวกับกล้อง แต่คนอื่น ๆ สามารถเห็นภาพของกล้องที่เคลื่อนไหวในทิศทางตรงกันข้ามกับโลก ... เอาล่ะดังนั้นคุณสามารถย้ายวัตถุที่สัมพันธ์กันดังนั้นวิธีหนึ่งอาจใช้งานง่ายกว่า แต่ไม่ใช่ คนเป็น "ผิด" ทั้งสองวิธีในการมองเห็นสถานการณ์เป็นสิ่งที่ดีในสถานการณ์ที่แตกต่างกัน บ่อยครั้งที่จะคิดเกี่ยวกับทั้งสองอย่างมีประโยชน์
3728501

คำตอบ:


72

ทำไม

เพราะกล้องแสดงมุมมองการฉาย

แต่ในกรณีของกล้อง 3D (กล้องเสมือนจริง) กล้องจะเคลื่อนไหวแทนโลก ฉันได้อธิบายอย่างละเอียดภายหลังคำตอบนี้

การทำความเข้าใจทางคณิตศาสตร์

มุมมองโปรเจคชั่นเคลื่อนที่ไปรอบ ๆ อวกาศและเปลี่ยนทิศทางของมัน สิ่งแรกที่สังเกตได้คือการฉายภาพที่ต้องการบนหน้าจอจะไม่เปลี่ยนแปลงตามทิศทางการมอง

ด้วยเหตุนี้เราจึงเปลี่ยนสิ่งอื่น ๆ เพื่อให้ได้ภาพที่ต้องการ

ความเข้าใจจาก http://opengl.org

เพื่อให้ภาพลักษณ์ของการเคลื่อนไหวกล้องแอพพลิเคชั่น OpenGL ของคุณต้องย้ายฉากด้วยการกลับกันของการเปลี่ยนแปลงของกล้อง ที่เกี่ยวข้องกับ OpenGL ไม่มีกล้อง โดยเฉพาะอย่างยิ่งกล้องจะอยู่ที่พิกัดตาเสมอ (0, 0, 0)

ความเข้าใจจาก http://open.gl

และต้องการแชร์บรรทัดต่อไปนี้จากส่วนดูเมทริกซ์ของhttp://open.gl/transformations

ในการจำลองการเปลี่ยนแปลงของกล้องคุณต้องเปลี่ยนโลกด้วยค่าผกผันของการแปลงนั้น ตัวอย่าง: หากคุณต้องการเลื่อนกล้องขึ้นคุณต้องเลื่อนโลกลงแทน

ทำความเข้าใจกับมุมมอง

ในโลกแห่งความเป็นจริงเราเห็นสิ่งต่าง ๆ ในแบบที่เรียกว่า "มุมมอง"

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

นั่นคือมุมมอง มุมมองเป็นสิ่งสำคัญในโครงการ 3 มิติ หากไม่มีมุมมองโลกแห่ง 3D จะดูไม่เหมือนจริง

แม้ว่าสิ่งนี้อาจดูเป็นธรรมชาติและชัดเจน แต่สิ่งสำคัญคือต้องพิจารณาว่าเมื่อคุณสร้างการแสดงผล 3 มิติบนคอมพิวเตอร์คุณกำลังพยายามจำลองโลก 3 มิติบนหน้าจอคอมพิวเตอร์ซึ่งเป็นพื้นผิว 2 มิติ

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

ดังนั้นเมื่อใช้การเรนเดอร์ 3D เพื่อจำลองฉากในแบบ 3 มิติแล้วฉายฉาก 3D ลงบนพื้นผิว 2 มิติของหน้าจอกระบวนการนี้เรียกว่าการฉายภาพมุมมอง

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

แปลมุมมองเป็นคณิตศาสตร์

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

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อผู้ดูมองวัตถุนี้บนหน้าจอวัตถุ 3 มิติจะ "ฉาย" ไปยังตำแหน่ง 2D ที่อธิบายว่าเป็น xP และ yP ซึ่งอ้างอิงระบบพิกัด 2D ของหน้าจอ (ระนาบการฉายภาพ)

ในการใส่ค่าเหล่านี้ลงในสูตรทางคณิตศาสตร์ฉันจะใช้ระบบพิกัด 3 มิติสำหรับพิกัดโลกโดยที่แกน x ชี้ไปทางขวา y ชี้ขึ้นและ z จุดบวกภายในหน้าจอ ต้นกำเนิด 3 มิติหมายถึงตำแหน่งของสายตาของผู้ดู ดังนั้นแก้วของหน้าจออยู่บนระนาบมุมฉาก (ที่มุมฉาก) ถึงแกน z, ที่ z บางอันที่ฉันจะเรียกว่า zProj

คุณสามารถคำนวณตำแหน่งที่คาดการณ์ xP และ yP โดยการหารตำแหน่งโลก xW และ yW ด้วย zW ดังนี้:

xP = K1 * xW / zW
yP = K2 * yW / zW

K1 และ K2 เป็นค่าคงที่ที่ได้มาจากปัจจัยทางเรขาคณิตเช่นอัตราส่วนภาพของระนาบการฉายภาพของคุณ (วิวพอร์ตของคุณ) และ "มุมมองภาพ" ของดวงตาซึ่งคำนึงถึงระดับการมองเห็นมุมกว้าง

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

การหารด้วย z นี้เป็น "การแบ่งมุมมอง" ที่มีชื่อเสียง

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

คดีสำคัญอื่น ๆ

  • ในกรณีของกล้อง 3D (กล้องเสมือนจริง) กล้องจะเคลื่อนไหวแทนโลก

เพื่อให้เข้าใจกล้อง 3 มิติได้ดียิ่งขึ้นลองจินตนาการว่าคุณกำลังถ่ายภาพยนตร์ คุณต้องตั้งค่าฉากที่คุณต้องการถ่ายและคุณต้องการกล้อง เพื่อให้ได้ภาพคุณจะท่องไปทั่วฉากด้วยกล้องถ่ายภาพวัตถุในฉากจากมุมและมุมมองที่แตกต่างกัน

กระบวนการถ่ายทำเดียวกันนี้เกิดขึ้นกับกล้อง 3D คุณต้องมีกล้อง "เสมือน" ซึ่งสามารถท่องไปทั่วฉาก "เสมือน" ที่คุณสร้างขึ้น

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

นี่คือหลักฐานพื้นฐานของกล้อง 3D: กล้องเสมือนจริงที่คุณสามารถใช้เพื่อท่องไปรอบ ๆ ฉาก 3 มิติและแสดงภาพจากมุมมองที่เฉพาะเจาะจง

ทำความเข้าใจเกี่ยวกับอวกาศโลกและพื้นที่ดู

ในการเขียนโค้ดพฤติกรรมประเภทนี้คุณจะแสดงเนื้อหาของโลก 3 มิติจากมุมมองของกล้องไม่ใช่เพียงจากมุมมองระบบพิกัดโลกหรือจากมุมมองคงที่อื่น ๆ

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

หลังจากวางวัตถุจำลองลงในฉาก 3 มิติแล้วคุณจะเปลี่ยนจุดยอดของโมเดลเหล่านี้โดยใช้เมทริกซ์ "การแปลงสภาพโลก" แต่ละวัตถุมีเมทริกซ์โลกของตัวเองที่กำหนดว่าวัตถุอยู่ในโลกและวิธีการที่จะเน้น

ระบบอ้างอิงใหม่นี้เรียกว่า "พื้นที่โลก" (หรือพื้นที่โลก) วิธีง่ายๆในการจัดการคือการเชื่อมโยงโลกแปลงเมทริกซ์กับแต่ละวัตถุ

ในการใช้งานพฤติกรรมของกล้อง 3D คุณจะต้องดำเนินการตามขั้นตอนเพิ่มเติม คุณจะอ้างอิงโลกไม่ใช่แหล่งกำเนิดของโลก แต่อ้างอิงถึงระบบอ้างอิงของกล้อง 3D เอง

กลยุทธ์ที่ดีคือการใช้กล้องเป็นวัตถุ 3 มิติที่แท้จริงในโลก 3 มิติ เช่นเดียวกับวัตถุ 3 มิติอื่น ๆ คุณใช้เมทริกซ์ "การแปลงสภาพโลก" เพื่อวางกล้องในตำแหน่งและทิศทางที่ต้องการในโลก 3 มิติ เมทริกซ์การแปลงโลกของกล้องนี้แปลงวัตถุกล้องจากการหมุนแบบดั้งเดิม (ตามแนวแกน z) ไปยังโลกจริง (ตำแหน่ง xc, yc, zc) และการหมุนโลก

รูปต่อไปนี้แสดงความสัมพันธ์ระหว่างระบบพิกัดโลก (x, y, z) และระบบพิกัดมุมมอง (กล้อง) (x ', y', z ')

ป้อนคำอธิบายรูปภาพที่นี่


5
คำตอบอื่น ๆ อยู่ที่นั่น คุณไม่จำเป็นต้องแก้ไขมันเป็นของคุณเอง
Jesse Dorsey

1
@ Noctrine ขอบคุณ ฉันไม่ทราบวิธีการสร้างการเชื่อมโยงระหว่างหน้า
Md Mahbubur Rahman

"ในส่วนถัดไปคุณจะใช้สูตรการคาดการณ์มุมมองนี้ใน ActionScript ที่คุณสามารถใช้ในโครงการ Flash 3D ของคุณ" เนื่องจากไม่มีการกล่าวถึงโปรเจ็กต์ Flash 3D ในคำถามเดิมทำให้ฉันคิดว่าคุณคัดลอกวางจากที่อื่นซึ่งก็ดีถ้าคุณอ้างอิงแหล่งที่มาของคุณ
Gilles

@Gilles ขออภัยสำหรับความผิดพลาดของฉัน ฉันได้แก้ไขคำตอบของฉัน ฉันได้เตรียมคำตอบที่ศึกษาแหล่งข้อมูลหลายแห่ง และขอบคุณมากที่คุณชี้ให้เห็น :)
Md Mahbubur Rahman

โปรดทราบว่าglMatrixMode()และฟังก์ชั่นเพิ่มเติมอีกสองสามอย่างที่อ้างถึงใน: eng.utah.edu/~cs6360/Lectures/frustum.pdfและopengl.org/archives/resources/faq/technical/viewing.htmจะถูกคัดค้าน อย่างไรก็ตามคำอธิบายทางคณิตศาสตร์ยังคงถูกต้องและเป็นประโยชน์
patryk.beza

28

คำตอบของ Mahbubar R Aaman ค่อนข้างถูกต้องและลิงก์ที่เขาให้อธิบายคณิตศาสตร์นั้นถูกต้อง แต่ในกรณีที่คุณต้องการคำตอบทางเทคนิค / คณิตศาสตร์ที่น้อยกว่าฉันจะลองวิธีอื่น

ตำแหน่งของวัตถุในโลกแห่งความเป็นจริงและโลกของเกมถูกกำหนดด้วยระบบพิกัดบางอย่าง ระบบพิกัดให้ความหมายกับค่าตำแหน่ง ถ้าฉันบอกคุณว่าฉันอยู่ที่ "100,50" ที่จะไม่ช่วยคุณเว้นแต่คุณจะรู้ว่าตัวเลขเหล่านั้นหมายถึงอะไร (เป็นไมล์กิโลเมตรกิโลเมตรและลองจิจูด ฯลฯ ) หากพวกเขาเป็นพิกัดคาร์ทีเซียน (พิกัดชนิด "ปกติ") คุณต้องทราบด้วยว่าแหล่งกำเนิดนั้นเกี่ยวข้องกับอะไร ถ้าฉันแค่พูดว่า "ฉันอยู่ทางตะวันออก 100 ฟุต" คุณต้องรู้ว่า "ทิศตะวันออกของอะไร " ซึ่งเรียกว่าที่มาของพิกัด

มีวิธีคิดแบบนี้ง่าย ๆ คุณสามารถบอกใครบางคน "สถานีรถไฟอยู่ห่างไปทางเหนือ 3 กิโลเมตรและ 1.5 กิโลเมตรทางตะวันออกของมุมตะวันตกเฉียงใต้ของเมือง" คุณสามารถบอกใครบางคนว่า "สถานีรถไฟอยู่ทางเหนือของที่ฉันอยู่ตอนนี้ 1 ไมล์" พิกัดทั้งสองนั้นถูกต้องและระบุที่ตั้งของจุดสังเกตเดียวกัน แต่วัดจากจุดกำเนิดที่ต่างกันและด้วยเหตุนี้จึงมีค่าตัวเลขที่แตกต่างกัน

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

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

แน่นอนว่ากล้องมีตำแหน่งและการวางแนวเช่นกัน ดังนั้นหากวัตถุอยู่ที่ตำแหน่ง 20,100,50 และกล้องอยู่ที่ตำแหน่ง 10,200, -30 ตำแหน่งของวัตถุที่สัมพันธ์กับกล้องคือ 10,100,80 (ตำแหน่งของวัตถุจะลบตำแหน่งของกล้อง) เมื่อกล้องเคลื่อนที่ในเกมตำแหน่งกล้องในพิกัดโลกจะถูกเคลื่อนย้ายอย่างที่คุณคาดหวัง

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

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

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


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

+1 เพื่อทำให้ชัดเจนว่ากล้องเคลื่อนไหวหรือโลกเป็นเพียงแค่ฟังก์ชั่นที่ระบบพิกัดที่คุณกำลังพูดถึง
David Moles

11

เพียงแค่เพิ่มเข้าไปอีกสอง (ยอดเยี่ยม) จะได้คำตอบเพิ่มเติมอย่างละเอียดเกี่ยวกับจุดที่ Mahbubur R Aaman สัมผัสกับ: "ไม่มีกล้อง"

สิ่งนี้ค่อนข้างจริงและแสดงถึงความล้มเหลวของการเปรียบเทียบ "กล้อง" ทั่วไปเนื่องจาก "กล้อง" ไม่มีอยู่จริง สิ่งสำคัญคือต้องตระหนักว่าการเปรียบเทียบกล้องนั้นเป็นแบบนั้น - การเปรียบเทียบ มันไม่ได้อธิบาย (หรือแกล้งอธิบาย) วิธีการทำงานของเบื้องหลังจริง ๆ

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

ตอนนี้คุณมีวัตถุสองประเภทที่เกี่ยวข้องที่นี่: จุดชมวิวและทุกสิ่งในโลก คุณต้องการย้ายจุดชมวิวให้ใกล้กับวัตถุบางอย่างมากขึ้น แต่สำหรับการเคลื่อนไหวนี้ผลลัพธ์ที่ได้ก็เหมือนกันไม่ว่ามุมมองนั้นจะเข้าใกล้วัตถุมากขึ้นหรือวัตถุนั้นขยับเข้าใกล้มุมมองมากขึ้น สิ่งที่คุณทำคือการเปลี่ยนระยะห่างระหว่างพวกเขา เนื่องจากระยะทางในปัจจุบันคือ X และคุณต้องการให้ระยะทางใหม่เป็น Y มันไม่สำคัญว่าคุณจะเคลื่อนไหวตราบใดที่หลังจากการย้ายระยะทางใหม่คือ Y ดังนั้นคุณจึงไม่เคลื่อนไหวเลยคุณ เพียงแค่เปลี่ยนระยะทาง (ฉันไม่ได้ตั้งใจจะมาเหนือไอน์สไตน์ในเรื่องนี้ ... ซื่อสัตย์!)

แต่เนื่องจากกล้องไม่มีอยู่สิ่งเดียวที่คุณสามารถเปลี่ยนระยะทางคือวัตถุ ดังนั้นคุณเปลี่ยนระยะทางของวัตถุและออกมาผลลัพธ์เดียวกันมาก เนื่องจากวัตถุทั้งหมดผ่านการแปลงต่อไปดังนั้นจึงไม่แพงมากหรือน้อย

คำอธิบายทางคณิตศาสตร์ที่ง่ายขึ้นอาจช่วยได้มากขึ้น สมมติว่าพิกัดทั้งหมดเป็น 1D - จุดชมวิวอยู่ที่ 0 วัตถุของคุณอยู่ที่ 4 และคุณต้องการให้จุดชมวิวเป็น 3 นั่นหมายความว่าระยะห่างระหว่างพวกเขาจะเปลี่ยนจาก 4 (4 - 0) เป็น 1 (4 - 3) แต่เนื่องจากกล้องไม่มีอยู่คุณจึงไม่สามารถเปลี่ยน 0 ได้ มันจะเป็น 0 เสมอแทนที่จะเพิ่ม 3 ถึง 0 (ซึ่งคุณทำไม่ได้) คุณลบ 3 จาก 4 (ซึ่งคุณทำได้) - วัตถุอยู่ที่ 1 และผลลัพธ์สุดท้ายคือระยะห่างระหว่างกันมาก มุมมองและวัตถุคือ 1


แม้ว่าในขณะที่กล้องไม่ได้เป็นเช่นนี้คุณยังสามารถคำนวณตำแหน่งของมันก่อนการเปลี่ยนแปลง อย่างไรก็ตามในบางกรณี (การฉายภาพแบบขนานที่ไม่ใช่แนวแกน) คุณจะพบว่ามีพิกัดมากกว่าหนึ่งใน "อินฟินิตี้" (บวกหรือลบ) ซึ่งมีประโยชน์น้อยกว่าเมทริกซ์การแปลง
Martin Sojka

7

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

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

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

ดังนั้นในแอปพลิเคชันของคุณคุณย้ายกล้องใน coords โลกอัปเดตเมทริกซ์มุมมองของช่างภาพส่งเมทริกซ์มุมมองใหม่ไปยังจุดสุดยอดเป็นเครื่องแบบหรือส่วนหนึ่งของบล็อกสร้างฉากของคุณ


5

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

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


4

ฉันไม่คิดว่าการอ้างสิทธิ์นั้นเป็นความจริงอย่างแท้จริงเนื่องจากมีเพียง "เคลื่อน" พิกัดโลกในเกมเพียงเล็กน้อยเท่านั้น แต่จริงๆแล้วเปลี่ยนพิกัดของกล้องเสมือนจริง

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

ในแง่ที่ว่าโลกไม่ได้ขยับ แต่เพียงคนเดียวที่คำนวณพิกัดโลกในระบบพิกัดของพื้นที่คลิป


2

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


2

คำตอบที่ดีมากมายที่นี่ ฉันจะพยายามไม่ทำซ้ำพวกเขา บางครั้งการคิดในแง่ของกล้องง่ายกว่าเช่นวิธี Direct3D ทำ (หมายเหตุ: ยังไม่ได้เล่นกับโพสต์ 9.0c จำนวนมาก)

"การเคลื่อนย้ายโลก" เช่นเดียวกับในความรู้สึกที่ฟุราม่าว่ามีคนอ้างถึงนั้นเป็นวิธีที่ดีมากที่จะมองมัน ("เครื่องยนต์ไม่ขยับเรือเลยเรืออยู่ในตำแหน่งที่มันอยู่และเครื่องยนต์เคลื่อนที่ไปรอบ ๆ จักรวาล มัน!"). นี่เป็นเรื่องธรรมดาสำหรับเกม 2D คุณมีวิวพอร์ตจริงๆที่คุณต้องปรับตัวให้ลำบากและบางครั้งก็เป็นวิดีโอแรมของคุณหรือหน้าต่าง UI ถ้า OpenGL ทำเพื่อเหตุผลเหล่านั้นใช่มั้ยยากที่จะบอก

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


1
ช้า แต่คำตอบก็ดีเหมือนกัน!
danijar

ขอบคุณ! ฉันมักจะพบว่าการเพิ่มการอภิปรายในหน้าเว็บที่พบผ่านเครื่องมือค้นหากลายเป็นที่นิยมอย่างมากโดยเฉพาะอย่างยิ่งถ้าข้อมูลนั้นมีประโยชน์หรือน่าสนใจ
Joe Plante

2

ดูเหมือนจะมีความเข้าใจผิดเกิดขึ้นมากมายตั้งแต่ผู้เขียนเอกสาร OpenGL ...

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

ดังนั้นจะเกิดอะไรขึ้นที่นั่นและอะไรขึ้นกับคำพูด?

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

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

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

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


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

แต่มันเป็นเพียงวิธีที่ไม่ช่วยเหลือและสับสนอย่างมากในการคิดเกี่ยวกับมัน ” มันเป็นความจริงด้วย และความจริงก็มีประโยชน์มากกว่าการโกหกเสมอ เพราะไม่ช้าก็เร็วการโกหกนั้นจะติดตามคุณและคุณจะต้องเผชิญหน้ากับความจริง
Nicol Bolas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.