Search…

Box2D - Phần 3: Joint

30/09/20205 min read
Bài viết giới thiệu về joint, tác dụng, cách khởi tạo, thiết lập cài đặt, cách kiểm soát và nhận thông tin phản hồi, xóa và các vấn đề có thể gặp phải.

Joint

Là một thành phần trong Box2D. Được sử dụng để kết nối hai vật thể với nhau. Các joint có thể được sử dụng để mô phỏng tương tác giữa các đối tượng có các hình thức như thức bản lề, piston, dây thừng, bánh xe, ròng rọc, xe, dây chuyền,... Việc sử dụng joint một cách hiệu quả sẽ giúp tạo ra các mô phỏng hấp dẫn hơn, thú vị hơn, các joint có trong Box2D:

  • Revolute.
  • Distance.
  • Prismatic.
  • Line.
  • Weld.
  • Pulley.
  • Friction.
  • Gear.
  • Mouse.
  • Wheel.
  • Rope.

Trong mã nguồn, các class được đặt tên có kiểu giống nhau như b2RevoluteJoint, b2DistanceJoint, ...

Khởi tạo một joint

Joint được tạo ra tương tự cũng như fixtures và body. Việc đầu tiên là thiết lập một define để sau đó sử dụng để tạo ra joint.

// Vì tên các loại joint đều có cấu trúc: b2 Tên_loại_joint Joint
// define dùng để tạo ra joint cũng có một cấu trúc tên. 
// Vì vậy ở đây sử dung xxxx ứng tới Tên_loại_joint.
// Thiết lập một define
b2xxxJointDef jointDef;
// Thiết lập các tính chất cho joint
jointDef.***= ...;
  
// Khởi tạo một joint
b2xxxJoint* joint = (b2xxxJoint*)world->CreateJoint(&jointDef);
  • Đối với bodies, việc tính chất của các bodies khác nhau dẫn đến việc các tính năng của các bodies khác nhau. Với joint, dù có tính chất khác nhau, nhưng về hành vi thì các joint lại tương đương giống nhau.
  • Class b2Joint là lớp cha của tất cả các class joint khác. Nhưng nó là một lớp trừu tượng mà không bao giờ được sử dụng trực tiếp. Vì vậy, khi tạo một joint, mặc dù chức năng CreateJoint trả về một b2Joint* nhưng vẫn là loại mong muốn. Đó là lý do tại sao các giá trị trả lại từ CreateJoint đã được ép kiểu một b2xxxJoint*. Điều này là cần thiết khi khởi tạo một Joint.

Định nghĩa và thiết lập

Định nghĩa chung

Mặc dù mỗi joint có một hành vi khác nhau, và việc mỗi joint đều có một class cha. Điều đó dẫn đến mỗi joint có một  số tính năng chung.

  • bodyA: Một trong các bodies tham gia vào joint (bắt buộc).
  • bodyB: Các bodies khác tham gia vào join (bắt buộc).
  • collideConnected: Chỉ định cho dù các cơ quan được kết nối nên va chạm với nhau.

Joint chắc chắn sẽ hoạt động trên hai bodies trên. Nhưng trong một số trường hợp, bạn phải linh động hơn về điều này.

jointDef.bodyA = m_bodyA;
jointDef.bodyB = m_bodyB;
jointDef.collideConnected = false;

Chú ý

  • Thiết lập collideConnected cho phép hai bodies có sự va chạm bình thường hay không . Ví dụ: nếu đang làm cho một con búp bê có khung xương. Có thể sẽ muốn cho chân trên và thấp hơn chân phân đoạn chồng lên nhau ở đầu gối, do đó, sẽ đặt collideConnected thành false
  • Giá trị mặc định của conllideConected là false.

Cài đặt cụ thể

Điều tiếp theo sẽ cần phải xác định chi tiết cho các loại hình joint:

  • Anchor point: Thông thường là một điểm trên mỗi bodies được cho là vị trí xung quanh mà các boides khác phải tương tác. Tùy thuộc vào loại chung, điểm này sẽ là trung tâm sự quay, hay là các địa điểm để giữ khoảng cách với bodies khác, ...
  • Joint limits: Revolute và prismatic joints có thể được đưa ra giới hạn. Đặt một hạn chế trên có thể cách xa cơ thể xoay hoặc trượt.
  • Joint motor: Revolute, prismatic, line, whell joint có thể được cái đặt các giá trị motor, có nghĩa rằng thay vì quay hoặc trượt xung quanh một cách tự do, các hành vi chung như nếu nó đã có nó là nguồn năng lượng của riêng. Động cơ được đưa ra một lực lượng tối đa hoặc mô-men xoắn, và điều này có thể được sử dụng kết hợp với một tốc độ mục tiêu để quay hoặc trượt các cơ quan liên quan đến nhau. Nếu tốc độ là zero, động cơ hoạt động như một phanh vì nó nhằm mục đích giảm bất kỳ chuyển động giữa các cơ quan.

Kiểm soát và thông tin 

Sau khi một joint được khởi tạo, hoàn toàn có thể:

  • Thay đổi các tham số cho hành vi như thay đổi động cơ tốc độ, hướng hoặc năng lượng, cho phép hoặc vô hiệu hóa các giới hạn. Điều này có thể rất hữu ích để xây dựng một loạt các thú vị các cảnh và contraptions, cho ví dụ bánh xe lái xe một chiếc xe, một thang máy đó di chuyển lên và xuống.
  • Cũng có thể nhận được thông tin về những gì vị trí những joints hiện tại... Điều này là hữu ích nếu muốn sử dụng các hoạt động của khớp trong logic trò chơi, cũng có thể nhận được các applying và mô-men xoắn khớp áp dụng cho các cơ quan để giữ cho chúng vào đúng nơi...

Xóa một joint

Để xóa một joint, sử dụng phương thức destroy. Và cũng giống như body, world physics quản lý việc tạo và xóa của joint.

 world->DestroyJoint(myJoint);

Hãy xem xét một tình huống ở đây.

world->DestroyBody(body1);              // 1
world->DestroyJoint(myJoint); 
  
world->DestroyJoint(myJoint);           // 2
world->DestroyBody(body1);

Phân tích

  1. Giả sử rằng có một myJoint liên kết gữa body1body2, việc xóa như thế này dẫn đến chương trình bị crash.
  2. Đây là một cách tốt cho trường hợp ở trên.

Luôn cần phải đặc biệt để ý tới cách đặt tên. Việc đặt tên khoa học và có một thứ tự nào đó sẽ giúp quản lý các joints, bodies giúp quản lý project tốt hơn rất nhiều.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024