Các vectơ trong phát triển trò chơi


19

Tôi mới tham gia lập trình và lập trình trò chơi. Tôi đã đọc một cái gì đó về vectơ và toán học, nhưng tôi có một câu hỏi - tôi sử dụng vectơ trong lập trình trò chơi ở đâu? Có lẽ ai cũng có thể đưa ra một ví dụ đơn giản khi bạn đang sử dụng vectơ (ở dạng 2D)?

Tôi đã tìm thấy các ví dụ nhưng chủ yếu là chúng ở trong bảng điều khiển nơi chúng xuất ra các số và các ví dụ lớn mà tôi không hiểu.


Basic TL; DR vectơ là một phần của chủ đề Đại số tuyến tính và dẫn đến Ma trận. Với Ma trận và Đại số tuyến tính, bạn viết bất cứ thứ gì từ bộ giải Minesweeper sang hình chiếu thế giới 3D để xem đối tượng nào ở dưới con trỏ của bạn. Đại số tuyến tính là nhánh toán học hữu ích và cần thiết nhất cho bất kỳ nhà phát triển trò chơi nào. Học nó ngay bây giờ; Bạn sẽ không hối tiếc.
Robert Massaioli

Cảm ơn tất cả các câu trả lời tuyệt vời! Nhưng tại sao một cái gì đó như không sử dụng Vector trong hướng dẫn này?: Zetcode.com/tutorials/javagamestutorial Hoặc một nhà phát triển sử dụng khác không?
vqwer

Khó nói, có lẽ tác giả muốn giữ nó đơn giản và cơ bản cho người mới bắt đầu.
Maik ngày

Trên thực tế tác giả sử dụng chúng, hãy nhìn vào mảng điểm ở class Star đây
Maik Semder

Cũng ở đây được Point2Dsử dụng trongclass ResizeRectangle
Maik ngày

Câu trả lời:


31

Vectơ là gì?

Các vectơ là tập hợp các tọa độ có kích thước khác nhau. Mỗi tọa độ trong một vectơ đại diện cho một số vị trí tuyệt đối theo hướng không gian mà vectơ nằm trong.

  • Vectơ 1-D sẽ là {1} . Điều này có thể, ví dụ, một vị trí tại X = 1. Hoặc thời gian t = 1.
  • Một vectơ 2 chiều sẽ là {-4,3} . Ví dụ, đây có thể là một vị trí tại -4 trên trục X và 3 trên trục Y. Nó cũng có thể là nhiệt độ (3 độ) tại vị trí (-4 mét) trên trục X.
  • Một vectơ 3 chiều sẽ là {1,2,3} . Đây có thể là một vị trí trong không gian 1 dọc theo trục X, 2 trở lại trên trục Y và 3 lên trên trục Z. Hoặc có thể là 1 màu đỏ, 2 màu xanh lá cây và 3 màu xanh lam trong một màu. Hoặc, đó có thể là vị trí XY ( {1,2} ) tại một thời điểm T ( {3} ).

Lưu ý rằng trong mọi trường hợp, chúng tôi đã gán ý nghĩa cho các vectơ cho vấn đề của chúng tôi. Mặc dù bạn thường thấy các vectơ được sử dụng cho hình học trong các trò chơi, không có lý do gì bạn không thể làm gì khác với chúng.

Tại sao tôi sử dụng vectơ?

Đầu tiên, bạn không bao giờ phải sử dụng vectơ. Miễn là bạn đang theo dõi x và y, hoặc bất kỳ tọa độ nào bạn quan tâm, theo một cách nào đó bạn vẫn ổn.

Tuy nhiên, lợi thế của việc sử dụng vectơ là chúng thể hiện gọn gàng những thứ như hướng và vị trí, và cũng có một số phép toán được xác định trên chúng giúp cuộc sống của bạn dễ dàng hơn.

Đối với một ví dụ đơn giản về những điều này, hãy xem xét các sản phẩm chấm .

