วัตถุสองครั้งที่ใกล้ที่สุดปรากฏขึ้นสองเท่าใหญ่กว่าอะไร?


16

ดังนั้นฉันจึงคิดที่จะสร้างเกม 2D ที่คุณสามารถเคลื่อนที่ไปตามแกน Z ได้โดยการเปลี่ยนเลเยอร์ที่คุณเป็น ฉันต้องการไต่ 2D สไปรต์ของฉันขึ้นอยู่กับความลึก

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

ตอนนี้โดยการทดสอบด้วยตนเองฉันรู้ว่ากฎไม่ได้ใช้ในโลกแห่งความเป็นจริง;) แต่มีค่าคงที่ที่ใช้ในการคำนวณโลกแห่งความจริงสำหรับมุมมองหรืออะไร? หรือสูตร

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

TL; DR:

"วัตถุสองเท่าใกล้ปรากฏใหญ่เป็นสองเท่า" นั่นไม่จริงในโลกแห่งความจริง แต่ค่าคงที่หรือสูตรใดที่ถูกต้อง


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

ฉันสงสัยว่าทำไมไม่มีใครพูดถึงเกี่ยวกับลอการิทึมธรรมชาติ ...
Chad Harrison

4
ทำไมมันไม่จริงเหรอ? ฉันคิดว่ามันเป็นเรื่องจริง
Ivan Kuckir

@hydroparadise ลอการิทึมธรรมชาติทำอะไรกับคำถามนี้?
นาธานรีด

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

คำตอบ:


19

โดยทั่วไปแล้วมันเป็นเรื่องจริงขึ้นอยู่กับมุมมองของคุณและทิศทางที่มันขยับเช่นเดียวกับมุมมอง

Example of perspectives for objects

สังเกตว่าในมุมมองกล้องแรกอย่างไรเนื่องจากบล็อกสีแดงตั้งฉากกับมุมมองของกล้องวัตถุจะมีขนาดใหญ่เป็นสองเท่าในอัตราส่วน 1: 2 ที่สมบูรณ์แบบ (สังเกตลูกศรที่ชี้ไปที่ขอบของมุมมองหลังจากถูกย้าย ใกล้เคียงเป็นสองเท่า)

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

โดยสรุปนี่หมายความว่าเพื่อนของคุณถูกต้องและอัตราส่วน 1: 1 ("วัตถุสองเท่าใกล้ที่สุดปรากฏขึ้นสองเท่าใหญ่")สำหรับวัตถุของคุณเป็นตัวเลือกที่ดี



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

@Mason Wheeler - จัดเรียง: P
Piddock Tom 'Blue'

8

วัตถุสองเท่าที่ใกล้จะปรากฏใหญ่เป็นสองเท่า มันเป็นผลมาจากทฤษฎีบทของ Thalesและเป็นจริงในโลกแห่งความจริง

หนึ่งสามารถยืนยันว่า Thales ทฤษฎีบทเป็นเครื่องมือทางคณิตศาสตร์หลักที่อยู่เบื้องหลังการฉายมุมมองและสิ่งที่เป็นที่รู้จักกันในกราฟิกท่อ (OpenGL หรือ DirectX) เป็นส่วนมุมมอง มันเป็นทฤษฎีที่คุณควรรู้และเรียนรู้ที่จะรับรู้เมื่อมันสามารถใช้ได้


การอ้างอิงที่ยอดเยี่ยม! ฉันจะตรวจสอบทฤษฎีบทของวลส์อย่างแน่นอนและพยายามทำความเข้าใจระบบกราฟิกให้ดีขึ้น
แบล็กเบอร์รี

7

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


2

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

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

นี่คือแผนภาพแสดงวิธีการแสดงวัตถุไปยังกล้องด้วยระยะทางที่แตกต่างกันสองแบบ

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

การคำนวณตรีโกณมิติพื้นฐานบางอย่างจะนำคุณไปสู่สูตรต่อไปนี้:

f(d, v) = v/(v+d)
* Where f is the size ratio to the original sprite aka size factor
    and v is the distance to the near clipping plane (trial and error value)
    and d is the distance from the near clipping plane to the object

