offset
簡単な答えは、キャンバスのを考慮に入れる必要があるということです。
長い答えはあなたのコードがどのように書かれているかに依存するので、私はあなたに2つの答えを与えるでしょう、それは基本をカバーするべきです。
可能な組み合わせはたくさんあるので、実験する必要があるかもしれません。また、ブラウザが異なれば動作も異なる場合があります。
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に設定します。マージン>0およびパディング>0はOKです
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はOKです
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.jsr.84に更新されました