简短的回答是你需要考虑画布的 offset
。
长话短说,具体要看你的代码编写方式,所以我会给你两个答案,应该可以涵盖所有情况。
假设你的 HTML 是这样的:
#canvas {
width: 200px;
height: 200px;
margin: 100px;
padding: 0px;
position: 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.setPixelRatio( window.devicePixelRatio );
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 对于这种替代方法,将画布位置设置为fixed;设置顶部> 0,设置左侧> 0;填充必须为0;边距> 0可以。
mouse.x = ( ( event.clientX - container.offsetLeft ) / container.clientWidth ) * 2 - 1;
mouse.y = - ( ( event.clientY - container.offsetTop ) / container.clientHeight ) * 2 + 1;
如果您想进行实验,这里有一个 jsFiddle: https://jsfiddle.net/uf4c0ws9/
编辑:Fiddle已更新为 three.js r.150