首页 > 解决方案 > Raycaster 没有检测到threejs 中的整个几何图形

问题描述

function checkCollisiontofloor() {
     
    
        var cube = scene.getObjectByName('floor');
        var originPoint = cube.position.clone();

        for (var vertexIndex = 0; vertexIndex < cube.geometry.vertices.length; vertexIndex++) {
            var localVertex = cube.geometry.vertices[vertexIndex].clone();
            var globalVertex = localVertex.applyMatrix4(cube.matrix);
            var directionVector = globalVertex.sub(cube.position);

            var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize());
            var collisionResults = ray.intersectObjects(cubearr);
            if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
                   limit++;
                console.log(limit);
                collisionResults[0].object.visible = false;
                if (limit == num)
                    {
                        createCubes(num+=5);
                        level++;
                        var l = "level";
                        var final = (l + "  " + level);
                        console.log (final);
                        document.getElementById("Level").innerHTML = final;
                        speed+= 0.1;
                    }
            }
        
    }
    }

整个代码

<canvas id="scene"></canvas>
<script src="lib/three.min.js"></script>
<script src="lib/OrbitControls.js"></script>
<html>
    <style>
        #myText2
        {
            font-weight: bolder;
            font-size: 30px;
        }
        .buttons
        {
            position: fixed;
            top: 20px;
        }
    </style>
    <body>
        <div class="buttons">
            <label style="color:red;"><span id="myText2"></span></label>
            <h1>Score: <span id="myText"></span></h1>
            <h1> <span id="Level"></span></h1>
        </div>

<script>
    var ww = 1500,
    wh = 500;
    var scene;
    var k=0.02;
    var Up=60;
    var count=0;
    var flag = true;
    var speed=0.4;
    var cubearr = [];
    var num = 10;
     var max=48 , min=-48;       
    var limit = 0;
    var level = 1;
function init()                              
{
    renderer = new THREE.WebGLRenderer({antialias:true});
    renderer.setSize(ww, wh);
    renderer.setClearColor(0xFFFFFF, 1);
    document.body.appendChild(renderer.domElement);
    scene = new THREE.Scene();

    camera = new THREE.PerspectiveCamera(40, ww/wh,1,1000);
    camera.position.z =  100;
    camera.position.y = 5;    
    camera.name = 'cam';
    camera.lookAt(new THREE.Vector3(0,0,0));
    scene.add(camera);

    
    light = new THREE.PointLight( 0xFFFFFF, 1, 10000 );
    light.position.set( 0, 20, 50 );
    light.name = 'light';
    scene.add( light );  

    text();                               
    createCubes(num);
    window.addEventListener("keydown", moveSphere);
    dir();
    renderer.render(scene,camera);
};
function text()
{
    //THREE.ImageUtils.crossOrigin = '';
    elements = new THREE.Object3D();
    loader = new THREE.CubeTextureLoader();
    loader.setPath( 'C:/xampp/htdocs/graphics/' );

 

    // Create sphere
    sphereG =  new THREE.SphereGeometry(4, 100, 100, 0, Math.PI * 2, 0, Math.PI * 2);
             
    spherem = new THREE.MeshLambertMaterial({color: 0xff2255});

    texture2 = new THREE.TextureLoader().load('spheretex.jpg');
              
    material2 = new THREE.MeshBasicMaterial( { map: texture2 } );
    sphere = new THREE.Mesh(sphereG, material2);
           
    sphere.position.y = -13;

    sphere.name = 'sp';

    elements.add(sphere);

    //Create floor
    planeG = new THREE.BoxGeometry( 100, 5, 10 );
    material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
    texture1 = new THREE.TextureLoader().load('texturefloor.jpg');
    texture1.wrapS = THREE.RepeatWrapping;
    texture1.wrapT = THREE.RepeatWrapping;
    texture1.repeat.set( 100, 10 );
    material1 = new THREE.MeshBasicMaterial( { map: texture1 } );
    //texture msh shaghl fa hatet material bas msh material1 3ashn ahtulu color
    floor= new THREE.Mesh( planeG, material1 );
    floor.position.y = -20; 
    floor.name = ("floor");
    elements.add(floor);
    scene.add(elements);         
    //renderer.render(scene,camera);
            
}; 
function createCubes(x)
{
    document.getElementById("Level").innerHTML = "Level 1";
    geometry2 = new THREE.BoxGeometry(5,5,5);
    texture = new THREE.TextureLoader().load( '25649.jpg' );
    materialtex = new THREE.MeshBasicMaterial( { map: texture } );
   
    for (let i = 0; i < x; i++)   
    {
        cubearr[i] = new THREE.Mesh(geometry2, materialtex);
        cubearr[i].position.x =(Math.random() * (max - min)) + min;
        cubearr[i].position.y = Up;
        Up = Up+10;
        scene.add(cubearr[i]);
        
        //cubes.push(cubearr[i]);
        
    }
    renderer.render(scene,camera);
} 
function dir() 
{
    var s = scene.getObjectByName("sp");
    if (flag == false)
    {
        return;   
    }
    requestAnimationFrame(dir);
    sphere.position.y +=speed;
    camera.position.y +=speed; 
    floor.position.y+=speed;
    checkCollisiontosphere();
    checkCollisiontofloor();
    renderer.render(scene, camera);
}
function moveSphere(e)                 
{
    moveDistance = 0.30;
    sp = scene.getObjectByName('sp');
    cam = scene.getObjectByName('cam');
    light = scene.getObjectByName('light');
    if (e.keyCode == '39') 
    {
        if(sp.position.x < 48)
        {
            sp.rotation.z -= moveDistance;
            sp.position.x += 3;
            sp.rotation.x += 3;
            light.position.x += 3;
            count++;
            document.getElementById("myText").innerHTML = count;
        }
    } 
    else if (e.keyCode == '37')   
    {
        if(sp.position.x > -48)   
        {
            sp.rotation.z += moveDistance;
            sp.position.x-= 3;
            sp.rotation.x -= 3;
            light.position.x -= 3;
            count++;
            document.getElementById("myText").innerHTML = count;
        }
    }
    else if(e.keyCode == '27')
    {
        if (flag)
        {
            flag = false;
        }
        else
        {
            flag = true;
            dir();
        }
    }     
};
window.addEventListener("keydown", moveSphere);

