为什么找到交叉点不适用于THREE.UTF8Loader?

时间:2013-08-04 16:59:02

标签: three.js

我克隆https://github.com/mrdoob/three.js.git,我对示例webgl_loader_utf8.html进行了2次更改

  1. 添加CubeGeometry
  2. 支持查找十字路口
  3. 当我点击立方体时可以找到交叉点,但点击了utf8模型(例如,本或手模型)找不到交叉点。有关于此的任何想法?非常感谢!

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <title>three.js webgl - io - UTF8 loader</title>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
            <style>
                body {
                    font-family: Monospace;
                    background-color: #000;
                    color: #fff;
                    margin: 0px;
                    overflow: hidden;
                }
                #info {
                    color: #fff;
                    position: absolute;
                    top: 10px;
                    width: 100%;
                    text-align: center;
                    z-index: 100;
                    display:block;
                }
                #info a, .button { color: #f00; font-weight: bold; text-decoration: underline; cursor: pointer }
            </style>
        </head>
    
        <body>
            <div id="info">
            <a href="http://threejs.org" target="_blank">three.js</a> -
            <a href="http://code.google.com/p/webgl-loader/" target="_blank">UTF8 format</a> loader test -
            models from <a href="http://www.sci.utah.edu/~wald/animrep/" target="_blank">The Utah 3D Animation Repository</a>
            <div id="show"></div>
            </div>
    
            <script src="../build/three.min.js"></script>
    
            <script src="js/loaders/UTF8Loader.js"></script>
            <script src="js/loaders/MTLLoader.js"></script>
    
            <script src="js/Detector.js"></script>
            <script src="js/libs/stats.min.js"></script>
    
            <script src="js/libs/tween.min.js"></script>
    
            <script>
    
                var SCREEN_WIDTH = window.innerWidth;
                var SCREEN_HEIGHT = window.innerHeight;
    
                var FLOOR = -150;
    
                var container, stats;
    
                var camera, scene, renderer;
    
                var projector, raycaster;
                var mouse = new THREE.Vector2();
    
                var mesh, zmesh, geometry;
    
                var mouseX = 0, mouseY = 0;
    
                var windowHalfX = window.innerWidth / 2;
                var windowHalfY = window.innerHeight / 2;
    
                document.addEventListener('mousemove', onDocumentMouseMove, false);
                document.addEventListener( 'mousedown', onDocumentMouseDown, false );
    
                var show = document.getElementById("show");
    
                init();
                animate();
    
    
                function init() {
    
                    container = document.createElement( 'div' );
                    document.body.appendChild( container );
    
                    camera = new THREE.PerspectiveCamera( 20, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 2000 );
                    camera.position.z = 800;
    
                    scene = new THREE.Scene();
                    scene.fog = new THREE.Fog( 0x000000, 800, 2000 );
    
                    var path = "textures/cube/SwedishRoyalCastle/";
                    var format = '.jpg';
                    var urls = [
                        path + 'px' + format, path + 'nx' + format,
                        path + 'py' + format, path + 'ny' + format,
                        path + 'pz' + format, path + 'nz' + format
                    ];
    
                    reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
    
                    // LIGHTS
    
                    var ambient = new THREE.AmbientLight( 0x222222 );
                    scene.add( ambient );
    
                    var directionalLight = new THREE.DirectionalLight( 0xffffff, 1.1 );
                    directionalLight.position.set( 0, 20, 300 );
                    scene.add( directionalLight );
    
                    directionalLight.castShadow = true;
                    //directionalLight.shadowCameraVisible = true;
    
                    directionalLight.shadowMapWidth = 2048;
                    directionalLight.shadowMaHeight = 2048;
    
                    var d = 150;
    
                    directionalLight.shadowCameraLeft = -d * 1.2;
                    directionalLight.shadowCameraRight = d * 1.2;
                    directionalLight.shadowCameraTop = d;
                    directionalLight.shadowCameraBottom = -d;
    
                    directionalLight.shadowCameraNear = 200;
                    directionalLight.shadowCameraFar = 500;
    
    
                    // RENDERER
    
                    renderer = new THREE.WebGLRenderer( { antialias: true } );
                    renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
    
                    renderer.setClearColor( scene.fog.color, 1 );
    
                    renderer.domElement.style.position = "relative";
                    container.appendChild( renderer.domElement );
    
                    //
    /**
                    renderer.gammaInput = true;
                    renderer.gammaOutput = true;
                    renderer.physicallyBasedShading = true;
    
                    renderer.shadowMapEnabled = true;
                    renderer.shadowMapType = THREE.PCFShadowMap;
    **/
                    // STATS
    
                    stats = new Stats();
                    stats.domElement.style.position = 'absolute';
                    stats.domElement.style.top = '0px';
                    stats.domElement.style.zIndex = 100;
                    container.appendChild( stats.domElement );
    
                    var start = Date.now();
    
                    var loader = new THREE.UTF8Loader();
    
                    loader.load( "models/utf8/hand.js", function ( object ) {
    
                        var end = Date.now();
                        console.log( "hand", end - start, "ms" );
    
                        var s = 350;
                        object.scale.set( s, s, s );
                        object.position.x = 125;
                        object.position.y = -125;
                        //scene.add( object );
    
                        object.traverse( function( node ) {
    
                            node.castShadow = true;
                            node.receiveShadow = true;
    
                            if ( node.material && node.material.name === "skin" ) {
    
                                node.material.wrapAround = true;
                                node.material.wrapRGB.set( 0.6, 0.2, 0.1 );
    
                            }
    
                        } );
    
                    }, { normalizeRGB: true } );
    
                    loader.load( "models/utf8/ben_dds.js", function ( object ) {
    
                        var end = Date.now();
                        console.log( "ben", end - start, "ms" );
    
                        var s = 350;
                        object.scale.set( s, s, s );
                        object.position.x = -125;
                        object.position.y = -125;
                        scene.add( object );
    
                        object.traverse( function( node ) {
    
                            node.castShadow = true;
                            node.receiveShadow = true;
    
                            if ( node.material && ( node.material.name === "head" || node.material.name === "skinbody" ) ) {
    
                                node.material.wrapAround = true;
                                node.material.wrapRGB.set( 0.6, 0.2, 0.1 );
    
                            }
    
                        } );
    
                    }, { normalizeRGB: true } );
    
    
                    var geometry = new THREE.CubeGeometry( 20, 20, 20 );
    
                    for ( var i = 0; i < 20; i ++ ) {
    
                        var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
    
                        object.position.x = Math.random() * 800 - 400;
                        object.position.y = Math.random() * 800 - 400;
                        object.position.z = Math.random() * 800 - 400;
    
                        object.rotation.x = Math.random() * 2 * Math.PI;
                        object.rotation.y = Math.random() * 2 * Math.PI;
                        object.rotation.z = Math.random() * 2 * Math.PI;
    
                        object.scale.x = Math.random() + 0.5;
                        object.scale.y = Math.random() + 0.5;
                        object.scale.z = Math.random() + 0.5;
    
                        scene.add( object );
    
                    }
                    projector = new THREE.Projector();
                    raycaster = new THREE.Raycaster();
    
    
                    //
    
                    window.addEventListener( 'resize', onWindowResize, false );
    
                }
    
                function onWindowResize() {
    
                    windowHalfX = window.innerWidth / 2;
                    windowHalfY = window.innerHeight / 2;
    
                    camera.aspect = window.innerWidth / window.innerHeight;
                    camera.updateProjectionMatrix();
    
                    renderer.setSize( window.innerWidth, window.innerHeight );
    
                }
    
                function onDocumentMouseMove( event ) {
    
                    mouseX = ( event.clientX - windowHalfX );
                    mouseY = ( event.clientY - windowHalfY );
    
                    mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
                    mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
    
                }
    
                //
    
                function animate() {
    
                    requestAnimationFrame( animate );
    
                    render();
                    stats.update();
    
                }
    
                function render() {
    
                    camera.position.x += ( mouseX - camera.position.x ) * .05;
                    camera.position.y += ( - mouseY - camera.position.y ) * .05;
    
                    camera.lookAt( scene.position );
    
    
                    renderer.render( scene, camera );
    
                }
    
    
                function onDocumentMouseDown( event ) {
    
                    event.preventDefault();
                                    show.innerText = "";
                    var vector = new THREE.Vector3( ( event.clientX / window.innerWidth ) * 2 - 1, - ( event.clientY / window.innerHeight ) * 2 + 1, 0.5 );
                    projector.unprojectVector( vector, camera );
    
                    var raycaster = new THREE.Raycaster( camera.position, vector.sub( camera.position ).normalize() );
    
                    var intersects = raycaster.intersectObjects( scene.children );
    
                    if ( intersects.length > 0 ) {
                                       show.innerText = "intersects=" + intersects.length + " at " + Date.now();
                       console.log(intersects.length);
    
                    }
    
                }
    
            </script>
    
        </body>
    </html>
    

1 个答案:

答案 0 :(得分:0)

您需要将recursive标记添加到raycaster.intersectObjects()

var intersects = raycaster.intersectObjects( scene.children, true );

three.js r.58