ตัวอย่าง:

Assuming you have a sprite that is 2.5x1.8 units in size and 10 units away 
   from the camera, and that the near clipping plane is 5 units from the camera.

sizeFactor = 5/(5+10) = 0.3

renderHeight = actualHeight * sizeFactor = 1.8 * 0.3 = 0.54
renderWidth  = actualWidth * sizeFactor = 2.5 * 0.3 = 0.75

ฉันขอแนะนำให้เริ่มต้นด้วยv=5จากนั้นปรับจากที่นั่นตามลักษณะที่ปรากฏ ฉันอาจโยนซอเข้าด้วยกันเพื่อให้คุณเห็นการเปลี่ยนแปลงแบบเรียลไทม์

TL; DR

The change in height or width should be multiplied by the following factor:

sizeFactor = v/(v+d)

Where v = Some number greater than 0 that never changes (try 1 thru 5)
  and d = the distance from the camera

So an object that is 2.5 units tall would be rendered at 2.5*sizeFactor units tall.

แก้ไข: เมื่อคุณพูดย้ายตามแกน z ฉันสมมติว่าคุณจะต้องการมุมมองมุมมอง (เช่นเกม 3D ส่วนใหญ่นักกีฬา ฯลฯ ) คณิตศาสตร์ในการคำนวณขนาดวัตถุตามระยะทางจะขึ้นอยู่กับตำแหน่งในเฟรม คล้ายกับวิสัยทัศน์ต่อพ่วง แต่ฉันจะลองกับคณิตศาสตร์ของฉันซึ่งเป็นมุมมอง orthographic (คิดว่ามาริโอ, Angry Birds, Super Smash Bros ฯลฯ ) ฉันไม่รู้ว่ารูปลักษณ์และความรู้สึกของคุณกำลังพยายามบรรลุถึง แต่ตราบใดที่มันดูเหมือนจริงแล้วผู้เล่นจะไม่มีทางรู้!

การสาธิต!


ใช่ฉันกำลังเล็งการดูภาพออโทกราฟ เกมที่ฉัน "ยืม" แรงบันดาลใจในปัจจุบันของฉันจากคือ Rayman Origins ในบางส่วนของเกมคุณสามารถกระโดดขึ้นไปบนดอกไม้และจากนั้นคุณจะตีกลับในชั้นอื่นด้วยความลึกที่แตกต่างกัน จากนั้นกล้องจะซูมเข้าหรือออกให้สัมพันธ์กับความลึกนั้น Axamples สามารถเห็นได้ในวิดีโอนี้เวลา 4:50 และ 5:00 น.
Berry

นอกจากนี้คำตอบที่ดี! แต่เนื่องจากเป็นเพียงการยืนยันว่ากฎ "ใช้สองครั้งใกล้เคียงใหญ่เป็นสองเท่า" จะเพียงพอแล้วฉันจึงเลือกคำตอบของ Blue ว่าดีที่สุด
Berry

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

แก้ไข:ฉันทำผิดพลาดในความคิดเห็นก่อนหน้าของฉัน "ใกล้เคียงสองเท่าใหญ่เป็นสองเท่า" ถูกต้องเมื่อรายการยังคงอยู่ใกล้กันพอสมควรเกี่ยวกับระยะห่างจากกล้อง
Jim Buck

นี่คือตัวอย่างด่วนที่ฉันรวบรวมใช้เมาส์เพื่อย้ายและล้อเลื่อนเพื่อเปลี่ยนความลึก
Jim Buck

0

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

Area = X * Y

หลังจากซูมเข้า:

NewArea = (x*2) * (y*2)

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

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

XTileSize = (255 / CameraZ) * DefaultTileWidth
YTileSize = (255 / CameraZ) * DefaultTileHeight

โปรดทราบว่าCameraZจะต้องมีอย่างเข้มงวดระหว่าง 1-255 และข้อ จำกัด นั้นอาจเป็นประโยชน์หรือเป็นอันตรายต่อคุณในอนาคต

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