Giả sử bạn có một hệ thống radar trong một trò chơi theo phong cách từ trên xuống. Mỗi kẻ thù xuất hiện trong khu vực của radar (một số nêm hình chiếc bánh ở dạng 2D) sẽ có một chấm đỏ nhỏ trên màn hình của bạn. Vì vậy, bạn cần tìm ra kẻ thù trong phần radar của bạn.

Bạn có thể kiểm tra nếu kẻ thù ở trong một hình tam giác. Bạn cũng có thể kiểm tra xem kẻ thù có nằm trong giao điểm của hai nửa không gian của các mặt phẳng / đường thẳng xác định hai phía của khu vực radar hay không.

Hoặc, bạn chỉ có thể sử dụng một sản phẩm chấm để kiểm tra. Đây là cách thực hiện:

  1. Tạo một vectơ đi từ trung tâm của radar ra phía trước "phía trước của radar". Bình thường hóa nó.
  2. Tạo một vectơ đi từ trung tâm của radar ra phía đối tượng mà chúng ta muốn kiểm tra khả năng hiển thị của radar. Bình thường hóa nó.
  3. Lấy sản phẩm chấm của hai vectơ chuẩn hóa.
  4. Lấy arccosine của sản phẩm đó và kiểm tra xem nó có nhỏ hơn một nửa góc của chiều rộng của radar không. Nếu có, hãy vẽ một đốm sáng.

Điều này rất tiện dụng và giờ đây cũng cho phép bạn dễ dàng có các radar hướng theo các hướng khác nhau (chỉ thay đổi vectơ chuyển tiếp) và có độ rộng khác nhau (chỉ thay đổi góc độ rộng của radar) - và bạn cũng có thể sử dụng lại cùng một mã cho các trường hợp đó !

Tại sao tôi lại sử dụng vectơ?

Nếu bạn ở dạng 2D, có lẽ cách tốt nhất để đạt được các hiệu ứng và chuyển động phức tạp (quay, thu nhỏ, v.v.) là sử dụng biểu đồ cảnh. Một hành tinh có một con tàu quay quanh, con tàu có một máy bay không người lái quay quanh. Tính toán cho việc này mà không sử dụng toán vector là thực sự, thực sự xấu xí.

Với toán học vectơ, chúng tôi đại diện cho mỗi người có một điểm và ma trận biến đổi 3x3. Hành tinh sử dụng biến đổi của nó, con tàu sử dụng biến đổi của nó và biến đổi của hành tinh, và máy bay không người lái sử dụng biến đổi của nó và biến đổi của con tàu và biến đổi của hành tinh.

Khi hành tinh di chuyển, bạn thay đổi sự biến đổi của nó, và con tàu và máy bay không người lái sẽ tự động được định vị "miễn phí". Mã sạch hơn nhiều.

Vẫn không thuyết phục. Các vectơ cũng là đại diện gốc cho vị trí, hình học và chuyển động được sử dụng bởi gần như tất cả các thư viện đồ họa - và chắc chắn là OpenGL và DirectX. Bạn không có khả năng thoát khỏi mà không phải sử dụng chúng.

Kết luận Các vectơ là một công cụ mạnh mẽ để viết mã rõ ràng giúp giải quyết các vấn đề hình học một cách sạch sẽ và thanh lịch.


14

Một ví dụ 2D là tọa độ màn hình, nó xác định một pixel trên màn hình và có thành phần x và y [x, y] tức là vị trí màn hình phía trên bên trái [0, 0]

Một ví dụ khác: Hãy tưởng tượng một cuộn văn bản từ viền màn hình bên phải sang viền màn hình bên trái. Bây giờ bạn cần xác định tốc độ của văn bản cuộn theo pixel mỗi giây, tức là [-20, 0] có nghĩa là văn bản cuộn 20 pixel sang trái mỗi giây và không bao giờ thay đổi chiều cao.

Một ví dụ khác nâng cao hơn: Hãy tưởng tượng một trò chơi 2D được cho là chạy trên các độ phân giải màn hình khác nhau 800x600, 1024x768, v.v. Điều này có thể dễ dàng thực hiện bằng cách sử dụng nội bộ chiều rộng màn hình từ 0,0 đến 1,0 và chiều cao từ 0,0 đến 1,0 để tách rời logic trò chơi từ độ phân giải màn hình thực tế. Bây giờ khi bạn vẽ lên màn hình, bạn chỉ cần nhân vectơ bên trong với vectơ độ phân giải:

