THREE.raycaster:可以将它用于敌人艾?

时间:2013-09-04 21:14:21

标签: three.js

我刚刚开始学习三个并且一直在搞乱可控MD2角色的三个例子,试图把它变成第三人称射击游戏。我一直在尝试为敌人角色编写一个简单的算法,我很确定射线投射是理想的。整个想法是,一旦他们面对玩家,敌人应该停止旋转。但这就是给我不眠之夜的问题! :

让我们说,敌人物体是射线施法者射线的原点。无论我为该射线的方向设置什么方向(例如,(1,0,0) - 正x轴),射线的方向总是指向场景的中心!

请帮忙!我无法在网上找到任何这种用于射线施法者的例子(除了目前我真正不需要的碰撞检测)。

1 个答案:

答案 0 :(得分:1)

如果您只想让敌人在观看玩家时停止旋转,我会考虑只检查它们之间的方向,因为它比投射光线要快得多,看它是否相交:

// Assuming `enemy` is a THREE.Mesh
var targetDir = enemy.position.clone().sub(player.position).normalize();
var currentDir = (new THREE.Vector3()).applyMatrix4(enemy.matrixWorld).sub(enemy.position).normalize();
var amountToRotate = currentDir.sub(targetDir);
var offset = amountToRotate.length();

如果amountToRotate大于某个阈值,则在offset中旋转每个轴的值不超过该轴的值。

那就是说,鉴于以上变量,这里是你如何使用雷卡斯特:

var raycaster = new THREE.Raycaster(enemy.position, targetDir);
var intersections = raycaster.intersectObject(player);

请注意,如果您在动画循环中运行上述任何代码,它将创建大量垃圾收集流失,因为您不断创建一堆新对象,然后立即丢弃它们。在库本身中经常使用的更好的模式是初始化对象一次,如果需要则将值复制到它们,然后使用这些副本进行计算。例如,您可以创建一个函数来为您执行光线投射:

var isEnemyLookingAtPlayer = (function() {
  var raycaster = new THREE.Raycaster();
  var pos = new THREE.Vector3();
  return function(enemy) {
    raycaster.ray.origin.copy(enemy.position);
    raycaster.ray.direction.copy(pos.copy(enemy.position).sub(player.position).normalize());
    return !!raycaster.intersectObject(player).length;
  };
})();