Skip to content
Home » บทความ » เวกเตอร์ในสามมิติกับเกมคอมพิวเตอร์

เวกเตอร์ในสามมิติกับเกมคอมพิวเตอร์

เวกเตอร์ในสามมิติกับเกมคอมพิวเตอร์: เบื้องหลังความสมจริง

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

ทำความเข้าใจพื้นฐานของเวกเตอร์ในสามมิติ

ก่อนอื่นเรามาทบทวนความหมายของเวกเตอร์กันก่อนนะครับ เวกเตอร์คือปริมาณที่มีทั้งขนาด (Magnitude) และทิศทาง (Direction) ครับ ในโลกสามมิติที่เราสนใจนี้ เวกเตอร์จะถูกแสดงด้วยส่วนของเส้นตรงที่มีหัวลูกศรชี้บอกทิศทาง โดยเริ่มต้นจากจุดหนึ่งไปยังอีกจุดหนึ่งครับ เรามักจะเห็นเวกเตอร์อยู่ในรูปของพิกัด (xyz)begin{pmatrix} x \ y \ z end{pmatrix} หรือ xi+yj+zkxmathbf{i} + ymathbf{j} + zmathbf{k} โดยที่ x,y,zx, y, z คือองค์ประกอบของเวกเตอร์ตามแกน X,Y,ZX, Y, Z ตามลำดับครับ

ส่วนขนาดของเวกเตอร์ (หรือความยาวของเวกเตอร์) ∣v∣|mathbf{v}| หาได้จากสูตรพีทาโกรัสในสามมิติครับ คือ ∣v∣=x2+y2+z2|mathbf{v}| = sqrt{x^2 + y^2 + z^2} ครับ การเข้าใจพื้นฐานเหล่านี้เป็นสิ่งสำคัญมาก เพราะเป็นรากฐานของการคำนวณทุกอย่างในเกมสามมิติเลยครับ

การดำเนินการพื้นฐานของเวกเตอร์ที่ใช้ในเกม

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

1. การบวกและการลบเวกเตอร์ (Vector Addition and Subtraction)

ลองนึกถึงตัวละครในเกมที่กำลังเดินอยู่บนพื้น และมีลมพัดมาพร้อมกันครับ การเคลื่อนที่ของตัวละครที่เห็นจริงๆ นั้นเป็นผลรวมของการเดินของตัวละครเองกับแรงลมที่มากระทำนั่นเองครับ นี่คือตัวอย่างของการบวกเวกเตอร์ครับ ถ้าตัวละครมีเวกเตอร์การเคลื่อนที่ vplayermathbf{v}_{player} และแรงลมมีเวกเตอร์ vwindmathbf{v}_{wind} เวกเตอร์การเคลื่อนที่สุทธิก็คือ vtotal=vplayer+vwindmathbf{v}_{total} = mathbf{v}_{player} + mathbf{v}_{wind} ครับ ส่วนการลบเวกเตอร์ก็ใช้ในการหาทิศทางจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง เช่น ทิศทางที่กระสุนต้องพุ่งไปหาเป้าหมายครับ

2. การคูณเวกเตอร์ด้วยสเกลาร์ (Scalar Multiplication)

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

3. ผลคูณเชิงสเกลาร์ หรือ ดอตโปรดักต์ (Dot Product)

ผลคูณเชิงสเกลาร์ของเวกเตอร์สองเวกเตอร์จะให้ผลลัพธ์เป็นค่าสเกลาร์ (ตัวเลข) ครับ สิ่งสำคัญที่ได้จากการคำนวณนี้คือการหา “มุม” ระหว่างเวกเตอร์ทั้งสอง หรือบอกว่าเวกเตอร์ทั้งสองนั้นชี้ไปในทิศทางเดียวกันมากน้อยแค่ไหน สูตรคือ a⋅b=∣a∣∣b∣cos⁡θmathbf{a} cdot mathbf{b} = |mathbf{a}| |mathbf{b}| cos theta หรือ axbx+ayby+azbza_x b_x + a_y b_y + a_z b_z ครับ

ในเกม เราใช้ดอตโปรดักต์ในการ:

  • การตรวจสอบการมองเห็น (Visibility): เช่น ตรวจสอบว่าศัตรูกำลังหันหน้าไปทางผู้เล่นหรือไม่ ถ้าดอตโปรดักต์เป็นบวกมาก แสดงว่าหันไปทางเดียวกัน
  • การคำนวณแสงเงา (Lighting and Shading): ใช้ในการคำนวณว่าพื้นผิวของวัตถุได้รับแสงมากน้อยแค่ไหน โดยดูจากมุมระหว่างเวกเตอร์ทิศทางแสงกับเวกเตอร์ตั้งฉากกับพื้นผิว (Normal Vector) ครับ