screen_pos = internal_pos * screen_ressolution

lưu ý, cả 3 biến đều là vectơ 2D ở đây, chúng có x- và thành phần y, tức là cho Internal_pose này [0,5, 0,25]:

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

Vì vậy, vị trí bên trong [0,5, 0,25] được chuyển thành vị trí màn hình thực tế [400, 150]

Đây là những thứ cơ bản. Ưu điểm thực sự của vectơ là ứng dụng trong Đại số tuyến tính nơi bạn có thể sử dụng ma trận để biến đổi các đỉnh của mình (xoay, tỷ lệ, gương, v.v.), tức là để dễ dàng xoay tất cả vị trí bên trong của bạn 90 độ hoặc bạn phải hoán đổi màn hình-y vị trí 0 từ trên xuống dưới màn hình, vì tức là thư viện bên thứ ba mà bạn sử dụng, sử dụng quy ước này.


Không phải là một vectơ một mảng kích thước duy nhất, như một danh sách sắp xếp nào đó? Khi chúng ta nói về độ phân giải màn hình, không phải chúng ta đang nói về mảng nhiều chiều (một tọa độ cho mỗi trục X và Y)? Chỉ để đảm bảo rằng "vectơ" không bị trộn lẫn với ma trận ở đây. =)
Will Marcouiller

@ Sẽ làm cho dữ liệu pixel hoàn chỉnh cho màn hình có thể được coi là một mảng nhiều chiều, về cơ bản là một bitmap, nhưng các giá trị cho chiều rộng và chiều cao, nói cách khác là độ phân giải, không thể
Maik Semder

2
Lưu ý rằng một vectơ thường được đối xử khá khác nhau trong toán học và trong lập trình. Về mặt toán học, một vectơ không phải là một mảng nhiều chiều, mặc dù các thành phần của nó đối với một số cơ sở cùng nhau xác định một mảng như vậy. Các vector chính là tọa độ bất biến. Các hoạt động screen_pos = internal_pos * screen_resolutionđược không phối hợp bất biến theo cách mà bạn đã viết nó, nó có thể thích hợp hơn được viết screen_pos = map_to_screen * internal_pos, mà map_to_screenlà một ánh xạ tuyến tính (có thể được viết dưới dạng một ma trận, trong trường hợp này một đường chéo).
leftaroundabout

6

Đây là một lời giải thích tuyệt vời về các vectơ trong phát triển trò chơi trên blog của Wolfire Games:

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


Đây hiện là một câu trả lời chỉ liên kết. Vui lòng xem xét bao gồm một bản tóm tắt sơ bộ về những điểm chính mà bạn hy vọng người đọc có thể lượm lặt được từ liên kết này, vì vậy câu trả lời có thể tự đứng vững ngay cả khi liên kết thay đổi, phá vỡ hoặc không khả dụng trong tương lai.
DMGregory

1

Vectơ là một thực thể có cả giá trị và hướng. Ví dụ về các vectơ trong thế giới thực và các trò chơi dựa trên vật lý bao gồm vận tốc và động lượng. Các thuộc tính chỉ có giá trị nhưng không có hướng được gọi là vô hướng và bao gồm vị trí, khối lượng, mật độ và vv.

Các vectơ là cần thiết cho các trò chơi mô phỏng các thuộc tính vật lý giống như vectơ (như đã đề cập - tốc độ, gia tốc và vv). Toán học được sử dụng để tính toán vectơ được gọi là đại số tuyến tính .


Tốc độ là một vô hướng, chiều dài của vectơ vận tốc
Maik Semder

Đúng - đã sửa
Eran Galperin

1
và vị trí thông thường được coi là vectơ, đó là khoảng cách vô hướng.
Ali1S 232

Vị trí có thể được coi là cả vô hướng (hoặc tập hợp vô hướng) hoặc vectơ chỉ từ điểm bắt đầu trục.
Eran Galperin

1

