เวกเตอร์ในการพัฒนาเกม


19

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

ฉันได้พบตัวอย่าง แต่ส่วนใหญ่พวกเขาอยู่ในคอนโซลที่พวกเขาส่งออกหมายเลขและตัวอย่างใหญ่ที่ฉันไม่เข้าใจ


TL พื้นฐาน; เวกเตอร์ DR เป็นส่วนหนึ่งของหัวข้อพีชคณิตเชิงเส้นและนำไปสู่การเป็นผู้ใหญ่ ด้วย Matricies และ Linear Algebra คุณสามารถเขียนอะไรก็ได้จากเครื่องมือแก้ปัญหาเรือกวาดทุ่นระเบิดไปจนถึงมุมมองโลก 3 มิติเพื่อดูว่าวัตถุใดอยู่ภายใต้เคอร์เซอร์ของคุณ Linear Algebra เป็นสาขาคณิตศาสตร์ที่มีประโยชน์และจำเป็นที่สุดสำหรับนักพัฒนาเกม เรียนรู้ทันที คุณจะไม่เสียใจ.
Robert Massaioli

ขอบคุณทุกคำตอบที่ยอดเยี่ยม! แต่ทำไมบางอย่างไม่ใช้ Vector ในบทช่วยสอนนี้: zetcode.com/tutorials/javagamestutorialหรือผู้พัฒนารายหนึ่งใช้อย่างอื่นไม่ได้?
vqwer

ยากที่จะพูดผู้เขียนอาจต้องการให้มันง่ายและเป็นพื้นฐานสำหรับผู้เริ่มต้น
Maik Semder

อันที่จริงผู้เขียนใช้พวกเขาดูที่แถวลำดับclass Star ที่นี่
Maik Semder

นอกจากนี้ที่นี่เป็นที่Point2Dที่ใช้ในการclass ResizeRectangle
Maik Semder

คำตอบ:


31

เวกเตอร์คืออะไร?

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

  • 1-D เวกเตอร์จะเป็น{1} ตัวอย่างเช่นนี่อาจเป็นตำแหน่งที่ X = 1 หรือเวลา t = 1
  • 2-D เวกเตอร์จะเป็น{-4,3} ยกตัวอย่างเช่นนี่อาจเป็นตำแหน่งที่ -4 บนแกน X และ 3 บนแกน Y อาจเป็นอุณหภูมิ (3 องศา) ที่ตำแหน่ง (-4 เมตร) บนแกน X
  • 3-D เวกเตอร์จะเป็น{1,2,3} นี่อาจเป็นตำแหน่งในพื้นที่ 1 ตามแนวแกน X, 2 หลังบนแกน Y และ 3 ขึ้นบนแกน Z หรืออาจเป็น 1 สีแดง 2 สีเขียวและสีน้ำเงิน 3 สี หรืออาจเป็นตำแหน่ง XY ( {1,2} ) ในบางครั้ง T ( {3} )

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

เหตุใดฉันจึงใช้เวกเตอร์

ก่อนอื่นคุณไม่ต้องใช้เวกเตอร์ ตราบใดที่คุณติดตาม x และ y หรือพิกัดใด ๆ ที่คุณสนใจในบางวิธีคุณก็สบายดี

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

สำหรับตัวอย่างง่ายๆเหล่านี้พิจารณาสินค้า dot

สมมติว่าคุณมีระบบเรดาร์ในเกมสไตล์จากบนลงล่าง ศัตรูทุกตัวที่ปรากฏในส่วนของเรดาร์ (ลิ่มรูปวงกลมใน 2D) ควรได้รับจุดสีแดงเล็ก ๆ น้อย ๆ ในหน้าจอของคุณ ดังนั้นคุณต้องคิดออกว่าศัตรูอยู่ในส่วนเรดาร์ของคุณ

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

หรือคุณอาจใช้ผลิตภัณฑ์ดอทเพื่อทำการตรวจสอบ นี่คือวิธี:

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

สิ่งนี้มีประโยชน์มากและตอนนี้ยังช่วยให้คุณมีเรดาร์ที่ชี้ไปในทิศทางที่ต่างกัน (เพียงแค่เปลี่ยนเวกเตอร์ไปข้างหน้า) และมีความกว้างที่ต่างกัน (เพียงแค่เปลี่ยนมุมความกว้างเรดาร์) - และคุณสามารถใช้รหัสเดียวกัน !

