我不能使它工作。在控制台上,它表示click事件起作用,
但是我不能用URL链接领域。
Iam使用Three.js的最新版本

这是我的代码:

// once everything is loaded, we run our Three.js stuff.
$(function () {
var geometry, material, mesha;

    var clock = new THREE.Clock();
    var raycaster;
    var stats = initStats();

    // create a scene, that will hold all our elements such as   objects, cameras and lights.
    var scene = new THREE.Scene();

    // create a camera, which defines where we're looking at.
    var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);


    // create a render and set the size
    var webGLRenderer = new THREE.WebGLRenderer();
    webGLRenderer.setClearColor(new THREE.Color(0x000, 1.0));
    webGLRenderer.setSize(window.innerWidth, window.innerHeight);
    webGLRenderer.shadowMapEnabled = true;

    // position and point the camera to the center of the scene
    camera.position.x = 100;
    camera.position.y = 10;
    camera.position.z = 1000;
    camera.lookAt(new THREE.Vector3(0, 0, 0));


    var camControls = new THREE.FirstPersonControls(camera);
    camControls.lookSpeed = 0.4;
    camControls.movementSpeed = 30;
    camControls.noFly = true;
    camControls.lookVertical = true;
    camControls.constrainVertical = false;
    camControls.verticalMin = 0.0;
    camControls.verticalMax = 1.0;
    camControls.lon = -150;
    camControls.lat = 120;


    var ambientLight = new THREE.AmbientLight(0x383838);
    scene.add(ambientLight);

    // add spotlight for the shadows
    var spotLight = new THREE.SpotLight(0xffffff);
    spotLight.position.set(100, 140, 130);
    spotLight.intensity = 10;
    scene.add(spotLight);

    // add the output of the renderer to the html element
    $("#WebGL-output").append(webGLRenderer.domElement);

    // call the render function
    var step = 0;


    // setup the control gui
    var controls = new function () {
        // we need the first child, since it's a multimaterial


    }


var domEvents   = new THREEx.DomEvents(camera, webGLRenderer.domElement)

//////////////////////////////////////////////////////////////////////////////////
//      add an object and make it move                  //
//////////////////////////////////////////////////////////////////////////////////
var geometry    = new THREE.SphereGeometry( 100.5 )
var material    = new THREE.MeshNormalMaterial()
var mesh    = new THREE.Mesh( geometry, material )
scene.add( mesh )

//////////////////////////////////////////////////////////////////////////////////
//      linkify our cube                        //
//////////////////////////////////////////////////////////////////////////////////

var url = 'http://jeromeetienne.github.io/threex/'
THREEx.Linkify(domEvents, mesh, url)


domEvents.addEventListener(mesh, 'click', function(event){
    console.log('you clicked on mesh', mesh)

}, false)


    var gui = new dat.GUI();


    var mesh;
var onProgress = function ( xhr ) {
                if ( xhr.lengthComputable ) {
                    var percentComplete = xhr.loaded / xhr.total * 100;
                    console.log( Math.round(percentComplete, 2) + '%  downloaded' );
                }
            };
            var onError = function ( xhr ) { };




var mtlLoader = new THREE.MTLLoader();
        mtlLoader.setBaseUrl( '../assets/models/door/' );
            mtlLoader.setPath( '../assets/models/door/' );
            mtlLoader.load( 'door.mtl', function( materials ) {

                materials.preload();

                var objLoader = new THREE.OBJLoader();
                objLoader.setMaterials( materials );
                objLoader.setPath( '../assets/models/door/' );
                objLoader.load( 'door.obj', function ( object ) {

                    object.position.y =  -1;
                       object.scale.x   = 2;
         object.scale.y = 2;
          object.scale.z    = 2;

                    scene.add( object );

                }, onProgress, onError );

            });



// floor

            geometry = new THREE.PlaneGeometry( 2000, 2000, 100, 100 );
        geometry.rotateX( - Math.PI / 2 );

            for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {

                var vertex = geometry.vertices[ i ];
                vertex.x += Math.random() * 20 - 10;
                vertex.y += Math.random() * 3;
                vertex.z += Math.random() * 20 - 10;

            }

            for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {

                var face = geometry.faces[ i ];
                face.vertexColors[ 0 ] = new THREE.Color().setHSL( Math.random() * 0.3 + 0.5, 0.75, Math.random() * 0.25 + 0.75 );
                face.vertexColors[ 1 ] = new THREE.Color().setHSL( Math.random() * 0.3 + 10.5, 0.75, Math.random() * 0.25 + 0.75 );
                face.vertexColors[ 2 ] = new THREE.Color().setHSL( Math.random() * 0.3 + 0.5, 0.75, Math.random() * 0.25 + 0.75 );

            }

            material = new THREE.MeshBasicMaterial( { vertexColors: THREE.VertexColors } );

            mesh = new THREE.Mesh( geometry, material );
            scene.add( mesh );





    function setCamControls() {

    }

    render();

    function setRandomColors(object, scale) {
        var children = object.children;

        if (children && children.length > 0) {
            children.forEach(function (e) {
                setRandomColors(e, scale)
            });
        } else {
            // no children assume contains a mesh
            if (object instanceof THREE.Mesh) {

                object.material.color = new THREE.Color(scale(Math.random()).hex());
                if (object.material.name.indexOf("building") == 0) {
                    object.material.emissive = new THREE.Color(0x444444);
                    object.material.transparent = true;
                    object.material.opacity = 0.8;
                }
            }
        }
    }


    function render() {
        stats.update();
        var delta = clock.getDelta();

        if (mesh) {
            //   mesh.rotation.y+=0.006;
        }


        camControls.update(delta);
        webGLRenderer.clear();
        // render using requestAnimationFrame
        requestAnimationFrame(render);
        webGLRenderer.render(scene, camera)
    }

    function initStats() {

        var stats = new Stats();
        stats.setMode(0); // 0: fps, 1: ms

        // Align top-left
        stats.domElement.style.position = 'absolute';
        stats.domElement.style.left = '0px';
        stats.domElement.style.top = '0px';

        $("#Stats-output").append(stats.domElement);

        return stats;
    }
});


有人可以帮忙吗?你有主意吗
我是一个新手...

最佳答案

解:

获取最新版本的DomEvents(https://github.com/jeromeetienne/threex.domevents),现在已更新为r74。



说明:

这花了我一些时间弄清楚,让我们看看发生了什么:

THREEx.DomEvents在内部使用THREE.Raycaster来检测鼠标何时指向网格。 ThreeJS最近改变了射线发生器的行为,使其不再与不可见的网格相交(source)。是的,我不在乎,我的点击事件触发了您的发言?

让我们来看看Linkyfy

THREEx.Linkify  = function(domEvents, mesh, url, withBoundingBox){
    withBoundingBox = withBoundingBox !== undefined ? withBoundingBox : true
    // create the boundingBox if needed
    if( withBoundingBox ){
        var boundingBox = new THREE.Mesh(new THREE.CubeGeometry(1,1,1), new THREE.MeshBasicMaterial({
            wireframe   : true
        }))
        boundingBox.visible = false
        boundingBox.scale.copy(size)
        mesh.add(boundingBox)
    }
// ...


如果不提供,则第四个参数withBoundingBox的评估值为true。然后,Linkify将创建一个不可见的“边界框网格”,并环绕您要链接的网格。光线投射器不再触发交叉路口,您就可以了。为了使raycaster在不可见boundingBox-object的情况下仍能检测到相交,请仅将网格物体的可见性设置为false而不将网格设置为:
boundingBox.material.visible = false

09-07 18:28