นอกเหนือจากโครงการเกม "สามเณร"


22

ฉันได้อ่านคำตอบนี้เกี่ยวกับประเภทของคณิตศาสตร์ที่ผู้พัฒนาเกมควรรู้และส่วนนี้โดดเด่นสำหรับฉัน:

How do I move my game object? The novice might say:

"I know! I'll just do:" object.position.x++.

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

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

คำถามติดตาม:หากฉันต้องการทำความคุ้นเคยกับคณิตศาสตร์ประเภทนั้นฉันควรทำโครงการประเภทใด IE: เขียนเอ็นจิ้นเกมทำงานบนเกม 3D เป็นต้น


1
khanacademy.orgยอดเยี่ยมสำหรับการเรียนรู้คณิตศาสตร์สำหรับผู้เริ่มต้นและสูง บวกกับความสำเร็จ! ไม่มีอะไรที่เหมือนกับทฤษฎีเกมที่ทำให้สถาบันการศึกษาน่าเบื่อ
ชะลอตัวลงขณะที่

คำตอบ:


16

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

เมื่อคุณอ่าน[change in position] = [velocity] * [time passed]แล้วจะเห็นได้ชัดว่าจะต้องติดตามตัวแปรเหล่านั้น:

float x, y; // Your X and Y co-ordinates.
float vx, vy; // Your X and Y velocity.
float deltaTime; // Change in time.

หลังจากนั้นคุณจะใช้ความเร็วกับตำแหน่งแต่ละเฟรม:

// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

ตอนนี้เราต้องการเปลี่ยนความเร็วในแต่ละเฟรมเพื่อเพิ่มแรงโน้มถ่วง [change in velocity] = [acceleration] * [time passed]อ้างอิงถึงแหล่งที่มาเดียวกันแน่นอน ดังนั้นเราจึงสามารถใช้หลักการเดียวกันนี้ได้:

const float gravity = 9.8f; // The gravity of the earth.

// Add gravity to the vertical velocity.
vy = vy + gravity * deltaTime;
// Change X by the velocity multiplied by the time.
x = x + vx * deltaTime;
y = y + vy * deltaTime;

ตอนนี้คุณต้องการวิธีสำหรับผู้เล่นในการควบคุมยานอวกาศของเขา จากการอ่านเพิ่มเติมเกี่ยวกับฟิสิกส์พื้นฐานคุณจะได้เรียนรู้ว่าการเคลื่อนไหวเป็นผลมาจากแรง - ฉันไม่สามารถหาแหล่งที่มาได้[change in acceleration] = ([force] / [mass]) * time(เท่าที่ฉันจำได้) ดังนั้นเมื่อผู้เล่นกดปุ่มคุณจะตั้งค่าfxและfyตัวแปรให้กับบางสิ่งและใช้สมการในระหว่างการอัปเดตของคุณ

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

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

เกมใดจะสอนวิธีคิดในความคิดที่ถูกต้อง?

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

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

โบนัสสุดท้าย:สิ่งหนึ่งที่อาจารย์สอนศิลปะของฉันบอกฉันเสมอคือ "อย่าวาดสิ่งที่คุณคิดว่าคุณเห็นวาดสิ่งที่คุณเห็น" สิ่งเดียวกันใช้ที่นี่ "อย่าทำแบบจำลองสิ่งที่คุณคิดว่าเกิดขึ้น ( object.position++), แบบจำลองสิ่งที่เกิดขึ้น (` object.position + = ความเร็ว * เวลา) "- อย่างน้อยก็ถึงข้อ จำกัด ที่สมเหตุสมผล (คุณไม่ได้สร้างแบบจำลองระบบที่แม่นยำอย่างสมบูรณ์แบบ สิ่งที่เป็นการเลียนแบบที่ดี)


ฉันชอบความคิดของคุณในการแทรกความล่าช้าเทียมสำหรับการทดสอบ นอกจากนี้แรงโน้มถ่วงของโลกคือ 9.8 ไม่ใช่ 9.1
Steve

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

@chaosTechnician ในระดับนี้ "สิ่งที่คุณคิดว่าจะเกิดขึ้น" object.position++คือ ฉันจะชี้แจงคำตอบ
Jonathan Dickinson

