Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 子弹物理,有纹理的球体不会滚动_Java_Libgdx_Bullet_Bulletphysics - Fatal编程技术网

Java 子弹物理,有纹理的球体不会滚动

Java 子弹物理,有纹理的球体不会滚动,java,libgdx,bullet,bulletphysics,Java,Libgdx,Bullet,Bulletphysics,我正试图通过一次过学习Java和bullet物理学来为自己的道路奋斗。很可能一次要做的事情太多了,但我喜欢挑战 到目前为止,我已经学习了如何导入g3db对象,对它们应用子弹物理,并通过使用以下代码在屏幕上与它们交互: assets = new AssetManager(); assets.load("globe.g3db", Model.class); assets.load("crate.g3db", Model.class); assets.finishLoading(); Model m

我正试图通过一次过学习Java和bullet物理学来为自己的道路奋斗。很可能一次要做的事情太多了,但我喜欢挑战

到目前为止,我已经学习了如何导入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);
这很好,如果我把它放在地上,它会掉下来,停在地上,但是当它移动时,它会滑动而不是滚动。
有一个简单的解决方法吗?

您还需要读取并设置旋转,现在您正在阅读\应用平移

创建一个新的四元数,获取xyzw值并将其应用于对象

类似这样的代码(c++代码,但在java中也可以轻松实现):


将myquat设置回对象。

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

方法

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));
执行模拟时不需要局部惯性,但如果没有局部惯性,则应用于物体的所有力都被视为中心力,因此不会影响角速度

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));