Cách tắt chuyển động trục Y trong động cơ vật lý Bullet


11

Tôi muốn tạo một đối tượng hơn là chỉ di chuyển dọc theo trục X và Z, trong khi vẫn giữ trục Y bị vô hiệu hóa (nó giống như chuyển động trong 2D và đối tượng sẽ không rơi xuống).

Tôi hiện đang sử dụng ràng buộc 6 dof để hạn chế chuyển động trong trục Y, nhưng nó không hoạt động:

btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();

btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);

constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));

constrict->setAngularLowerLimit( btVector3( 1,  1,  1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );

mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);

Cảm ơn!


Có lẽ điều này sẽ giúp: Bulletphysics.org/BONS/phpBB3/ , có lẽ cũng đặt giới hạn Dưới / Trên cho trục Y thành 0, thay vì 1.
giảm tốc

Câu trả lời:


20

Cách ưa thích để đạt được điều này trong Bullet là đặt yếu tố tuyến tính và có thể là yếu tố góc cho cơ thể được đề cập. Phương pháp này được trình bày dưới dạng Đoạn mã tại trang Bullet Wiki.

Để chỉ cho phép di chuyển dọc theo trục Y, bạn sẽ sử dụng một cái gì đó như thế này:

body->setLinearFactor(btVector3(0,1,0));

Nếu bạn muốn thêm vô hiệu hóa xoay quanh bất kỳ trục cụ thể nào, bạn sử dụng cùng một quy trình, nhưng sử dụng setAngularFactorchức năng thay thế.

Trong video ví dụ đơn giản này, tôi đã sử dụng hai cuộc gọi sau để tắt chuyển động dọc theo trục Y và chỉ cho phép xoay quanh trục Y. Điều này có hiệu quả buộc cơ thể ở lại trong mặt phẳng XZ mà nó được tạo ra ban đầu.

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

Một cách để làm điều này là tạo ra một cuộc gọi lại vật lý. Điều này sẽ được gọi mỗi lần đạn trong nội bộ. Trong cuộc gọi này, bạn có thể đặt vận tốc Y thành 0, vô hiệu hóa chuyển động Y. Nó sẽ trông giống như thế này:

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

Bạn có thể đọc thêm về mô phỏng cuộc gọi lại ở đây .


Cảm ơn bạn! Đây là một câu trả lời tuyệt vời, vì nó cũng áp dụng cho cổng java của JBONS (không giống như câu trả lời khác).
joehot200
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.