instead of trying to make them move in the way you would think, rather look up the equation-1 มันเกี่ยวกับการทำความเข้าใจสมการไม่ใช่มองมัน สิ่งที่สำคัญที่สุดคือทำให้เกมสนุกและใครจะรู้บางทีคุณอาจพบว่าการเร่งความเร็วตัวแปรทำให้แรงโน้มถ่วงสนุกขึ้น แต่มันจะยากมากที่จะให้เหตุผลว่าถ้าคุณไม่เข้าใจสมการ
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft นั่นคือสิ่งที่ฉันอธิบายให้เขาฟัง: การไม่รู้สมการตั้งแต่แรกหมายความว่าคุณไม่สามารถเข้าใจได้ - และวิธีเดียวที่จะเข้าใจพวกเขาคือการใช้พวกเขาในสถานการณ์จริง
Jonathan Dickinson

3

ฉันคิดว่าบางส่วนของคำตอบที่คุณเชื่อมโยงกับเป็นคนชั้นนำเล็กน้อยในการนำเสนอของพวกเขา ช็อปคุณค่าของคณิตศาสตร์เวกเตอร์แล้วบอกว่าวัตถุที่ต้องการตำแหน่งทิศทางและเร่งไม่ลงรอยกันเฉพาะเพราะมันจริงๆเพียงแค่ไปต้มลงไปสิ่งที่ต้องการobject.position.x += (object.velocity.x + object.acceleration.x) * deltaTime-which object.position.x++พื้นฐานไม่ว่าแตกต่างจาก การควอเทอร์เนียนเป็นหนึ่งในหลายวิธีในการแสดงการหมุน ฉันชอบพวกเขา แต่พวกเขาไม่จำเป็นต้องเข้าใจการหมุน 3D แม้จะมีผู้ใช้ Quaternion หลายคนที่บอกเป็นนัย แต่พวกเขาไม่ใช่ Holy Grail ของคณิตศาสตร์หมุน

หลักการของพีชคณิตเชิงเส้นนั้นมีอยู่ในการเคลื่อนที่แบบ 2D อย่างง่ายการหมุนและอื่น ๆ แต่คณิตศาสตร์นั้นง่ายกว่าเพราะมีเพียงสองมิติ นี่คือตัวอย่าง

มีวิธีมากมายในการเรียนรู้ / พัฒนาความรู้เกี่ยวกับพีชคณิตเชิงเส้น:

  1. ฉันถือว่าการเรียนวิชาพีชคณิตเชิงเส้น แต่หลักสูตรของฉันค่อนข้างหนักอยู่แล้วดังนั้นฉันจึงไม่สามารถพิสูจน์การทำงานพิเศษได้
  2. ความเข้าใจเกี่ยวกับพีชคณิตเชิงเส้นของฉันเพิ่มขึ้นอย่างมีนัยสำคัญยิ่งขึ้นเมื่อฉันได้เรียนรู้การเขียนโปรแกรมชุดเครื่องมือเกม สำหรับฉันแล้วการใช้ Vectors, Matrices และอื่น ๆ นั้นเป็นเรื่องที่แพร่หลายมากขึ้นทางด้านเครื่องยนต์ของสิ่งต่าง ๆ มากกว่าในด้านเกม แน่นอนว่าไม่ได้บอกว่าฉันไม่ได้ใช้เมทริกซ์ในรหัสเกม - ฉันไม่ได้ใช้บ่อยเท่าที่ฉันมีในการเขียนโปรแกรม YMMV
  3. นอกจากนี้ยังมีหนังสือมากมายที่สามารถช่วยให้คุณเข้าใจคณิตศาสตร์ที่คุณต้องรู้เช่นกัน ฉันชอบหนังสือเล่มนี้ที่มีบทที่ชื่อว่า "3D Math for Games"

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


0

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

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

การเรียนรู้คณิตศาสตร์ 3 มิติมักเริ่มต้นด้วยการวางวัตถุง่าย ๆ (เช่นลูกบาศก์) ในพื้นที่ 3 มิติและการใช้กล้องที่สามารถเคลื่อนย้ายซึ่งสามารถดูวัตถุนั้นจากมุมมองที่แตกต่างกันและมุมมองนั้นสามารถเริ่มตั้งฉากเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้น มันเกี่ยวกับการฉายจุดบนระนาบ 3 มิติที่เป็นตัวแทนของหน้าจอของคุณ (สูตรที่นี่คุณจะขยายจุดนี้เป็นแกน x และ z นอกเหนือจาก y) นั่นคือจุดเริ่มต้นของการเขียนเอนจิ้น 3 มิติใด ๆ โดยไม่คำนึงถึงระดับประสบการณ์ของคุณ Flash และ Processing.js เป็นสองวิธีที่ยอดเยี่ยมในการสร้างต้นแบบเช่นนี้ได้อย่างง่ายดาย


0

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

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

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


0

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

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

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