为什么raycaster.intersectObjects可以在场景中内置的Geometry中正常工作,但是对于模型加载的外部表现不好?

时间:2016-08-26 11:13:33

标签: javascript three.js

我想在three.js中制作一个测量工具,并使用reycaster函数来完成它。 当我在场景中使用Geometry时,它很好。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>ytest</title>
        <script src="JSandCSS/three.js"></script>
        <script src="JSandCSS/OrbitControls.js"></script>
        <script src="JSandCSS/OBJLoader.js"></script>
        <script src="JSandCSS/Raycaster.js"></script>
    </head>

    <body>
        <script>
            var scene = new THREE.Scene();
            var group = new THREE.Group;
            var mouse = new THREE.Vector2();
            var raycaster = new THREE.Raycaster();
            var objects = [];
            var particleMaterial;
            particlecount = 0;

            var container, stats, titleinfo;
            scene.add(group);

            var geometry = new THREE.SphereGeometry(5, 32, 32);
            geometry.scale(10, 10, 10);
            var material = new THREE.MeshBasicMaterial({
                color: 0xffff00
            });
            var sphere = new THREE.Mesh(geometry, material);
            group.add(sphere);
            objects.push(sphere);

            var light = new THREE.PointLight(0xffffff);
            light.position.set(300, 400, 200);
            light.intensity.set = 0.1;
            scene.add(light);
            scene.add(new THREE.AmbientLight(0x333333));


            var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(200, 200, 200);

            var renderer = new THREE.WebGLRenderer({
                antialias: true
            });
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);

            renderer.render(scene, camera);
            renderer.setClearColor(0x808080, 0.5); 

            render(); 

            var controls = new THREE.OrbitControls(camera);
            controls.addEventListener('change', render);

            animate(); 

            window.addEventListener('resize', handleWindowResize, false);
            window.addEventListener('mousedown', onDocumentMouseDown, false);


            function onDocumentMouseDown(event) {

                event.preventDefault();
                mouse.x = (event.clientX / renderer.domElement.clientWidth) * 2 - 1;
                mouse.y = -(event.clientY / renderer.domElement.clientHeight) * 2 + 1;

                raycaster.setFromCamera(mouse, camera);

                var intersects = raycaster.intersectObjects(objects);
                var PI2 = Math.PI * 2;
                var pointLoader = new THREE.TextureLoader();
                particleMaterial = new THREE.SpriteMaterial({
                    map: pointLoader.load("pic/measurepoint.png"),
                });

                if(intersects.length > 0) {
                    if(particlecount == 0) {
                        var particle1 = new THREE.Sprite(particleMaterial);
                        particle1.name = 'particle1';
                        particle1.position.copy(intersects[0].point);
                        particle1.scale.x = particle1.scale.y = 5;
                        scene.add(particle1);
                        particlecount = 1;
                    } else {
                        if(particlecount !== 2) {
                            var particle2 = new THREE.Sprite(particleMaterial);
                            particle2.name = 'particle2';
                            particle2.position.copy(intersects[0].point);
                            particle2.scale.x = particle2.scale.y = 5;
                            scene.add(particle2);
                            particlecount = 2;
                            a = scene.getObjectByName('particle1');
                            b = scene.getObjectByName('particle2');
                            var dis = a.position.distanceTo(b.position);
                            alert('distance between two point is' + dis);
                            scene.remove(a);
                            scene.remove(b);
                            particlecount = 0;
                        }
                    }
                }
            }

            function render() {



                renderer.render(scene, camera);
            } 

            function animate() {
                requestAnimationFrame(animate);
                render();
            } 

            function handleWindowResize() {
                HEIGHT = window.innerHeight;
                WIDTH = window.innerWidth;
                renderer.setSize(WIDTH, HEIGHT);
                camera.aspect = WIDTH / HEIGHT;
                camera.updateProjectionMatrix();
            } 
        </script>
    </body>

</html>

