Nếu nói đến game không thể không nói đến tương tác vật lý tồn tại tại đa số game, tương tác vật lý áp dụng các luật vật lý khiến game có độ thực tế cao hơn. Mục đích của tương tác vật lý là sử dung thiết bị vi tính đẻ tái hiện lại những hiện tượng vật lý qua các công thức, tại thời điểm hiện tại máy tính cũng như đa số thiết bị điện tử đều có phần cứng khá tốt để tạo các tương tác gần giống tương đương với thế giới thực.
Với game hiện tại, đa số game studio sử dụng những engine vật lý từ phía thứ ba để phát triển game của mình, những engine phổ biến nhất hay được dung như Box2D (tồn tại trên nhiều ngôn ngữ và hệ máy, miễn phí, Angry Birds dung engine này), PhysX (engine của Nvidia, dung bởi nhiều game hành động như Batman, Assassin’s Creed), Havok (engine vật lý rất mạnh dung trong rất nhiều game cần tính toán độ va chạm chân thực nhất như Soul Calibur, Mortal Kombat, Tekken hay Skyrim) . Bài viết này nhằm mục đích giải thích và nêu ra những điều cần biết về tương tác vật lý trong game mà không đi quá sâu vào kỹ thuật, bài viết sẽ dung engine game Unity 3D để đưa ra những ví dụ cụ thể hơn, Unity 3D có engine vật lý là PhysX của NVidia(Unity 5 sử dụng PhysX ver.3).
Về cơ bản thì tương tác vật lý chia ra làm hai phần, mô phỏng rigid-body (vật cứng) và soft-body (vật mềm), tại đây chúng ta sẽ tập trung vào rigidbody. Trong mô phỏng rigid body các object được nhóm ra thành các loại khác nhau dựa trên chúng phải tương tác với nhau thế nào, thường thì loại mô phỏng này tốn ít tài nguyên hơn.
Rigid Body là hiệu ứng được mô phỏng nhiều nhất trong game, vì đa số vật mà chúng ta tương tác ngòai đời cũng tương đối cứng, và mô phỏng chúng tương đối đơn giản. Thông thường các tính toán vật lý đươc thực hiện bởi các engine vât lý, nó sẽ nhận được thông số tại mỗi thời điểm tương tác cộng thêm những thông số được người phát triển đưa vào trước, sau đó sự mô phỏng sẽ đươc thực hiện theo các bước, mỗi bước đẩy tiến độ của sự mô phỏng, chỉ vài khắc trong giây, và kết quả sẽ được thẻ hiện trên màn hình. Dĩ nhiên, công việc của engine chỉ là thực hiện các phép tính, còn các bước thế nào thường dựa vào sự cần thiết của từng game.
1 chút kiến thực vật lý. sự chuyển động của rigid body có thể được thể hiện bởi cơ học Newton, được sang lập dựa trên 3 điểu luật nổi tiếng của Isaac Newton:
Rigidbody là bộ phận quan trọng nhất trong engine vật lý, mỗi object đều tạo ra bởi Unity đểu được mặc định gắn componenet Rigidbody, nếu tạo ra object rỗng để đưa rigidbody vào object trong Unity chỉ cần chọn object mình muốn, chọn Components, Physics và Rigidbody. Khi áp dụng rigidbody lên bất kì vật nào, vật đó sẽ tự động có những tương tác vật lý mà không cần dòng code nào cả, rigid body sẽ được kéo xuống bởi trọng lực và sẽ va chạm với các vật chạm vào nó nếu component Collider tồn tại với cả 2 object. RigidBody có những thuộc tính sau đây:
Colliders là vật mà engine vật lý sẽ dung để có thể nhận ra sự va chạm, không giống như các mesh, chúng nhận biết được mỗi khi va chạm với nhau. Đa số collider có hình dạng đơn giản nhằm mục đích tính toán đơn giản và dễ dàng hơn, phần lớn các object trong Unity sẽ được gắn collider mỗi khi tạo ra, với Cube là Box Collider, Sphere là Sphere Collider, Cylinder là Capsule Collider.
Unity cung cấp những API sau đâu để phát hiện sự va chạm của các collider.
1 ví dụ đơn giản để áp dụng những thông tin được API của Unity cung cấp, khi Assassin Ezio Auditore Firenze rơi từ trên độ cao xuống dưới mặt đất, số lượng sát thương sẽ được áp dụng vào nhân vật Assassin:
void OnCollisionEnter(Collision collision) {
if (collision.relativeVelocity.magnitude < 10) { //Áp dụng sát thương nếu vận tốc thấp.
Ezio.ApplyDamage(collision.relativeVelocity.magnitude * damagePerVelocity);
return;
}
if (collision.relativeVelocity.magnitude >= 10) { //Thật đáng tiếc
Ezio.Kill();
return;
}
}
Để có thể dung Trigger trong collider, đơn giản chỉ cần tick vào checkbox As Trigger trong Componenet Collider ở Inspecter. Trong trạng thái này collider sẽ không bị va chạm bởi bất kỳ object nào, nhưng bản thân sẽ được dùng để phát hiện những va chạm trên nó, tạo ra những event có thể điều khiển được trong code với những function sau đây:
Các class này sẽ đươc gọi ra khi một Collider khác va chạm vào Collider có thuộc tính As Trigger, từ Collider có thể lấy ra thông tin về object bị va chạm, cụ thể có thể dùng nó để kiểm tra sự va chạm vào 1 vật mà không áp dụng lại lực tương đương, như ví dụ Mario mỗi khi chạm vào đồng tiền:
void OnTriggerEnter(Collider other) {
if (other.name == “Mario”) { //Nếu vật va chạm có tên Mario
GameController.AddCoin(); //Tính coin cho người chơi
Destroy(this.gameObject); //Phá hủy object này
}
}
Đây là những bộ phận cơ bản cần phải biết khi làm việc với engine vật lý trong Unity, dĩ nhiên với PhysX, việc điều khiển vật lý còn nhiều bộ phận phức tạp, đòi hỏi với những game cần độ tương tác vật lý cao, cũng như chuẩn xác, vơi nhiều object có hình dạng và cử động phức tạp, những điều này sẽ được nói ra trong phần nâng cao của tương tác vật lý trong engine vật lý của Unity.
Nguồn: https://viblo.asia/p/co-ban-ve-engine-vat-ly-trong-unity-3OEqGj1PM9bL
You need to login in order to like this post: click here
YOU MIGHT ALSO LIKE