ทำไมฉันถึงใช้เวกเตอร์อีก?

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

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

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

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

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


14

ตัวอย่าง 2D คือพิกัดหน้าจอมันระบุพิกเซลบนหน้าจอและมี x- และองค์ประกอบ y [x, y] เช่นตำแหน่งหน้าจอด้านซ้ายด้านซ้าย [0, 0]

อีกตัวอย่าง: ลองนึกภาพการเลื่อนข้อความจากขอบหน้าจอด้านขวาไปยังขอบหน้าจอด้านซ้าย ตอนนี้คุณต้องกำหนดความเร็วของข้อความเลื่อนเป็นพิกเซลต่อวินาทีเช่น [-20, 0] ซึ่งหมายความว่าข้อความเลื่อน 20 พิกเซลไปทางซ้ายต่อวินาทีและไม่เคยเปลี่ยนความสูง

อีกตัวอย่างที่สูงกว่า: ลองนึกภาพเกม 2 มิติที่ควรรันบนความละเอียดหน้าจอที่แตกต่างกัน 800x600, 1024x768 เป็นต้นซึ่งสามารถทำได้โดยใช้ความกว้างของหน้าจอตั้งแต่ 0.0 ถึง 1.0 และความสูงจาก 0.0 ถึง 1.0 เพื่อแยกตรรกะของเกม จากความละเอียดหน้าจอจริง ตอนนี้เมื่อคุณวาดไปที่หน้าจอคุณเพียงแค่คูณเวกเตอร์ภายในด้วยเวกเตอร์ความละเอียด:

screen_pos = internal_pos * screen_ressolution

โปรดทราบว่าตัวแปร 3 ตัวทั้งหมดเป็นเวกเตอร์ 2 มิติตรงนี้พวกเขามี x- และองค์ประกอบ y เช่นสำหรับ internal_pos นี้ [0.5, 0.25]:

[400, 150] = [0.5, 0.25] * [800, 600]

ดังนั้นตำแหน่งภายใน [0.5, 0.25] จึงถูกเปลี่ยนเป็นตำแหน่งหน้าจอจริง [400, 150]

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


เวกเตอร์ไม่ใช่อาร์เรย์มิติเดียวเช่นรายการบางประเภทใช่หรือไม่ เมื่อเราพูดถึงความละเอียดหน้าจอเราไม่ได้พูดถึงอาร์เรย์หลายมิติ (พิกัดเดียวสำหรับแต่ละแกน X และ Y) เพื่อให้แน่ใจว่า 'เวกเตอร์' ไม่ได้ปะปนกับเมทริกซ์ตรงนี้ =)
Marcouiller จะ

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

2
โปรดทราบว่าเวกเตอร์มักได้รับการปฏิบัติแตกต่างกันมากในวิชาคณิตศาสตร์และในการเขียนโปรแกรม ศาสตร์การพูดเวกเตอร์ไม่ใช่อาร์เรย์หลายมิติแม้ว่าองค์ประกอบของมันจะเกี่ยวกับพื้นฐานบางอย่างร่วมกันกำหนดอาร์เรย์ดังกล่าว เวกเตอร์นั้นเป็นค่าคงที่ การดำเนินการscreen_pos = internal_pos * screen_resolutionจะไม่ได้ประสานงานคงที่วิธีการที่คุณได้เขียนมันก็อาจจะเหมาะสมมากขึ้นจะมีการเขียนscreen_pos = map_to_screen * internal_posที่map_to_screenเป็นการทำแผนที่เชิงเส้น (ซึ่งสามารถเขียนเป็นเมทริกซ์ในกรณีนี้มีเส้นทแยงมุมหนึ่ง)
leftaroundabout

6

นี่คือคำอธิบายที่ดีของเวกเตอร์ในการพัฒนาเกมในบล็อก Wolfire Games:

http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/


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

1

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

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


Speed ​​เป็นสเกลาร์, ความยาวของเวกเตอร์ความเร็ว
Maik Semder

ถูกต้อง - แก้ไขแล้ว
Eran Galperin

