รูปปกกระดานดำชอล์กสีเรื่องสเกลาร์และเวกเตอร์

1. 🎯 ตอนที่ 4: สเกลาร์ (Scalar): เวทมนตร์แห่งการย่อขยาย

2. 📖 เปิดฉาก (The Hook)

สวัสดีครับนักสร้างโลกจินตนาการทุกคน! กลับมาลุยกันต่อในซีรีส์ ปูพื้นฐานคณิตศาสตร์สู่โลกคอมพิวเตอร์กราฟิก ครับ

หลังจากที่เราได้เรียนรู้วิธีการใช้ Vector เพื่อกำหนดทิศทาง และการนำ Vector มาบวก/ลบกันเพื่อสร้างเส้นทางการเคลื่อนที่ไปแล้วในตอนก่อนๆ วันนี้พี่มีคำถามสนุกๆ มาถามครับ: “ถ้าเรามีตัวละครที่กำลังวิ่งไปข้างหน้าตามทิศทาง Vector แล้วเราอยากให้เขาวิ่งเร็วขึ้นเป็น 2 เท่า หรืออยากกดปุ่มใช้สกิล Dash พุ่งตัวแบบสายฟ้าแลบ เราจะเขียนคำสั่งบอกคอมพิวเตอร์อย่างไร?” หรือ “ถ้าเราอยากเสกให้มอนสเตอร์ตัวเล็กจิ๋วกลายเป็นบอสขนาดยักษ์ เราจะต้องร่ายมนตร์บทไหน?”

คำตอบของคำถามเหล่านี้ไม่ได้ซับซ้อนเลยครับ เวทมนตร์ที่เรากำลังจะใช้มีชื่อว่า “สเกลาร์ (Scalar)” ซึ่งมันก็คือ “ตัวเลขธรรมดาๆ” ที่เราเกลียด (เอ๊ย! ที่เรารัก) ตอนเรียนเลขนี่แหละครับ แต่เมื่อตัวเลขธรรมดานี้มาเจอกับ Vector ในโลกของเกม มันจะกลายเป็นคาถาย่อขยายสุดทรงพลังที่ทำให้โลก 3 มิติของเรายืด หด หรือพลิกกลับด้านได้อย่างน่ามหัศจรรย์!

3. 🧮 จากตัวเลขสู่กราฟิก (Math to Graphics Foundation)

ในทางคณิตศาสตร์ เราจะแบ่งแยกความแตกต่างระหว่างปริมาณแบบ Vector และปริมาณแบบ Scalar อย่างชัดเจน สเกลาร์ (Scalar) เป็นคำศัพท์ทางเทคนิคที่ใช้เรียกตัวเลขธรรมดาๆ (Ordinary number) ที่มีเพียง “ขนาด (Magnitude)” แต่ไม่มี “ทิศทาง (Direction)” เข้ามาเกี่ยวข้อง ตัวอย่างเช่น คำว่า “ระยะทาง (Distance)” หรือ “อัตราเร็ว (Speed)” ถือเป็นปริมาณ Scalar

เมื่อเรานำ Scalar มาคูณกับ Vector เราจะเรียกกระบวนการนี้ว่า Scalar-Vector Multiplication กฎของการคูณเวกเตอร์ด้วยสเกลาร์นั้นง่ายมากครับ เราเพียงแค่นำตัวเลข Scalar นั้น (สมมติให้เป็นตัวแปร $k$) เข้าไปคูณกับทุกๆ แกน (Component) ของเวกเตอร์ $\mathbf{v}$ ตรงๆ ได้เลย

สมมติว่าเรามีเวกเตอร์ 3 มิติ $\mathbf{v} = [x, y, z]$ หากเรานำสเกลาร์ $k$ มาคูณ สมการในรูปแบบ LaTeX จะหน้าตาเป็นแบบนี้ครับ: $$ k\mathbf{v} = k \begin{bmatrix} x \ y \ z \end{bmatrix} = \begin{bmatrix} kx \ ky \ kz \end{bmatrix} $$ ซึ่งเราสามารถเขียนสลับที่กันได้ ($k\mathbf{v}$ หรือ $\mathbf{v}k$) แต่ในเชิงการเขียนโปรแกรม เรานิยมวาง Scalar ไว้ด้านหน้าเสมอครับ

รูปประกอบการคูณเวกเตอร์ด้วยสเกลาร์แบบต่างๆ

4. 📐 เจาะลึกเรขาคณิตและการประมวลผลภาพ (Geometry & Image Processing)

ในมุมมองของเรขาคณิต การนำ Scalar มาคูณกับ Vector มีผลลัพธ์คือการ “ยืดหรือหด (Scaling)” ความยาวของลูกศรเวกเตอร์ โดยที่เส้นทิศทางยังคงเป็นเส้นทแยงมุมในแนวเดิม

ลองจินตนาการว่า $\mathbf{v}$ คือลูกศรเวทมนตร์บนกระดาน:

  • ถ้า $|k| > 1$: ลูกศรจะถูก “ยืด (Stretch)” ให้ยาวขึ้น เช่น $2\mathbf{v}$ คือลูกศรที่พุ่งไปทิศเดิมแต่ยาวขึ้นเป็น 2 เท่า
  • ถ้า $0 < |k| < 1$: ลูกศรจะถูก “หด (Compress หรือ Shrink)” ให้สั้นลง เช่น $0.5\mathbf{v}$ คือลูกศรทิศเดิมแต่ความยาวลดลงครึ่งหนึ่ง
  • ถ้า $k < 0$ (ติดลบ): นี่คือทีเด็ดครับ! การคูณด้วยเลขติดลบไม่เพียงแต่ยืดหดขนาดเท่านั้น แต่มันจะ “พลิก (Flip) ทิศทาง” ของลูกศรให้ชี้กลับไปในทิศตรงกันข้าม 180 องศาเลยทีเดียว! การสร้างเวกเตอร์ที่ติดลบ (Vector Negation) ก็คือกรณีพิเศษที่เราคูณเวกเตอร์ด้วยสเกลาร์ $-1$ นั่นเอง

5. 🎮 เวทมนตร์นี้ในโลกความจริง (Real-World Game Applications)

แล้วการคูณด้วย Scalar เอาไปใช้อะไรใน Game Engine? คำตอบคือ “แทบจะทุกอย่างที่เกี่ยวกับการควบคุมขนาดและเวลา” เลยครับ!

  1. การควบคุมความเร็ว (Speed & Velocity): ในระบบฟิสิกส์ของเกม ความเร็ว (Velocity) คือ Vector ส่วนอัตราเร็ว (Speed) คือ Scalar หากคุณมีเวกเตอร์ทิศทางชี้ไปข้างหน้า (Direction Vector) แล้วคุณอยากให้ตัวละครวิ่งเร็ว 5 เมตรต่อวินาที คุณก็แค่เอา Scalar ค่า 5 ไปคูณทิศทางนั้น
  2. การคำนวณเฟรมเรต (Time.deltaTime): สูตรที่ Programmer คุ้นเคยอย่าง Position += Velocity * Time.deltaTime แท้จริงแล้ว Time.deltaTime ก็คือสเกลาร์ (Scalar) ที่ทำหน้าที่ย่อสเกลความยาวของเวกเตอร์ความเร็ว ให้สั้นลงเหลือแค่ระยะกระจัดที่แท้จริงที่เกิดขึ้นใน 1 เฟรมนั่นเองครับ
  3. การย่อขยายโมเดล (Uniform Scaling): เมื่อเราต้องการเสกให้โมเดลใหญ่ขึ้นอย่างสมส่วน เราใช้ Scalar คูณเข้าไปที่พิกัด (Vertices) ของวัตถุ ทำให้วัตถุนั้นขยายตัวออกจากจุดศูนย์กลาง (Origin) เป๊ะๆ

6. 🏭 เปิดโรงงานผลิตภาพ (The Graphics Pipeline)

เมื่อเราเจาะลงไปใน Graphics Pipeline โดยเฉพาะในขั้นตอน Vertex Shader และ Pixel Shader การทำงานกับ Scalar คือเรื่องระดับพื้นฐานที่สุดที่ GPU ประมวลผลอยู่ตลอดเวลาแบบขนาน (Parallel)

ตัวอย่างที่เห็นได้ชัดเจนคือ “การไล่เฉดสี (Color/Light Attenuation)” แสงเงาต่างๆ ที่ตกกระทบบนพื้นผิวโมเดลนั้น มักจะถูกคำนวณออกมาเป็นตัวเลข Scalar เช่น ค่าความสว่างจาก $0.0$ ถึง $1.0$ (ซึ่งคำนวณมาจาก Dot Product ที่เราจะพูดถึงในตอนหน้า) เมื่อ GPU ได้ค่าความสว่างเป็น Scalar มาแล้ว มันจะนำตัวเลขนี้ไปคูณกับ Vector ของสี (RGB Vector) ผลลัพธ์ที่ได้คือพิกเซลสีแดง เขียว น้ำเงิน จะถูก “ลดสเกล (Scale down)” ลงพร้อมๆ กัน ทำให้เกิดเป็นบริเวณเงามืดบนโมเดล 3D ได้อย่างสมจริงครับ! หรือในส่วนของระบบอนิเมชันกระดูก (Skeletal Animation) ตัวเลขค่าน้ำหนัก (Bone Weights) ก็คือ Scalar ที่ทำหน้าที่เฉลี่ยการเคลื่อนที่ของ Vertex ให้ดูนุ่มนวลเป็นธรรมชาติอีกด้วยครับ

7. 🏁 บทสรุป (Level Cleared!)

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

ในตอนหน้า เราจะมาดูการคูณ Vector ที่ซับซ้อนขึ้นไปอีกระดับ นั่นคือการเอา Vector มาคูณกับ Vector ด้วยกันเอง! สิ่งนั้นเรียกว่า Dot Product และ Cross Product ซึ่งถือเป็น “ไม้ตายก้นหีบ” ของกราฟิกโปรแกรมเมอร์เลยก็ว่าได้ เตรียมตัวให้พร้อม แล้วพบกันในตอนหน้า Level Cleared!


สนใจพูดคุยแลกเปลี่ยนเทคนิคการพัฒนาเกม คอมพิวเตอร์กราฟิก หรือออกแบบระบบซอฟต์แวร์? ทีมงาน WP Solution พร้อมให้บริการออกแบบและพัฒนาซอฟต์แวร์แบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p