繁体   English   中英

OnDocumentMouseMove three.js无法正常工作

[英]OnDocumentMouseMove three.js not working

我对Three.js完全没有经验,但是我正在尝试创建与这个相等的相机效果: https ://threejs.org/examples/#webgl_geometry_colors

我试图使用以下代码读取鼠标位置并应用它们,(它们在示例中的执行方式相同)。 为了试图找出问题出在哪里,我将其放入“ camera.positon.x = 1000”中,以查看其是否有效,但无效。 现在,我不知道问题出在哪里,但我只是无法使鼠标工作。

function onDocumentMouseMove( event ) {
    mouseX = ( event.clientX - windowHalfX );
    mouseY = ( event.clientY - windowHalfY );
    camera.position.x = 10000;
}   

(我不想顺便使用轨道控制)预先感谢

下面是完整的代码

<script>

    var renderer, camera, controls, scene, mesh1, mesh2;

function init(){
    renderer = new THREE.WebGLRenderer({canvas: document.getElementById('myCanvas'), antialias: true});   
    renderer.setClearColor(0x000044);        

    scene = new THREE.Scene();        
    camera = new THREE.PerspectiveCamera(15, window.innerWidth/window.innerHeight, 0.1, 3000);    
    camera.position.set(0,0,750);        

    resize();
    window.onresize = resize;

    var light = new THREE.AmbientLight(0xFFFFFF, 0.9);
    scene.add(light);

    var light2 = new THREE.PointLight(0xFFFFFF, 1);
    scene.add(light2);
    light2.position.set(0,8,75);

    var geometry = new THREE.BoxGeometry(30, 30, 1);
    var material = new THREE.MeshPhongMaterial({
        color: 0xFF1111,
    });
    mesh1 = new THREE.Mesh(geometry,material);
    mesh1.rotation.x = -0.05;

    scene.add(mesh1);
    mesh1.position.set(0,0,50);

    var geometry = new THREE.BoxGeometry(30, 30, 1);
    var material = new THREE.MeshPhongMaterial({
        color: 0x11FF11,
    });
    mesh2 = new THREE.Mesh(geometry,material);
    mesh2.rotation.x = -0.05;

    scene.add(mesh2);
    mesh2.position.set(0,0,0);

    var geometry = new THREE.BoxGeometry(30, 30, 1);
    var material = new THREE.MeshPhongMaterial({
        color: 0x1111FF,
    });
    mesh3 = new THREE.Mesh(geometry,material);
    mesh3.rotation.x = -0.05;

    scene.add(mesh3);
    mesh3.position.set(0,0, -50);

    document.addEventListener( 'mousemove', onDocumentMouseMove, false );
}

function resize() {
    renderer.setSize(window.innerWidth, window.innerHeight);
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
}

function onDocumentMouseMove( event ) {
    mouseX = ( event.clientX - windowHalfX );
    mouseY = ( event.clientY - windowHalfY );
    camera.position.x = 10000;
}    

function render() {    
    requestAnimationFrame( render );
    renderer.render( scene, camera );
    camera.position.x += 0.5;
    camera.lookAt(new THREE.Vector3(0, 0, 0));
}

init(); render();    

</script>

在代码中未定义变量windowHalfXwindowHalfY

如果摄像机的位置应取决于鼠标的位置,则必须通过更改鼠标位置来操纵摄像机的位置。 这意味着您必须计算当前鼠标位置和上一个鼠标位置的差。

如果要根据鼠标相对于画布中心的位置来计算位置的操作,则代码应如下所示:

var prevDeltaX = 0, prevDeltaY = 0;
function onDocumentMouseMove( event ) {
    var mouseX = event.clientX;
    var mouseY = event.clientY;
    var deltaX = (window.innerWidth / 2 - mouseX);
    var deltaY = (mouseY - window.innerHeight / 2);
    camera.position.x += deltaX - prevDeltaX;
    camera.position.y += deltaY - prevDeltaY;
    prevDeltaX = deltaX; prevDeltaY = deltaY; 
}

请参阅摘要:

 var renderer, camera, controls, scene, mesh1, mesh2; function init(){ renderer = new THREE.WebGLRenderer({canvas: document.getElementById('myCanvas'), antialias: true}); renderer.setClearColor(0x000044); scene = new THREE.Scene(); camera = new THREE.PerspectiveCamera(15, window.innerWidth/window.innerHeight, 0.1, 3000); camera.position.set(0,0,750); resize(); window.onresize = resize; var light = new THREE.AmbientLight(0xFFFFFF, 0.9); scene.add(light); var light2 = new THREE.PointLight(0xFFFFFF, 1); scene.add(light2); light2.position.set(0,8,75); var geometry = new THREE.BoxGeometry(30, 30, 1); var material = new THREE.MeshPhongMaterial({ color: 0xFF1111, }); mesh1 = new THREE.Mesh(geometry,material); mesh1.rotation.x = -0.05; scene.add(mesh1); mesh1.position.set(0,0,50); var geometry = new THREE.BoxGeometry(30, 30, 1); var material = new THREE.MeshPhongMaterial({ color: 0x11FF11, }); mesh2 = new THREE.Mesh(geometry,material); mesh2.rotation.x = -0.05; scene.add(mesh2); mesh2.position.set(0,0,0); var geometry = new THREE.BoxGeometry(30, 30, 1); var material = new THREE.MeshPhongMaterial({ color: 0x1111FF, }); mesh3 = new THREE.Mesh(geometry,material); mesh3.rotation.x = -0.05; scene.add(mesh3); mesh3.position.set(0,0, -50); document.addEventListener( 'mousemove', onDocumentMouseMove, false ); } function resize() { renderer.setSize(window.innerWidth, window.innerHeight); camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); } var prevDeltaX = 0, prevDeltaY = 0; function onDocumentMouseMove( event ) { var mouseX = event.clientX; var mouseY = event.clientY; var deltaX = (window.innerWidth / 2 - mouseX); var deltaY = (mouseY - window.innerHeight / 2); camera.position.x += deltaX - prevDeltaX; camera.position.y += deltaY - prevDeltaY; prevDeltaX = deltaX; prevDeltaY = deltaY; } function render() { requestAnimationFrame( render ); renderer.render( scene, camera ); //camera.position.x += 0.5; camera.lookAt(new THREE.Vector3(0, 0, 0)); } init(); render(); 
 <script src="https://threejs.org/build/three.min.js"></script> <canvas id="myCanvas"></canvas> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM