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 如何找到方向_Three.js - Fatal编程技术网

Three.js 如何找到方向

Three.js 如何找到方向,three.js,Three.js,我试图找到与墙碰撞的方向,使用光线投射器光线为玩家确定与墙的碰撞。 我的播放器是由WASD按钮控制的,改变Y轴的方向,我找到了一个碰撞的例子,但是只有X轴和Z轴 /**player move**/ if(kerk.controller.moveRight && this.moveX) this.player.translateX( moveDistance2 ); if(kerk.controller.moveLeft && th

我试图找到与墙碰撞的方向,使用光线投射器光线为玩家确定与墙的碰撞。 我的播放器是由WASD按钮控制的,改变Y轴的方向,我找到了一个碰撞的例子,但是只有X轴和Z轴

/**player move**/
        if(kerk.controller.moveRight && this.moveX) this.player.translateX(  moveDistance2 );
        if(kerk.controller.moveLeft && this.moveX) this.player.translateX(  -moveDistance2 );
        if(kerk.controller.moveUp && this.moveZ) this.player.translateZ( -moveDistance );
        if(kerk.controller.moveBottom && this.moveZ) this.player.translateZ( moveDistance2 );

....

/**rotation player**/
this.player.rotation.y += mouse.x > scCenter ? -this.camRot : this.camRot;


....

this.rays = [
        new THREE.Vector3(0, 0, 1),
        new THREE.Vector3(1, 0, 1),
        new THREE.Vector3(1, 0, 0),
        new THREE.Vector3(1, 0, -1),
        new THREE.Vector3(0, 0, -1),
        new THREE.Vector3(-1, 0, -1),
        new THREE.Vector3(-1, 0, 0),
        new THREE.Vector3(-1, 0, 1)
];
this.caster = new THREE.Raycaster();

.....

for (i = 0; i < this.rays.length; i += 1) {
/**玩家移动**/
if(kerk.controller.moveRight&&this.moveX)this.player.translateX(movedistance 2);
if(kerk.controller.moveLeft&&this.moveX)this.player.translateX(-movedistance 2);
if(kerk.controller.moveUp&&this.moveZ)this.player.translateZ(-moveDistance);
如果(kerk.controller.moveBottom&&this.moveZ)this.player.translateZ(movedistance 2);
....
/**轮换球员**/
这个.player.rotation.y+=mouse.x>scCenter-这个。卡姆洛特:这个。卡姆洛特;
....
这条线=[
新的三个向量3(0,0,1),
新的三矢量3(1,0,1),
新的三个矢量3(1,0,0),
新的三矢量3(1,0,-1),
新的三矢量3(0,0,-1),
新的三矢量3(-1,0,-1),
新的三矢量3(-1,0,0),
新的三个向量3(-1,0,1)
];
this.caster=新的三个.Raycaster();
.....
对于(i=0;i
但是玩家改变了Y轴的方向

如何找到光线投射器8条边的方向

        this.caster.set(this.player.position, this.rays[i]);

        collisions = this.caster.intersectObjects(obstacles);

        if (collisions.length > 0 && collisions[0].distance <= distance) {

            if ((i === 0 || i === 1 || i === 7) && kerk.controller.moveUp === 1) {
                this.moveZ = 0;
            } else if ((i === 3 || i === 4 || i === 5) && kerk.controller.moveBottom === -1) {
                this.moveZ = 0;
            }
            if ((i === 1 || i === 2 || i === 3) && kerk.controller.moveRight === 1) {
                this.moveX = 0;
            } else if ((i === 5 || i === 6 || i === 7) && kerk.controller.moveLeft === -1) {
                this.moveX = 0;
            }
        }
    }
this.caster.set(this.player.position,this.rays[i]);
碰撞=此.caster.intersect对象(障碍物);

如果(collisions.length>0&&collisions[0].distance我不确定这是否有帮助,但只是为了防止小的数学刷新:

要计算方向,你需要两个点(与维数无关),例如p1和p2。结果创建了一个向量v1,这是一个向量,而不是一个方向。要将其转换为方向,你只需要对其进行规格化

在three.js中,您可以这样做:

var p1 = new THREE.Vector3(x1, y1, z1);
var p2 = new THREE.Vector3(x2, y2, z2);
var v = new THREE.Vector3();

v.subVectors(p2, p1);
v.normalize();