子弹物理,纹理球体不滚动

Posted

技术标签:

【中文标题】子弹物理,纹理球体不滚动【英文标题】:Bullet physics, textured sphere doesnt roll 【发布时间】:2014-08-18 20:49:56 【问题描述】:

我正在努力一口气学习 Java 和子弹物理。一次做所有事情可能有点太多了,但我喜欢挑战。

到目前为止,我已经学会了如何导入 g3db 对象,将子弹物理应用到它们,并使用以下代码在屏幕上与它们交互:

assets = new AssetManager();
assets.load("globe.g3db", Model.class);
assets.load("crate.g3db", Model.class);
assets.finishLoading();

Model model = assets.get("globe.g3db", Model.class);
ModelInstance inst = new ModelInstance(model);
inst.transform.trn(0, 20, 0);

btRigidBody body;
btSphereShape sh = new btSphereShape(1);
sh.calculateLocalInertia(1, new Vector3(0,0,0));

body = new btRigidBody(new btRigidBody.btRigidBodyConstructionInfo(3, new btDefaultMotionState(inst.transform), sh));
body.setUserValue(Minstances.size);
body.proceedToTransform(inst.transform);

motionState = new MyMotionState();
motionState.transform = inst.transform;
body.setMotionState(motionState);

dynamicsWorld.addRigidBody(body );
Minstances.add(inst);

这很好用,如果我将它设置在地面上方,它会掉落并停在地面上,但是当它四处移动时,它会滑动而不是滚动。 有简单的解决方法吗?

【问题讨论】:

xoppa.github.io/blog/… 【参考方案1】:

您还需要读出并设置旋转,现在您只是在阅读\应用翻译。

创建一个新的四元数并获取 xyzw 值并将它们应用于您的对象。

类似这样的东西(c++ 代码,但你可以在 java 中轻松地做同样的事情):

btTransform trans;
Quat myquat;
yourBulletDynamicObject->getMotionState()->getWorldTransform(trans);

btQuaternion rot = trans.getRotation();
myquat.w = rot.w();
myquat.x = rot.x();
myquat.y = rot.z();
myquat.z = rot.y();

将 myquat 重新设置在您的对象上。

【讨论】:

【参考方案2】:

要允许物理体滚动,您需要计算其局部惯性并将其提供给构造信息。在您的代码中,您几乎做对了。

方法

btCollisionShape.calculateLocalInertia(float mass, Vector3 inertia)

确实计算了局部惯性,但将其存储在第二个参数“Vector3惯性”中。不会对 btCollisionShape 本身应用任何更改。

得到惯性向量后需要传递给

btRigidBodyConstructionInfo(float mass, btMotionState motionState, btCollisionShape collisionShape, Vector3 localInertia)

作为最后一个参数。

正确的代码应该是这样的:

btRigidBody body;
btSphereShape sh = new btSphereShape(1);
Vector3 inertia = new Vector3(0,0,0);
sh.calculateLocalInertia(1, inertia);

body = new btRigidBody(new btRigidBody.btRigidBodyConstructionInfo(3, new btDefaultMotionState(inst.transform), sh, inertia));

执行模拟不需要局部惯性,但如果没有它,所有施加在物体上的力都被视为中心力,因此不会影响角速度。

【讨论】:

以上是关于子弹物理,纹理球体不滚动的主要内容,如果未能解决你的问题,请参考以下文章

使用立方体贴图(不是反射贴图)对球体进行纹理处理

C++ openGl 纹理将图像映射到球体上

如何为这个球体添加纹理?

球体在使用纹理渲染时显示多边形

如何纹理球体的不规则平面?

在 OpenGL 中将纹理映射到球体时出现接缝问题