Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
Three.js ThreeJS:获取不旋转的对象位置向量_Three.js - Fatal编程技术网

Three.js ThreeJS:获取不旋转的对象位置向量

Three.js ThreeJS:获取不旋转的对象位置向量,three.js,Three.js,所以,我对这个问题视而不见,解决方法可能非常简单。我就是看不见 tl;dr:我需要知道Object3D实例在哪个轴上移动,完全不考虑方向 // Init code. let last_position = new THREE.Vector3(0, 0, 0); // Update code (called every frame) if (object.position.distanceTo(last_position) > 0) { // The object has move

所以,我对这个问题视而不见,解决方法可能非常简单。我就是看不见

tl;dr:我需要知道Object3D实例在哪个轴上移动,完全不考虑方向

// Init code.
let last_position = new THREE.Vector3(0, 0, 0);

// Update code (called every frame)
if (object.position.distanceTo(last_position) > 0) {
    // The object has moved.
    let delta = object.position.clone().sub(last_position);

    // ... what do I do now?
    // - The object can rotate around its Y-axis. (looking around)
    // - I'm trying to "remove" the rotation from the delta vector.

    // Desired result:
    if (delta.z > 0) // Object moved forward!
    if (delta.z < 0) // Object moved backward!
    if (delta.x > 0) // Object moved right
    if (delta.x < 0) // Object moved left
}
last_position = object.position.clone();
//初始化代码。
设最后一个位置=新的三个向量3(0,0,0);
//更新代码(每帧调用一次)
如果(对象位置距离到(最后位置)>0){
//物体移动了。
设delta=object.position.clone().sub(最后一个位置);
//…我现在该怎么办?
//-对象可以绕其Y轴旋转。(环视)
//-我正试图从增量向量中“移除”旋转。
//预期结果:
如果(delta.z>0)//对象向前移动!
if(delta.z<0)//对象向后移动!
如果(delta.x>0)//对象向右移动
if(delta.x<0)//对象向左移动
}
last_position=object.position.clone();
基本上,我所要做的就是有效地从delta向量中“移除”旋转。这基本上就是Object3D.translateX/Y/Z函数的工作方式,但是我没有更新对象,而是尝试读取这些值


提前谢谢

我打赌你要找的是

此函数将为您提供对象的世界位置,而不考虑其旋转以及其父对象的旋转


我可以想出几种方法,下面是其中之一:

  • 使用
    scene.autoUpdate=false禁用自动场景图更新
  • 在渲染循环中:
  • 更新对象的位置
  • 使用
    scene.updateMatrix()更新场景图
  • 使用以下函数计算增量位置
  • 用三角洲做点什么
以下是
computeDelta
的代码:

function computeDelta(obj) {
    if (!obj.userData.lastPosition) {
        obj.userData.lastPosition = new THREE.Vector3();
        obj.getWorldPosition(obj.userData.lastPosition);
    }
    if (!obj.userData.delta) {
        obj.userData.delta = new THREE.Vector3();
    }
    obj.userData.delta.copy(obj.userData.lastPosition);
    obj.getWorldPosition(obj.userData.lastPosition);
    return obj.userData.delta.sub(obj.userData.lastPosition).negate();
}
请注意,每个对象的计算都保存在
userData
中。每帧调用
THREE.Vector3.clone()
是一件坏事,因为它将创建一个新的向量

检查



当您必须计算多个对象的增量时,此函数并不十分方便。在这种情况下,在
obj.onBeforeRender
中计算增量更合适。

您需要将增量向量的基础从世界空间更改为对象空间(局部空间)

THREE.Object3D.matrixWorld
表示从对象空间到世界空间的转换,它是在每次更新场景图时计算的

要获得从世界空间到对象空间的转换,您需要

在您的例子中,我们只对旋转/缩放感兴趣,它是
矩阵世界
的左上角3x3矩阵

所以我会一步一步地做这样的事情:

// compute delta ...

// transform delta in local space
var localToWorld = obj.matrixWorld;
var localToWorldRot = new THREE.Matrix3().setFromMatrix4(localToWorld);
var invLocalToWorldRot = new THREE.Matrix3().getInverse(localToWorldRot);
delta.applyMatrix3(invLocalToWorldRot);
检查。(使用WASDQE键)


如果你的想法是用它来检查玩家如何在网络游戏中移动,以便你可以播放适当的动画,那么我认为这是错误的做法,原因如下:

  • 这是计算密集型的
  • 这不依赖于基于播放器的显式操作(您可能会导致角色随机扫射,因为某些数据包丢失或延迟)

相反,您应该考虑发送用于扫瞄/旋转的操作码,并使用某种运动预测,这样客户端可以看到单元平滑地移动。


你可能会想的。

好吧,我可能没有领会你的意思。但我想我知道你想要什么。您想知道对象是否在其局部空间=相对于其当前旋转向后移动。让我知道我会写一个新的答案。我很抱歉,但这确实是我想要的:D更准确。我在写一个第三人称游戏。我需要知道玩家是左/右扫射还是向前/向后移动等,这样我才能在玩家模型上播放正确的动画。这就是我所说的从方程中“去掉”旋转的意思。我想我还不够清楚。很抱歉。这是由player.rotation.y.转换的player.position向量。准确地说:我需要一种方法来确定一个玩家是左/右扫射,向前还是向后移动,完全基于位置增量和旋转。我目前有一个解决办法,可以触发基于键盘输入处理动画的代码,但当我开始使用多人游戏功能时,这当然永远不会起作用。是的!如果我能给你一千张选票,我会做的。这正是我想要的!非常感谢你!!!很高兴这有帮助。:-)