1
และตำแหน่งปกติถือว่าเป็นเวกเตอร์ระยะทางนั่นคือสเกลาร์
Ali1S232

ตำแหน่งสามารถพิจารณาได้ทั้งสเกลาร์ (หรือคอลเลกชันของสเกลาร์) หรือเวกเตอร์ที่ชี้จากจุดเริ่มต้นของแกน
Eran Galperin

1

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

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


ตำแหน่งไม่ใช่เวกเตอร์
Eran Galperin

ไม่ว่าจะเป็นความเร็วมันเป็นเซนต์
คิ

2
@Eran Galperin ฉันรู้ว่าเป็นมุมมองที่ค่อนข้างแพร่หลายในหมู่นักคณิตศาสตร์ ความแตกต่างระหว่างจุดและเวกเตอร์ตำแหน่งที่สอดคล้องกันนั้นเป็นเรื่องเชิงวิชาการ ไม่มีเหตุผลเชิงปฏิบัติที่จะทำให้เอะอะเกี่ยวกับความแตกต่าง
aaaaaaaaaaaa

1
มีเหตุผลในทางปฏิบัติเมื่อคุณทำงานกับพิกัดที่เป็นเนื้อเดียวกันและเมทริกซ์ 4D คุณต้องสร้างความแตกต่าง แม้ว่ามันจะไม่เกี่ยวข้องกับขอบเขตของคำถามนี้
Maik Semder

@eBusiness ไม่ใช่ "มุมมอง" มันเป็นความจริง และฉันเป็นนักฟิสิกส์จากการศึกษาไม่ใช่นักคณิตศาสตร์
Eran Galperin

0

ง่าย ๆ ทุกอย่างที่มีตำแหน่งหรือทิศทางซึ่งมีอยู่ทุกหนทุกแห่งในเกมที่พวกเขาใช้เวกเตอร์ เวกเตอร์เป็นเหมือนจุด

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

อย่างไรก็ตามความแตกต่างมาลงที่นี้ จุดเป็นเพียงจุดในขณะที่เวกเตอร์เป็นลูกศร

ถ้าคุณมี

Point2.x = 5;

Point2.y = 10;

คุณบอกว่าฉันหมายถึงที่ตั้งนี้ x 5 และ y 10

อย่างไรก็ตามเมื่อคุณประกาศเวกเตอร์ ...

Vector2.x = 5;

Vector2.y = 10; 

คุณกำลังบอกว่าคุณกำลังประกาศศรจาก 0,0 ถึง x 5, y 10;

คุณสามารถมีจุดที่เวกเตอร์ของคุณชี้จากจุดใดก็ได้ในอวกาศตัวอย่างเช่นลองใช้จุดและเวกเตอร์เพื่อย้ายวัตถุของเราเราจะใช้ Point2 เพื่อเก็บตำแหน่งของมันและ vector2 เพื่อย้ายมัน .

point2.x = 10;

point2.y = 15;

ตอนนี้คุณสามารถใช้เวกเตอร์เพื่อย้ายจุดนี้สมมติว่าเราต้องการย้ายจุดนี้ขึ้นไปที่แกน x 10 หน่วยเพื่อให้คุณมี

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

ตอนนี้จุดได้ย้ายที่ลูกศรเวกเตอร์ของคุณบอกให้

จุดตอนนี้คือ

point2.x = 20;

point2.y = 15;

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


จุดคือเวกเตอร์ มันเป็นเวกเตอร์จากจุดเริ่มต้นจนถึงจุด P
The Communist Duck

1
@Duck เทคนิคการพูดที่ไม่ถูกต้องหมายถึงพิกัดที่เป็นเนื้อเดียวกันที่เวกเตอร์สามารถพบได้โดยการลบ Origin_point จาก position_point แต่ที่ไม่ทำให้พวกเขาเท่าเทียมกัน: v = pos - originดังนั้นv != posตั้งแต่จุดเริ่มต้นเป็นจุด{0, 0, 0, 1}
Maik Semder

@Duck: จุดไม่ใช่เวกเตอร์ แต่จุดและจุดกำเนิดกำหนดเวกเตอร์ซึ่งดีพอ ๆ กับเวลาที่ต้นกำเนิดของคุณคือ 0

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