如何将mesh.locallyTranslate Vector3运动转换为世界空间运动以为对象提供动量?

时间:2017-11-01 08:48:10

标签: babylonjs

我有以下场景https://rawgit.com/bicarbon8/SpaceSim/MomentumProblem/babylon.html我已经设置了可以使用以下键旋转的功能:

  • i =俯仰
  • k =俯仰
  • j = roll left
  • l = roll right
  • u = yaw left
  • o = yaw right
  • / =取消全部轮换

并使用以下键移动:

  • q =前进
  • a =向后移动
  • s = strafe left
  • f = strafe right
  • e =向上移动
  • d =向下移动
  • \ =取消所有动作

可以正常工作,使网格朝向指向的方向移动,但我想基于网格的旋转启动运动,但是无论旋转的变化如何,都要继续沿原始方向移动启动运动后发生的网格(保持动量)。

我通过一个具有x,y和z值的单独对象跟踪每个方向的运动,这样每次按下键盘进行运动只会修改此对象,然后将该对象应用于每个循环的网格。动画周期,但因为我使用:

  

mesh.locallyTranslate(new BABYLON.Vector3(x,y,z))

当网格旋转时,运动随着网格旋转。如何将网格旋转的方向性转换为我可以与基于世界的平移一起使用的Vector3,以便网格的后续旋转不会影响它已经具有的运动?

注意:这应模拟微重力/无重力环境中的运动

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

通过结合使用Unity引擎和Three.js解决方案来解决类似类型的问题,然后搜索Babylon.js github页面,设法找到了我自己的解决方案。为了解决这个问题,我必须将基于按键的直接输入更改为全局跟踪的速度对象,基于网格的World Matrix计算BABYLON.Vector3,并将局部空间方向的标准化Vector3更改为我要移动的网格。然后添加到用于跟踪动量的现有全局Vector3中(然后使用世界空间翻译将其应用于网格。

原件:

var direction = new BABYLON.Vector3.Zero(); // global
...
// on keypress of 'q' key apply thrust along 'z' axis
if (map["q"]) { // forward thrust
  direction.z += 0.001;
};
...
// apply translation to mesh
mesh.locallyTranslate(new BABYLON.Vector3(x, y, z));

修正:

var velocity = new BABYLON.Vector3.Zero(); // global
...
// on keypress of 'q' key apply thrust along 'z' axis using mesh world matrix to convert to world space vector
if (map["q"]) { // forward thrust
  var matrix = mesh.getWorldMatrix();
  var vector = new BABYLON.Vector3.Zero();
  vector = BABYLON.Vector3.TransformNormal(new BABYLON.Vector3(0, 0, 1), matrix);
  velocity.addInPlace(vector);
};
...
// apply translation to mesh
mesh.translate(velocity, 0.001, BABYLON.Space.WORLD);

现在'速度'对象保持动量,物体可以自由旋转,并根据其旋转方向和推力方向对“速度”对象应用其他更改。

示例代码:https://rawgit.com/bicarbon8/SpaceSim/FixTranslationMomentum/babylon.html