Three.js,获取PointerLockControls面向的Vector3

3

想知道是否有可能获取指针锁定控制中的偏航对象面对的方向,并将其用作射线投射器的方向。我一直在玩弄代码,试图为其添加一些基本的射手游戏内容。我已经尝试了一些在堆栈溢出上找到的关于从指针控制提供的偏航对象的X和Y值尝试的方法,但没有成功。以下是我目前的代码:

setupTarget: function() {
  //var vector = new THREE.Vector3(game.mouse.x, game.mouse.y, 0);
  var yaw = game.controls.getObject();
  var pitch = game.controls.pitchObject;
  var vector = new THREE.Vector3(
    yaw.position.x * Math.cos(pitch.rotation.x),
    yaw.position.y * Math.sin(yaw.rotation.y),
    0
  );
  var dir = vector.sub(yaw.position).normalize();
  this.ray = new THREE.Raycaster(yaw.position.clone(), dir);
}

除了它不起作用之外,我知道这是错误的。我混淆了一些数学,用于基于旋转计算x和y平移,但显然这对目标没有用。


我认为你可以只需执行 new THREE.Raycaster(this.position, this.rotation) 来获取一个射向物体所望方向的光线。 - IceCreamYou
我确实尝试过,但是没有运行成功 :( - agmcleod
你的问题是:“在使用PointerLockControls时,如何获取相机的朝向?” - WestLangley
好的。请提供您需要翻译的具体内容。 - WestLangley
2个回答

5
将以下内容添加到您的 PointerLockControls 副本中(或等待几天进行下一次发布):
this.getDirection = function() {

    // assumes the camera itself is not rotated

    var direction = new THREE.Vector3( 0, 0, -1 );
    var rotation = new THREE.Euler( 0, 0, 0, "YXZ" );

    return function( v ) {

        rotation.set( pitchObject.rotation.x, yawObject.rotation.y, 0 );

        v.copy( direction ).applyEuler( rotation );

        return v;

    }

}();

three.js r.59


非常感谢。我没有传入向量,而是将v设置为:var v = yawObject.position.clone(); - agmcleod
2
不要在紧密循环中使用clone()new--重复使用v - WestLangley

2

新版本不起作用了,我必须添加

var v = new THREE.Vector3( 0, 0, -1 );

之前

v.copy( direction ).applyEuler( rotation );

因为 Firefox 不识别 v。


在three.js r.62中实现的函数应该在Firefox和任何其他浏览器中正常工作。如果您遇到问题,您需要发布一个新帖子。 - WestLangley
我最终以稍微不同的方式完成了它(违背了West的坚定建议)https://github.com/agmcleod/7dfps2013/blob/master/js/pointer_lock_controls.js#L119。但总的来说,你想做的是将向量对象传递给getDirection函数调用。 - agmcleod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接