【问题标题】:Box2d Arrow Transformation - JavaBox2d 箭头变换 - Java
【发布时间】:2014-06-28 22:28:12
【问题描述】:

我正在使用 Box2d 支持的 LibGdx 制作弓箭手游戏。许多 Box2D 教程都是用 C++ 编写的,所以有些方法与 Java 不同。

我想做的是当它与一个盒子碰撞时粘住箭头。我找到了一个教程,但它是用 C++ 编写的,我找不到解决问题的方法。其实这是一道数学题。这是C++代码

//start with standard positions as for normal arrow creation
  b2Vec2 vertices[4];
  vertices[0].Set( -1.4f,     0 );
  vertices[1].Set(     0, -0.1f );
  vertices[2].Set(  0.6f,     0 );
  vertices[3].Set(     0,  0.1f );

  //now multiply by difference between arrow and target transforms
  b2Transform diffTransform = b2MulT( si.targetBody->GetTransform(), si.arrowBody->GetTransform() );
  for (int i = 0; i < 4; i++)
      vertices[i] = b2Mul(diffTransform, vertices[i]);

  b2PolygonShape polygonShape;
  polygonShape.Set(vertices, 4);

  //create a new fixture in the target body
  b2FixtureDef fixtureDef;
  fixtureDef.shape = &polygonShape;
  fixtureDef.density = 1;
  si.targetBody->CreateFixture( &fixtureDef );

  //discard the original arrow body
  m_world->DestroyBody( si.arrowBody );

目标是当箭头与盒子碰撞时,创建一个新的箭头夹具将其添加到盒子的主体,然后删除旧的箭头主体。除了箭头的变换外,所有的都完成了。

问题是Java 中没有b2MulT 或b2Mul 函数。发生碰撞时,我想用旧箭头值的位置和角度来变换箭头。

【问题讨论】:

  • 我不知道你正在尝试什么的细节,但我怀疑 C++ 中的代码是错误的。数学看起来不对。应该是target^(-1) * arrow。因此,您应该反转而不是转置,以获得“差异”。但正如我所说,我不知道你在做什么。在 Box2D 代码中,这将是:b2Mul(si.targetBody-&gt;GetTransform()-&gt;Invert(), si.arrowBody-&gt;GetTransform()).

标签: java libgdx box2d


【解决方案1】:

我不熟悉box2d,但考虑到您的程序逻辑和一点点searchb2MulT(x,y) 似乎是矩阵 x 转置 与矩阵 y 的矩阵乘法。

xT * y

如果 Java 没有为您提供 box2d 的精确实现,请使用矩阵转置乘法搜索矩阵类的有效 Java 实现。

这应该可以解决问题。

顺便说一句,您是否检查了 box2d 的 java 端口 - http://www.jbox2d.org/ 我认为它应该实现矩阵类——因为矩阵乘法是所有转换的基础。

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多