enter image description here 但是当我加载模型时,它不起作用。当你看到&#34; alert(intersects.length)&#34;的结果时。是0。

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>ytest</title>
        <script src="JSandCSS/three.js"></script>
        <script src="JSandCSS/OrbitControls.js"></script>
        <script src="JSandCSS/OBJLoader.js"></script>
        <script src="JSandCSS/Raycaster.js"></script>
    </head>

    <body>
        <script>
            var scene = new THREE.Scene();
            var group = new THREE.Group;
            var mouse = new THREE.Vector2();
            var raycaster = new THREE.Raycaster();
            var objects = [];
            var particleMaterial;
            particlecount = 0;


            var container, stats, titleinfo;
            scene.add(group);



            var textureLoader = new THREE.TextureLoader();
            var mat = new THREE.MeshLambertMaterial({
                map: textureLoader.load("model/earth/texture.jpg"),
                specularMap: textureLoader.load("model/earth/specular.jpg"),
                lightMap: textureLoader.load("model/earth/light.jpg")
            });

            var loader = new THREE.OBJLoader();
            loader.load('model/earth/earth.obj',
                function chuanzhi(obj) {
                    obj.traverse(function(child) {
                        if(child instanceof THREE.Mesh) {
                            child.material = mat;
                        }
                    });
                    Mesh = obj;
                    obj.scale.set(2, 2, 2);
                    group.add(obj);
                    objects.push(Mesh);
                });

            var light = new THREE.PointLight(0xffffff);
            light.position.set(300, 400, 200);
            light.intensity.set = 0.1;
            scene.add(light);
            scene.add(new THREE.AmbientLight(0x333333));


            var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(200, 200, 200);
            camera.lookAt(scene.position);

            var renderer = new THREE.WebGLRenderer({
                antialias: true
            });
            renderer.setSize(window.innerWidth, window.innerHeight);
            document.body.appendChild(renderer.domElement);

            renderer.render(scene, camera);
            renderer.setClearColor(0x808080, 0.5); 

            render(); 

            var controls = new THREE.OrbitControls(camera);
            controls.addEventListener('change', render);

            animate();

            window.addEventListener('resize', handleWindowResize, false); 
            window.addEventListener('mousedown', onDocumentMouseDown, false);


            function onDocumentMouseDown(event) {
                event.preventDefault();
                mouse.x = (event.clientX / renderer.domElement.clientWidth) * 2 - 1;
                mouse.y = -(event.clientY / renderer.domElement.clientHeight) * 2 + 1;

                raycaster.setFromCamera(mouse, camera);

                var intersects = raycaster.intersectObjects(objects);
                var PI2 = Math.PI * 2;
                var pointLoader = new THREE.TextureLoader();
                particleMaterial = new THREE.SpriteMaterial({
                    map: pointLoader.load("pic/measurepoint.png"),
                });
                alert(intersects.length);
                if(intersects.length > 0) {
                    if(particlecount == 0) {
                        var particle1 = new THREE.Sprite(particleMaterial);
                        particle1.name = 'particle1';
                        particle1.position.copy(intersects[0].point);
                        particle1.scale.x = particle1.scale.y = 5;
                        scene.add(particle1);
                        particlecount = 1;
                    } else {
                        if(particlecount !== 2) {
                            var particle2 = new THREE.Sprite(particleMaterial);
                            particle2.name = 'particle2';
                            particle2.position.copy(intersects[0].point);
                            particle2.scale.x = particle2.scale.y = 5;
                            scene.add(particle2);
                            particlecount = 2;
                            a = scene.getObjectByName('particle1');
                            b = scene.getObjectByName('particle2');
                            var dis = a.position.distanceTo(b.position);
                            alert('distance between two point is' + dis);
                            scene.remove(a);
                            scene.remove(b);
                            particlecount = 0;
                        }
                    }
                }
            } 

            function render() {
                renderer.render(scene, camera);
            } 

            function animate() {
                requestAnimationFrame(animate);
                render();
            } 

            function handleWindowResize() {
                HEIGHT = window.innerHeight;
                WIDTH = window.innerWidth;
                renderer.setSize(WIDTH, HEIGHT);
                camera.aspect = WIDTH / HEIGHT;
                camera.updateProjectionMatrix();
            } 
        </script>
    </body>
</html>

我想知道它为什么会发生,以及我如何正确使用它。你能帮助我吗?

0 个答案:

没有答案