Ngoài dự án trò chơi Novice Novice


22

Tôi đã đọc câu trả lời này về loại toán mà một nhà phát triển trò chơi nên biết và phần này thực sự nổi bật với tôi:

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

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

Đó là cách tôi sẽ nghĩ để làm điều đó vì vậy tôi đoán điều đó cho thấy trình độ kỹ năng của tôi. Ít nhất là đối với các loại trò chơi cuộn bên 2D, kiểu arcade mà tôi đã làm trong quá khứ, đó là tất cả những gì tôi cần. Điều đó và một chút lượng giác.

Trên thực tế, tôi đã không sử dụng nhiều đại số tuyến tính hoặc thậm chí nghe nói về tứ phương trước khi đọc bài đăng đó. Có phải vì những phép toán này không xuất hiện cho đến khi bạn làm việc với 3D hay là bởi vì các trò chơi 2D của tôi khá đơn giản mà tôi đã thoát khỏi những triển khai ngây thơ.

Câu hỏi tiếp theo: Nếu tôi muốn làm quen với loại toán đó, tôi nên thực hiện loại dự án nào? IE: viết một công cụ trò chơi, làm việc trên một trò chơi 3D, v.v.


1
khanacademy.org là tuyệt vời cho việc học toán cho người mới bắt đầu và nâng cao. Cộng với thành tích! Không có gì giống như lý thuyết trò chơi để làm sống động bất kỳ học viện nhàm chán.
giảm tốc

Câu trả lời:


16

Bí quyết thực sự với điều này là khoa học cấp trung học; mà bạn nên làm Trong trường hợp bạn không tìm kiếm nhanh trên Google sẽ giúp bạn bắt đầu . Để giải thích làm thế nào bạn tránh được suy nghĩ 'người mới' lấy ví dụ về người đổ bộ mặt trăng .

Một khi bạn đã đọc rằng [change in position] = [velocity] * [time passed]nó trở nên rõ ràng sẽ cần phải theo dõi các biến đó:

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

Theo đó bạn chỉ cần áp dụng vận tốc cho vị trí mỗi khung:

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

Bây giờ chúng tôi muốn thay đổi vận tốc mỗi khung hình để chúng tôi có thể thêm trọng lực. Theo cùng một nguồn chính xác [change in velocity] = [acceleration] * [time passed]. Do đó, chúng ta có thể áp dụng nguyên tắc chính xác tương tự:

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;

Bây giờ bạn cần một cách để người chơi điều khiển tàu vũ trụ của mình. Từ việc đọc thêm về vật lý cơ bản, bạn sẽ học được rằng chuyển động là kết quả của lực - tôi không thể tìm thấy một nguồn nhưng [change in acceleration] = ([force] / [mass]) * time(theo như tôi nhớ). Vì vậy, khi người chơi nhấn một phím, bạn chỉ cần đặt fxfycác biến thành một cái gì đó và áp dụng phương trình trong quá trình cập nhật của bạn.

Cuối cùng, bạn cần suy nghĩ về vật lý xung quanh các vật thể trong trò chơi của bạn - và thay vì cố gắng làm cho chúng di chuyển theo cách bạn nghĩ, thay vì tìm kiếm phương trình .

Lưu ý trong tương lai: Hãy nhớ rằng đây chắc chắn không phải là cách tốt nhất để làm vật lý (đây được gọi là Tích hợp Euler và có thể dẫn đến một số tình huống kỳ lạ ở tốc độ khung hình thấp) - bạn cần xem xét các cách khác để làm việc (Bài viết đó có khá tốt đẹp viết lên những điều cơ bản là tốt). Tuy nhiên, hãy gắn bó với Euler Integration ngay bây giờ, vì điều đó có nghĩa là bạn đang cố gắng học một điều ít hơn.

Những trò chơi nào sẽ dạy bạn cách suy nghĩ trong tư duy đúng?

Làm thế nào bạn sẽ kiểm tra rằng bạn đã làm mọi thứ chính xác và với suy nghĩ đúng? Chèn một Sleep(10 milliseconds)trong vòng lặp trò chơi của bạn và mọi thứ vẫn sẽ di chuyển và phản ứng giống như tốc độ khung hình đầy đủ.

Cuối cùng, xin vui lòng tránh xa 3D (và có lực lượng Quancyions và Ma trận) cho đến khi bạn có nhiều kinh nghiệm với việc làm cho các trò chơi 2D hoạt động. Tôi muốn nói rằng có khá nhiều nhà phát triển trò chơi không thực sự biết cách hoạt động của Quancyions hoặc Ma trận - mà chỉ biết cách sử dụng chúng - tiếp cận chúng sau này rất nhiều (hoặc không bao giờ, trò chơi 2D rất thú vị và có thể khá thành công). Bạn không thực sự cần phải biết đại số tuyến tính và tiếp tục làm điều này ở cấp độ cơ bản (nhưng nó thực sự có ích, vì vậy hãy đến một số lớp học ban đêm nếu bạn có thể).

