gpt4 book ai didi

javascript - Three.js - 如何在浏览器窗口外和/或页面上的其他内容上继续跟踪鼠标

转载 作者:行者123 更新时间:2023-11-30 00:09:31 25 4
gpt4 key购买 nike

我有一个完整的窗口 three.js 场景。我在场景顶部和侧面有一些绝对定位的按钮。如果您单击并拖动相机旋转(weee!),但如果您拖动按钮,旋转停止(嘘)。如果您拖出窗口,它也会停止。我正在使用 three.js R76 和 OrbitControls.js。有没有一种简单的方法可以让场景在按钮仍被按住的同时继续收听鼠标移动?

http://codepen.io/anon/pen/qZgEBNHTML

<html lang="en">
<head>
<title>three.js webgl - orbit controls</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 {
color: #000;
font-family:Monospace;
font-size:13px;
text-align:center;
font-weight: bold;

background-color: #fff;
margin: 0px;
overflow: hidden;
}

#info {
color:#000;
position: absolute;
top: 0px; width: 100%;
padding: 5px;

}

a {
color: red;
}
</style>
</head>

<body>
<div id="container"></div>
<div id="info">
<a href="http://threejs.org" target="_blank">three.js</a> - orbit controls example
</div>

</body>

JS

        var camera, controls, scene, renderer;

init();
animate();

function init() {

scene = new THREE.Scene();
scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );

renderer = new THREE.WebGLRenderer();
renderer.setClearColor( scene.fog.color );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );

var container = document.getElementById( 'container' );
container.appendChild( renderer.domElement );

camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 1, 1000 );
camera.position.z = 500;

controls = new THREE.OrbitControls( camera, renderer.domElement );
//controls.addEventListener( 'change', render ); // add this only if there is no animation loop (requestAnimationFrame)
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.enableZoom = false;

// world

var geometry = new THREE.CylinderGeometry( 0, 10, 30, 4, 1 );
var material = new THREE.MeshPhongMaterial( { color:0xffffff, shading: THREE.FlatShading } );

for ( var i = 0; i < 500; i ++ ) {

var mesh = new THREE.Mesh( geometry, material );
mesh.position.x = ( Math.random() - 0.5 ) * 1000;
mesh.position.y = ( Math.random() - 0.5 ) * 1000;
mesh.position.z = ( Math.random() - 0.5 ) * 1000;
mesh.updateMatrix();
mesh.matrixAutoUpdate = false;
scene.add( mesh );

}

// lights

light = new THREE.DirectionalLight( 0xffffff );
light.position.set( 1, 1, 1 );
scene.add( light );

light = new THREE.DirectionalLight( 0x002288 );
light.position.set( -1, -1, -1 );
scene.add( light );

light = new THREE.AmbientLight( 0x222222 );
scene.add( light );

//


window.addEventListener( 'resize', onWindowResize, false );

}

function onWindowResize() {

camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();

renderer.setSize( window.innerWidth, window.innerHeight );

}

function animate() {

requestAnimationFrame( animate );

controls.update(); // required if controls.enableDamping = true, or if controls.autoRotate = true

render();

}

function render() {

renderer.render( scene, camera );

}

如果您单击并拖动以旋转相机,只要您在实际场景中,它就可以正常工作,但如果您的鼠标离开场景,旋转就会停止。我希望它继续旋转。

旁注:codepen 的响应与 three.js 示例页面 (http://threejs.org/examples/#misc_controls_orbit) 不同,离开场景会导致旋转停止,返回(如果您仍按住鼠标按钮)会恢复旋转。在示例页面上,(使用相同的代码,因此它必须是特定于 codepen 的东西)旋转不会恢复。

认为如果我将事件监听器附加到窗口或文档而不是 dom 元素可能会有所帮助,但没有骰子。

更改 OrbitControls.js 行 893 - 901 来自:

scope.domElement.addEventListener( 'contextmenu', onContextMenu, false );

scope.domElement.addEventListener( 'mousedown', onMouseDown, false );
scope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );
scope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox

scope.domElement.addEventListener( 'touchstart', onTouchStart, false );
scope.domElement.addEventListener( 'touchend', onTouchEnd, false );
scope.domElement.addEventListener( 'touchmove', onTouchMove, false );

到:

window.addEventListener( 'contextmenu', onContextMenu, false );

window.addEventListener( 'mousedown', onMouseDown, false );
window.addEventListener( 'mousewheel', onMouseWheel, false );
window.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox

window.addEventListener( 'touchstart', onTouchStart, false );
window.addEventListener( 'touchend', onTouchEnd, false );
window.addEventListener( 'touchmove', onTouchMove, false );

window.addEventListener( 'keydown', onKeyDown, false );

最佳答案

你想要的是orbitControls.js中的第703行(r.76), 注释掉 mouseout 声明,留下其他的。这个问题已经出现过很多次了。也许它应该默认为注释掉或作为轨道控制构造函数参数中的一个选项提供。易于为拉取请求编写代码。

关于javascript - Three.js - 如何在浏览器窗口外和/或页面上的其他内容上继续跟踪鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com