注: 以下のコードは WestLangley の修正で更新されました。
3D から 2D への投影の例をいくつか試しました。ただし、projectVector を使用しようとすると、結果が -1 と 1 の間ではないため、ウィンドウの幅/高さを掛けると、非常に大きな数値 (画面の解像度よりもはるかに大きい) が得られます。私の問題が単純なものであることを願っています。three.min.js r56 を使用しており、内部ウィンドウのサイズは 1366x418 です。
以下のコードは、3D ポイント (1200,625,100) に対して (-7.874704599380493,-13.403168320655823) の射影 (x,y) を生成します。この結果をウィンドウの高さと幅の半分などで乗算する必要があることはわかっていますが、結果のピクセル単位の (x,y) は画面から大きく外れています。
<html>
<head>
<title>Test</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<script type="text/javascript" src="three.min.js"></script>
</head>
<body>
<canvas id='container'></canvas>
<script>
/// GLOBAL VARIABLES
var camera, scene, renderer, container, projector;
init();
function toXYCoord (object) {
var vector = projector.projectVector(object.position.clone(), camera);
return vector;
}
/// INIT
function init() {
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 20000 );
scene.add(camera);
camera.position.set(0,-1500,1500);
camera.lookAt(scene.position);
camera.updateMatrixWorld(); ///////////////// THIS IS THE FIX
projector = new THREE.Projector();
// sphere
var sphere = new THREE.Mesh( new THREE.SphereGeometry( 200, 32, 16 ), new THREE.MeshBasicMaterial({ color: 0x000000 }) );
sphere.position.set(1200,625,100);
scene.add(sphere);
container = document.getElementById('container');
renderer = new THREE.WebGLRenderer( { canvas: container, antialias:true } );
renderer.setSize( window.innerWidth, window.innerHeight );
var testVector = toXYCoord(sphere);
console.log(window.innerWidth + "x" + window.innerHeight);
console.log("Got: (" + testVector.x + "," + testVector.y + ")");
renderer.render( scene, camera );
}
</script>
</body>
</html>