Javascript Three.js boids-通过改变相机位置改进鼠标检测

Javascript Three.js boids-通过改变相机位置改进鼠标检测,javascript,canvas,three.js,raytracing,mouse-picking,Javascript,Canvas,Three.js,Raytracing,Mouse Picking,我已经使用了三个boids/flocks.js示例一段时间了,但是一个和一个都有一个缺陷:鼠标悬停事件(它“干扰”鸟类并触发排斥)仅在camera.position={x:0,y:0,:whatever}时有效 在画布示例中,我试图通过编辑此部分来改进这一点(我的眼睛更容易看到): function onDocumentMouseMove( event ) { var vector = new THREE.Vector3( event.clientX - SCREEN_WIDTH_HAL

我已经使用了三个boids/flocks.js示例一段时间了,但是一个和一个都有一个缺陷:鼠标悬停事件(它“干扰”鸟类并触发排斥)仅在camera.position={x:0,y:0,:whatever}时有效

在画布示例中,我试图通过编辑此部分来改进这一点(我的眼睛更容易看到):

function onDocumentMouseMove( event ) {
    var vector = new THREE.Vector3( event.clientX - SCREEN_WIDTH_HALF, - event.clientY + SCREEN_HEIGHT_HALF, 0 );
    for ( var i = 0, il = boids.length; i < il; i++ ) {
        boid = boids[ i ];
        vector.z = boid.position.z;
        boid.repulse( vector );
    }
}
函数onDocumentMouseMove(事件){
var vector=new THREE.Vector3(event.clientX-屏幕宽度对半,-event.clientY+屏幕高度对半,0);
对于(var i=0,il=boids.length;i
试着像这样:

function onDocumentMouseMove( event ) {
    var vector = new THREE.Vector3();
    vector.x = event.clientX;
    vector.y = - event.clientY;
    vector.unproject(camera);
    for ( var i = 0, il = boids.length; i < il; i++ ) {
        boid = boids[ i ];
        vector.z = boid.position.z;
        boid.repulse( vector );
    }
}
函数onDocumentMouseMove(事件){
var vector=new THREE.Vector3();
vector.x=event.clientX;
vector.y=-event.clientY;
矢量。取消投影(摄像机);
对于(var i=0,il=boids.length;i
但这不起作用,未投影的向量只能与光线投射器一起使用,以查找与其路径相交的对象。在我们的例子中,排斥效应必须在150距离处起作用,根据boid.pushle:

this.repulse = function ( target ) {
    var distance = this.position.distanceTo( target );
    if ( distance < 150 ) {
        var steer = new THREE.Vector3();
        steer.subVectors( this.position, target );
        steer.multiplyScalar( 0.5 / distance );
        _acceleration.add( steer );
    }
}
this.shuffer=函数(目标){
var距离=此.position.distanceTo(目标);
如果(距离<150){
var steer=new THREE.Vector3();
转向子向量(此位置、目标);
转向倍率标度(0.5/距离);
_加速。添加(转向);
}
}
所以我被卡住了。我是否应该找到一种方法来拓宽光线投射器,使其像一个150宽的圆柱体,以便鼠标拾取?或者有没有办法取消矢量投影,然后将其重新投影到离鸟最近的平面上,以便计算距离?(但200多只鸟的性能如何?)

如果解决方案只能来自着色器,请随时告诉我创建另一个主题

包括:画布示例的一部分,带有稍微移动的摄影机