Bất cứ nơi nào bạn có một số cho mỗi thứ nguyên để đại diện cho một thứ gì đó, bộ sưu tập các số này có thể được coi là một vectơ. Vị trí, vận tốc và gia tốc là những ví dụ điển hình của vectơ. Trong một số trường hợp, nó cũng có thể thực tế để thể hiện hướng đối diện như một vectơ.

Đối với những thứ cơ bản, việc bạn có coi những con số này là vectơ hay không thực sự không quan trọng, nhưng nếu bạn muốn làm bất kỳ loại vật lý nào bạn phải xem xét về toán học vectơ.


Vị trí không phải là một vectơ
Eran Galperin

Không phải là tốc độ, nó là vô hướng, vận tốc là một vectơ
Maik Semder

2
@Eran Galperin Tôi biết rằng đó là một quan điểm khá rộng rãi giữa các nhà toán học. Tuy nhiên, sự khác biệt giữa một điểm và vectơ vị trí tương ứng của nó là khá hàn lâm. Không có lý do thực tế để làm ầm ĩ về sự khác biệt.
aaaaaaaaaaaa

1
Có những lý do thực tế, một khi bạn làm việc với tọa độ và ma trận đồng nhất 4D, bạn phải tạo ra sự khác biệt đó. Mặc dù nó không liên quan đến phạm vi của câu hỏi này.
Maik ngày

@eBusiness không phải là "xem" mà là sự thật. Và tôi là một nhà vật lý bởi giáo dục, không phải là một nhà toán học.
Eran Galperin

0

Rất đơn giản, bất cứ thứ gì có vị trí, hoặc hướng, ở khắp mọi nơi trong trò chơi họ đều sử dụng vectơ. Một vectơ giống như một điểm

struct Point2
{
float x, y;
};

struct Vector2
{
float x, y;
};

Tuy nhiên, sự khác biệt thực sự đi xuống này. Một điểm chỉ là một dấu chấm, trong khi vectơ là Mũi tên.

nếu bạn có

Point2.x = 5;

Point2.y = 10;

bạn nói rằng ý tôi là ở vị trí này x 5 và y 10.

tuy nhiên khi bạn khai báo một vectơ ...

Vector2.x = 5;

Vector2.y = 10; 

Bạn thực sự nói rằng tôi đang khai báo một mũi tên từ 0,0 đến x 5, y 10;

bạn thậm chí có thể có điểm mà vectơ của bạn chỉ từ một điểm trong không gian từ bất cứ đâu, ví dụ: hãy sử dụng một điểm và một vectơ để di chuyển đối tượng của chúng ta, chúng ta sẽ sử dụng Điểm 2 để lưu trữ vị trí của nó và vectơ 2 để di chuyển nó .

point2.x = 10;

point2.y = 15;

bây giờ bạn có thể sử dụng một vectơ để di chuyển điểm này, giả sử chúng tôi muốn di chuyển điểm này lên trục x 10 đơn vị để bạn có

vector2.x = 10;

vector2.y = 0;

point2 += vector2;

bây giờ điểm đã di chuyển nơi mũi tên vector của bạn nói với nó.

điểm bây giờ là

point2.x = 20;

point2.y = 15;

Một điều cuối cùng cần lưu ý là đôi khi một vectơ được sử dụng như một điểm và ngược lại chỉ vì chúng giữ cùng loại dữ liệu.


Một điểm một vectơ. Đó là một vectơ từ gốc đến điểm P.
Vịt Cộng sản

1
@ Nói về mặt kỹ thuật, điều đó không đúng, đề cập đến tọa độ đồng nhất mà vectơ có thể được tìm thấy bằng cách trừ điểm gốc_point khỏi vị trí_point, nhưng điều đó không làm cho chúng bằng nhau: v = pos - originvì vậy v != posnguồn gốc là một điểm{0, 0, 0, 1}
Maik Semder

@Duck: Một điểm không phải là một vectơ mà là một điểm và điểm gốc xác định một vectơ, điều này cũng tốt như hầu hết thời gian nếu điểm gốc của bạn là 0.

@Duck thì tại sao bạn gọi nó là điểm P của bạn? LOL
EddieV223
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.