简短的回答是你必须考虑offset
画布的。
长答案取决于你的代码是如何编写的,所以我会给你两个答案,它们应该涵盖基础。
有很多可能的组合,因此您可能需要进行实验。此外,不同的浏览器可能会有不同的行为。
假设您的 HTML 是这样的:
#canvas {
width: 200px;
height: 200px;
margin: 100px;
padding: 0px;
position: static; /* fixed or static */
top: 100px;
left: 100px;
}
<body>
<div id="canvas">
</body>
你的 JS 是这样的:
var CANVAS_WIDTH = 200,
CANVAS_HEIGHT = 200;
var container = document.getElementById( 'canvas' );
document.body.appendChild( container );
renderer = new THREE.WebGLRenderer();
renderer.setSize( CANVAS_WIDTH, CANVAS_HEIGHT );
container.appendChild( renderer.domElement );
方法 1为使以下方法正常工作,请将画布位置设置为static;margin > 0 和 padding > 0 都可以
mouse.x = ( ( event.clientX - renderer.domElement.offsetLeft ) / renderer.domElement.clientWidth ) * 2 - 1;
mouse.y = - ( ( event.clientY - renderer.domElement.offsetTop ) / renderer.domElement.clientHeight ) * 2 + 1;
方法2对于这种替代方法,将画布位置设置为固定;置顶 > 0,置左 > 0;填充必须为 0;边距 > 0 是可以的
mouse.x = ( ( event.clientX - container.offsetLeft ) / container.clientWidth ) * 2 - 1;
mouse.y = - ( ( event.clientY - container.offsetTop ) / container.clientHeight ) * 2 + 1;
如果你想实验,这里是一个小提琴:http: //jsfiddle.net/cn7ecoaa/
编辑:小提琴更新为 three.js r.84