Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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
Babylonjs 如何将mesh.locallyTranslate Vector3运动转换为世界空间运动,为对象提供动量?_Babylonjs - Fatal编程技术网

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

Babylonjs 如何将mesh.locallyTranslate Vector3运动转换为世界空间运动,为对象提供动量?,babylonjs,Babylonjs,我设置了以下场景,可以使用以下键进行旋转: i=俯仰 k=向上俯仰 j=向左滚动 l=向右滚动 u=向左偏航 o=向右偏航 /=取消所有旋转 并使用以下键移动: q=向前移动 a=向后移动 左扫射 f=右扫射 e=向上移动 d=向下移动 \=取消所有移动 在指向的方向上移动网格效果很好,但我希望根据网格的旋转来启动运动,但随后继续在原始方向上移动,而不考虑在启动运动后网格旋转的变化(保持动量) 我通过一个具有x、y和z值的单独对象在每个方向上跟踪运动,这样每次按下运动键盘都只会修改该对象

我设置了以下场景,可以使用以下键进行旋转:

  • i=俯仰
  • k=向上俯仰
  • j=向左滚动
  • l=向右滚动
  • u=向左偏航
  • o=向右偏航
  • /=取消所有旋转
并使用以下键移动:

  • q=向前移动
  • a=向后移动
  • 左扫射
  • f=右扫射
  • e=向上移动
  • d=向下移动
  • \=取消所有移动
在指向的方向上移动网格效果很好,但我希望根据网格的旋转来启动运动,但随后继续在原始方向上移动,而不考虑在启动运动后网格旋转的变化(保持动量)

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

网格。局部平移(新巴比伦。矢量3(x,y,z))

旋转网格时,运动将随网格一起旋转。如何将网格旋转的方向性转换为可用于基于世界的平移的矢量3,以便网格的后续旋转不会影响其已具有的运动

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


提前感谢您的帮助。

通过Unity engine和三个.js解决方案的组合,我自己找到了一个解决类似问题的解决方案,然后浏览了Babylon.js github页面。为了修复它,我必须将全局跟踪的速度对象从基于按键的直接输入更改为计算的BABYLON。矢量3基于网格的世界矩阵和局部空间方向的归一化矢量3,我想移动网格,然后将其添加到用于跟踪动量的现有全局矢量3中(然后使用世界空间平移将其应用于网格

原件:

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);
现在“速度”物体保持动量,物体可以自由旋转,并根据其旋转和推力方向对“速度”物体进行附加更改

示例代码: