首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BulletPhysics -门对象放置在地面上时无法控制地旋转

BulletPhysics -门对象放置在地面上时无法控制地旋转
EN

Stack Overflow用户
提问于 2018-08-04 12:51:44
回答 1查看 98关注 0票数 0

我正在尝试使用HingeConstraint在BulletPhysics中模拟一个门。下面的代码按预期工作,因为立方体在Y轴周围的转角上旋转,有效地像门一样打开,但一旦我将对象放在地面上,它就开始无法控制地四处飞行。

代码语言:javascript
复制
RigidBody body = physics.LocalCreateRigidBody(mass, Matrix4.CreateTranslation(new Vector3(0, 0.5f, 0)), new BoxShape(1, 1, 1));
body.UserObject = "Door";

Vector3 pivotInA = new Vector3(1, 1, 1);
Vector3 axisInA = new Vector3(0, 1, 0);
var hinge = new HingeConstraint(body, pivotInA, axisInA);

const float targetVelocity = 1.0f;
const float maxMotorImpulse = 1.0f;
hinge.EnableAngularMotor(true, targetVelocity, maxMotorImpulse);
physics.World.AddConstraint(hinge);

禁用门和地面之间的碰撞可以解决这个问题,但我也在努力实现这一点。文档说你可以为一个物体设置碰撞类型和遮罩,但似乎只有World.AddRigidBody()构造函数接受这样的参数,并且据我所知,我的门被添加到世界作为一个铰链,地面是在调用LocalCreateRigidBody()时自动添加的,如下所示。

代码语言:javascript
复制
CollisionShape groundShape = new BoxShape(10, 1, 10);
CollisionObject ground = LocalCreateRigidBody(0, Matrix4.CreateTranslation(0, -1, 0), groundShape);
ground.UserObject = "Ground";

当门停在地面上时,我怎样才能阻止它旋转呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-04 19:43:56

您可以编写自己的LocalCreateRigidBody版本来设置碰撞遮罩。LocalCreateRigidBody是BulletSharp演示中的辅助函数,而不是Bullet中的内置函数。

以下是设置碰撞过滤器的一种方法:

代码语言:javascript
复制
const CollisionFilterGroups groundGroup = (CollisionFilterGroups)0x40000000;

var groundMask = CollisionFilterGroups.AllFilter ^ CollisionFilterGroups.StaticFilter;
World.AddRigidBody(ground, groundGroup, groundMask);

var doorMask = CollisionFilterGroups.AllFilter ^ groundGroup;
World.AddRigidBody(door, CollisionFilterGroups.DefaultFilter, doorMask);

解决这个问题的另一种方法是将门变短,这样它就不会离地面足够近,从而不会产生碰撞。然后渲染一个较大的图形对象来代替较小的物理对象。如果您使用的是BulletSharp演示框架,则必须修改该框架以支持此功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51682542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档