Phần thưởng cuối cùng: Một điều mà giáo viên mỹ thuật của tôi luôn nói với tôi là "đừng vẽ những gì bạn nghĩ bạn nhìn thấy, hãy vẽ những gì bạn nhìn thấy". Điều tương tự cũng áp dụng ở đây "không mô hình hóa những gì bạn nghĩ xảy ra ( object.position++), mô hình hóa những gì xảy ra (` object.poseition + = vận tốc * thời gian) "- ít nhất là đến giới hạn hợp lý (bạn không mô hình hóa một hệ thống hoàn toàn chính xác, nhưng thực hiện một cái gì đó là một sự bắt chước tốt).


Tôi thích ý tưởng của bạn về việc chèn độ trễ nhân tạo để thử nghiệm. Ngoài ra, lực hấp dẫn của Trái đất là 9,8 chứ không phải 9,1
Steve

Hãy cẩn thận với "không mô hình hóa những gì bạn nghĩ xảy ra, mô hình hóa những gì xảy ra" trừ khi bạn đang viết một mô phỏng thực tế. Quy mô khi cần thiết cho dự án của bạn. Đôi khi "những gì bạn nghĩ xảy ra" là một câu trả lời tốt cho thiết kế của bạn.
chaosTechnician

@chaosT kỹ thuật viên ở cấp độ này "những gì bạn nghĩ xảy ra" là object.position++. Tôi sẽ làm rõ câu trả lời.
Jonathan Dickinson

-1 cho instead of trying to make them move in the way you would think, rather look up the equation. Đó là về việc hiểu các phương trình, không tìm kiếm chúng. Điều quan trọng nhất là làm cho trò chơi trở nên thú vị, và ai biết được, có thể bạn sẽ tìm thấy một số gia tốc thay đổi làm cho trọng lực trở nên thú vị hơn. Nhưng sẽ rất khó để lý giải làm thế nào nếu bạn không hiểu các phương trình.
BlueRaja - Daniel Pflughoeft

3
@ BlueRaja-DannyPflughoeft chính xác là những gì tôi đã giải thích với anh ta: không biết phương trình ở nơi đầu tiên có nghĩa là bạn không bao giờ có thể hiểu nó - và cách duy nhất để hiểu chúng là sử dụng chúng trong tình huống thực tế.
Jonathan Dickinson

3

Tôi nghĩ rằng các phần của câu trả lời bạn liên kết đến là một chút tinh hoa trong bài trình bày của họ. Làm nổi bật những ưu điểm của toán học vectơ sau đó nói rằng một đối tượng cần một vị trí, hướng và gia tốc không nhất quán bởi vì nó thực sự sẽ sôi sục với một cái gì đó giống object.position.x += (object.velocity.x + object.acceleration.x) * deltaTimenhưwhwhich, về cơ bản, không khác biệt gì object.position.x++. Đệ tứ là một trong nhiều cách để biểu diễn các phép quay; Tôi thích chúng nhưng chúng không cần thiết để hiểu xoay 3D. Mặc dù nhiều người dùng Quancyion sẽ ám chỉ, họ không phải là Chén Thánh của toán học xoay vòng.

Các nguyên tắc của đại số tuyến tính có mặt trong chuyển động 2D đơn giản, xoay, v.v. nhưng toán học đơn giản hơn vì chỉ có hai chiều. Đây là một ví dụ .

Có rất nhiều cách để học / nâng cao kiến ​​thức về đại số tuyến tính:

  1. Tôi đã xem xét tham gia một khóa học về đại số tuyến tính nhưng tải của tôi khá nặng nên tôi không thể biện minh cho công việc làm thêm.
  2. Sự hiểu biết của tôi về đại số tuyến tính đã tăng lên đáng kể khi tôi tham gia một loạt các lớp lập trình công cụ trò chơi. Đối với tôi, việc sử dụng vectơ, ma trận, v.v. (nói chung) phổ biến hơn ở phía động cơ của mọi thứ so với phía trò chơi. Tất nhiên, điều đó không có nghĩa là tôi chưa sử dụng ma trận trong mã trò chơi. Tôi chỉ không sử dụng chúng thường xuyên như khi tôi viết mã động cơ. ymmv
  3. Ngoài ra còn có rất nhiều sách có thể giúp bạn hiểu về toán học mà bạn cần biết. Tôi thích cuốn sách này có một chương có tiêu đề "Toán học 3D cho các trò chơi."