function checkCollisiontosphere() {

    
        var cube = scene.getObjectByName('sp');
        var originPoint = cube.position.clone();

        for (var vertexIndex = 0; vertexIndex < cube.geometry.vertices.length; vertexIndex++) {
            var localVertex = cube.geometry.vertices[vertexIndex].clone();
            var globalVertex = localVertex.applyMatrix4(cube.matrix);
            var directionVector = globalVertex.sub(cube.position);

            var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize());
            var collisionResults = ray.intersectObjects(cubearr);
            if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
    document.getElementById("myText2").innerHTML = "GAME OVER";
            flag=false            }
        
    }
}

    function checkCollisiontofloor() {
     
    
        var cube = scene.getObjectByName('floor');
        var originPoint = cube.position.clone();

        for (var vertexIndex = 0; vertexIndex < cube.geometry.vertices.length; vertexIndex++) {
            var localVertex = cube.geometry.vertices[vertexIndex].clone();
            var globalVertex = localVertex.applyMatrix4(cube.matrix);
            var directionVector = globalVertex.sub(cube.position);

            var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize());
            var collisionResults = ray.intersectObjects(cubearr);
            if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
                   limit++;
                console.log(limit);
                collisionResults[0].object.visible = false;
                if (limit == num)
                    {
                        createCubes(num+=5);
                        level++;
                        var l = "level";
                        var final = (l + "  " + level);
                        console.log (final);
                        document.getElementById("Level").innerHTML = final;
                        speed+= 0.1;
                    }
            }
        
    }
    }

    


             
function levels()
 {
     if(count == 30)
     {
        document.getElementById("Level").innerHTML = "Level 2";
        speed=0.6;
     }
     if(count == 60)
     {
        document.getElementById("Level").innerHTML = "Level 3";
        speed=0.8;
     }
     if(count == 90)
     {
        document.getElementById("Level").innerHTML = "Level 4";
        speed=1;
     }
}  
init();
</script>
</body>
</html>

标签: javascriptthree.js

解决方案


推荐阅读