4. ผลคูณเชิงเวกเตอร์ หรือ ครอสโปรดักต์ (Cross Product)

ผลคูณเชิงเวกเตอร์ของเวกเตอร์สองเวกเตอร์จะให้ผลลัพธ์เป็นเวกเตอร์อีกเวกเตอร์หนึ่ง ซึ่งเวกเตอร์ใหม่นี้จะตั้งฉากกับเวกเตอร์ทั้งสองที่เรานำมาคูณกันครับ สูตรคือ a×b=(aybz−azby)i+(azbx−axbz)j+(axby−aybx)kmathbf{a} times mathbf{b} = (a_y b_z – a_z b_y)mathbf{i} + (a_z b_x – a_x b_z)mathbf{j} + (a_x b_y – a_y b_x)mathbf{k} ครับ

ประโยชน์ของครอสโปรดักต์ในเกมมีมากมาย เช่น:

  • การหาสมการพื้นผิว (Surface Normals): ใช้ในการหาเวกเตอร์ที่ตั้งฉากกับพื้นผิว ซึ่งสำคัญมากในการคำนวณแสงเงา และการชนกันของวัตถุ
  • การคำนวณแรงบิด (Torque) หรือการหมุน (Rotation): ในฟิสิกส์ของเกม เราสามารถใช้ครอสโปรดักต์เพื่อคำนวณแรงที่ทำให้วัตถุหมุนได้ครับ

5. เวกเตอร์หนึ่งหน่วย หรือ ยูนิตเวกเตอร์ (Unit Vector / Normalization)

ยูนิตเวกเตอร์คือเวกเตอร์ที่มีขนาดเท่ากับ 1 แต่ยังคงทิศทางเดิมไว้ครับ เราสร้างยูนิตเวกเตอร์ได้โดยการนำเวกเตอร์นั้นหารด้วยขนาดของมันเอง คือ v^=v∣v∣hat{mathbf{v}} = frac{mathbf{v}}{|mathbf{v}|} ครับ

ในเกม เราใช้ยูนิตเวกเตอร์เมื่อเราสนใจแค่ “ทิศทาง” เท่านั้น ไม่ได้สนใจขนาดครับ เช่น:

  • ทิศทางการเคลื่อนที่: เมื่อเราต้องการให้ตัวละครเดินไปในทิศทางใดทิศทางหนึ่งด้วยความเร็วคงที่ เราจะใช้ยูนิตเวกเตอร์บอกทิศทาง แล้วคูณด้วยค่าความเร็ว (สเกลาร์) ที่ต้องการครับ
  • เวกเตอร์ตั้งฉากกับพื้นผิว (Normal Vectors): มักจะเป็นยูนิตเวกเตอร์ เพื่อให้การคำนวณแสงเงาเป็นมาตรฐานและไม่ขึ้นกับขนาดของพื้นผิวครับ

การประยุกต์ใช้เวกเตอร์ในการพัฒนาเกม

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

  • การเคลื่อนที่และฟิสิกส์ (Movement and Physics):

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

  • การควบคุมกล้อง (Camera Control):

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

  • กราฟิกและแสงเงา (Graphics and Lighting):

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

  • ปัญญาประดิษฐ์ (Artificial Intelligence – AI):

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

ข้อผิดพลาดที่พบบ่อยในการใช้เวกเตอร์และคำแนะนำจากพี่กฤษณ์

น้องๆ ครับ ถึงแม้เวกเตอร์จะดูเป็นเรื่องพื้นฐาน แต่ก็มีข้อผิดพลาดบางอย่างที่นักเรียนมักจะพลาดกันบ่อยๆ นะครับ

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

น้องๆ ที่สนใจด้านการพัฒนาเกม หรือวิศวกรรมต่างๆ การทำความเข้าใจเวกเตอร์อย่างลึกซึ้งเป็นสิ่งสำคัญอย่างยิ่งครับ มันไม่ได้เป็นเพียงทฤษฎีในหนังสือเรียน แต่เป็นเครื่องมืออันทรงพลังที่ใช้สร้างสรรค์สิ่งต่างๆ ในโลกดิจิทัลและโลกจริงครับ การฝึกวาดภาพเวกเตอร์ในสามมิติ ลองคำนวณด้วยตัวเอง และพยายามเชื่อมโยงกับสถานการณ์จริงจะช่วยให้น้องๆ เข้าใจได้ดียิ่งขึ้นครับ

สรุปแนวคิดสำคัญ

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

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

Join the conversation

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