Cuối cùng, nếu thiết kế trò chơi của bạn không đòi hỏi toán học phức tạp, đừng sử dụng nó. :) Nhưng, tất nhiên, đừng để điều đó ngăn bạn đào sâu vào việc thiết kế một trò chơi.


0

Đệ tứ cho 2D sẽ là quá mức cần thiết, chưa kể cách tính toán quá đắt. Xoay bitmap (2D) được xử lý bởi rất nhiều nền tảng / thư viện tuyệt vời, bởi vì nó rất cơ bản để viết bất kỳ ứng dụng nào, và ngay cả khi không, xoay vòng bitmap 2D không hơn gì một chút đơn giản. Trong 3D, mọi thứ trở nên ít trực quan hơn so với người bình thường, trừ khi tất nhiên nói rằng con người lớn lên viết mã 3D khi họ nên đi xe đạp.

Đại số tuyến tính có thể áp dụng cho 2D giống như 3D và sẽ là thứ bạn quen thuộc ngay cả khi bạn chỉ học toán ở trường trung học cơ sở. Nếu bạn đã từng thực hiện giao điểm đường hoặc vẽ sơ đồ định kỳ trên một đường (tích hợp), thì bạn đã sử dụng đại số tuyến tính.

Học toán 3D thường bắt đầu bằng việc đặt một vật thể đơn giản (như khối lập phương) vào không gian 3D và thực hiện một camera có thể di chuyển, có thể xem vật thể đó từ các góc độ khác nhau và quan điểm đó có thể bắt đầu trực giao để giữ mọi thứ đơn giản hơn. Đó là về các điểm chiếu lên mặt phẳng 3D đại diện cho màn hình của bạn (công thức ở đây , bạn sẽ mở rộng điểm này sang trục x và z ngoài y). Thực sự, đó là sự khởi đầu của việc viết bất kỳ công cụ 3D nào, bất kể mức độ kinh nghiệm của bạn. Flash và Treatment.js là hai cách tuyệt vời để tạo nguyên mẫu một cái gì đó như thế này một cách dễ dàng.


0

Bạn đã đúng khi theo dõi đại số tuyến tính và toán học phức tạp hơn thường liên quan đến đồ họa 3D và không gian 3D. Nhưng vẫn còn nhiều toán học có thể được thực hiện trong các trò chơi 2D. Toán học vật lý có thể trở nên khó khăn, và nó sẽ phức tạp hơn nếu bạn xem xét vật lý cơ thể mềm và động lực học B-spline (và vẫn ở dạng 2D, hãy ghi nhớ)

Hãy thử xây dựng hoặc mổ xẻ một thư viện vật lý sẽ bao gồm xử lý va chạm và phản ứng cho các hình dạng 2D phổ biến. Đại số tuyến tính là khá hữu ích để tính toán các vectơ quỹ đạo cho các va chạm. Sản phẩm chấm khá liên quan đến vòng tròn đơn vị được sử dụng trong lượng giác. Tuy nhiên, sự phức tạp của vật lý cơ thể cứng nhắc tăng theo cấp số nhân khi áp dụng nó trong 3D.

Đồ họa 3D cung cấp cho bạn sự hiểu biết nhiều hơn về các phép tính ma trận, bậc bốn, đại số tuyến tính và một số phép tính ứng dụng. Điều đầu tiên bạn có thể chọn là sử dụng ma trận để di chuyển và thao tác với các vật thể trong không gian 3D.


0

Nếu bạn đang viết trò chơi 2D, có lẽ bạn đã sử dụng đại số tuyến tính rồi .. bạn không biết điều đó! Chính thức học ít nhất những điều cơ bản về vectơ là khá dễ dàng, nhưng đi một chặng đường dài trong việc đơn giản hóa suy nghĩ về chuyển động phức tạp khác.

Ví dụ, chúng tôi nhận được rất nhiều câu hỏi ở đây về việc sử dụng phương trình nào để mô phỏng chuyển động cong, chẳng hạn như cho một phát súng thần công từ một khẩu súng thần công, hoặc một tên lửa homing. Nhưng nếu bạn hiểu các vectơ, "phương trình" duy nhất bạn cần là để thêm hai vectơ lại với nhau. Không chỉ vậy, nhưng việc thêm những thứ như kéo không khí hoặc ma sát trở nên vô cùng đơn giản - chỉ cần tính toán vectơ kéo và thêm nó vào vận tốc. Mau!

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.