你好,我正在使用IcosahedronGeometry。在它的每个顶点上,我都添加了CircleGeometry。现在我的要求是当鼠标移向圆圈时,圆圈应该感知到鼠标移动并朝着鼠标移动。因此,我创建了一个RingGeometry来围绕圆圈。所以如果鼠标移向环,圆圈应该感知到鼠标的位置。
但是我无法获取鼠标位置。我正在使用raycaster,是否有其他替代方法来查找鼠标的位置?
你好,我正在使用IcosahedronGeometry。在它的每个顶点上,我都添加了CircleGeometry。现在我的要求是当鼠标移向圆圈时,圆圈应该感知到鼠标移动并朝着鼠标移动。因此,我创建了一个RingGeometry来围绕圆圈。所以如果鼠标移向环,圆圈应该感知到鼠标的位置。
但是我无法获取鼠标位置。我正在使用raycaster,是否有其他替代方法来查找鼠标的位置?
Raycaster是实现此功能的标准方法:
mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
raycaster.setFromCamera( mouse.clone(), camera );
var objects = raycaster.intersectObjects(scene.children);
我做了以下操作(为简洁起见,有些部分被省略):
// Use of the Raycaster inspired by webgl_interactive_cubes.html, in the THREE.js project examples directory
raycaster = new THREE.Raycaster();
mouse = new THREE.Vector2()
document.addEventListener('mousemove', onDocumentMouseMove, false);
window.addEventListener('resize', onWindowResize, false);
document.addEventListener('mousedown', onMouseDown, false);
function onDocumentMouseMove(event) {
event.preventDefault();
mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function manageRaycasterIntersections(scene, camera) {
camera.updateMatrixWorld();
raycaster.setFromCamera(mouse, camera);
var intersects = raycaster.intersectObjects(scene.children);
if (intersects.length > 0) {
}
else {
}
}
function onMouseDown(event){
customLog("mouse position: (" + mouse.x + ", "+ mouse.y + ")");
}
请查看此链接获取完整代码。
var cursorX;
var cursorY;
document.onmousemove = function(e){
cursorX = e.pageX;
cursorY = e.pageY;
}
setInterval("checkCursor()", 1000);
function checkCursor(){
alert("Cursor at: " + cursorX + ", " + cursorY);
}
如果您的渲染在窗口或块中,例如绝对位置,则window.innerWidth
等会给您错误的坐标,并且将鼠标移动附加到整个窗口只是浪费内存。
最好做这样的事情:
const renderBlock = document.querySelector('#threeJSRenderWrapper');
let renderWidth = renderBlock.offsetWidth;
let renderHeight = renderBlock.offsetHeight;
const camera = new THREE.PerspectiveCamera(60, renderWidth / renderHeight, 0.01, 100000);
// this part you can put to window resize function
camera.aspect = renderWidth / renderHeight;
camera.updateProjectionMatrix();
renderer.setSize( renderWidth, renderHeight );
const pointer = new THREE.Vector2();
renderBlock.addEventListener( 'pointermove', onPointerMove );
function onPointerMove( event ) {
// calculate pointer position in normalized device coordinates
// (-1 to +1) for both components
pointer.x = ( event.layerX / renderWidth ) * 2 - 1;
pointer.y = - ( event.layerY / renderHeight) * 2 + 1;
}
// and the rest of the code for mouse intersection or wathever
event.layerX
和event.layerY
会给您正确的块坐标,这些坐标是与mousemove
事件关联的。