组合纹理区域的旋转原点?

时间:2014-09-09 21:53:04

标签: java libgdx box2d

我正在为"坦克"寻找数学解决方案。问题: 我有一个由坦克车身和大炮组成的坦克:

罐: 宽5.795米(87 px @ 720p-Resolution = 15 px / mtr) 3.8米高(57 px @ 720p-Resolution = 15 px / mtr)

炮: 6.8米宽(102 px @ 720p-Resolution = 15 px / mtr) 高度2.063米(31 px @ 720p-Resolution = 15 px / mtr)......(box2d灯具高度仅为0.4f)

每个都是一个带有box2d主体的独立对象。坦克具有旋转,并且加农炮也具有单独的旋转。 box2d的两个实体都用一个联合绑定在一起:

RevoluteJointDef jointDef = new RevoluteJointDef();
jointDef.bodyA = getBody();             // the tank-body
jointDef.bodyB = cannon.getBody();
jointDef.localAnchorB.x = -getWidth() / 3.9f;       // not sure what i am doing here !?
joint = (RevoluteJoint) map.box2dworld.createJoint(jointDef);

我正在绘制两个纹理区域,它们的旋转在彼此的顶部,用于坦克车身和坦克炮。但是大炮的起源并不是那个纹理区域的中心。让我们说坦克的起源是坦克身体纹理区域的中心。并且坦克炮的旋转原点应该恰好位于坦克体的原点。但是这个大炮的起源转移到了一边(见截图)

RENDERING

batch.draw(tankTextureRegion, 
tank.getPosition().x - tank.getWidth() * 0.5f, 
tank.getPosition().y - tank.getHeight() * 0.5f,
tank.getWidth() * 0.5f, tank.getHeight() * 0.5f,
tank.getWidth(), tank.getHeight(), 1, 1, 
tank.getAngleInDegress());

batch.draw(cannonTextureRegion, 
tank.getPosition().x - tank.getWidth() * 0.5f + 1f,     // +1f is sort of a tweaking / Workaround
tank.getPosition().y - tank.getHeight() * 0.5f + 1f,    // +1f is sort of a tweaking / Workaround
2.0f, 1.0f, 6.8f, 2.063f, 1, 1,             // 2.0f, 1.0f .... not quite sure here!
tank.cannon.getOwnAngle() * MathUtils.radiansToDegrees);

=>问题是,当我旋转加农炮或坦克时,加农炮仍在转移。 所以我猜有一些关于大炮起源不正确的值。

任何帮助都非常感谢!!

再见 菲尔

p.s。:我搜索了很多,但没有找到解决方案,虽然有一些类似的topcis

http://imgur.com/1iQHE9C

1 个答案:

答案 0 :(得分:0)

我不得不把大炮的(tank.width / 2) - offset.x作为加农炮的起源。现在看起来效果很好。

        batch.draw(cannonTextureRegion, 
                tank.getPosition().x - tank.getWidth() * 0.5f + 1f, 
                tank.getPosition().y - tank.getHeight() * 0.5f + 0.8667f,
                tank.getWidth() * 0.5f - 1f,                        // origin.x
                tank.getHeight() * 0.5f - 0.8667f,                  // origin.y
                6.8f, 2.06667f, 1, 1,                               // size & scale
                tank.cannon.getOwnAngle() * MathUtils.radiansToDegrees);