three.js:将相机空间的坐标转换为场景空间

时间:2012-08-26 13:38:05

标签: javascript three.js coordinate-transformation

我正在尝试相对于相机放置一个立方体,而不是相对于场景。问题是,要将它放置在场景中(我必须让它显示),我必须知道对应于立方体相机空间坐标的场景坐标。我在THREE.Camera中找到了这个函数“projectionMatrixInverse”。它有一个很好的函数叫做“multiplyVector3”,我希望能让我将矢量(1,1,1)转换回场景空间,如下所示:

var camera, myvec, multvec; // (and others)
camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, - 2000, 1000 );
camera.position.x = 200;
camera.position.y = 100;
camera.position.z = 200;

myvec = new THREE.Vector3(1,1,1);
console.log("myvec: ", myvec);
multvec = camera.projectionMatrixInverse.multiplyVector3(THREE.Vector3(1,1,1));
console.log("multvec: ", multvec);
事情是,在控制台我得到:

myvec: Object { x=1, y=1, z=1}
TypeError: v is undefined
var vx = v.x, vy = v.y, vz = v.z;

multiplyVector3根本不接受我的myvec,或说它未定义,即使控制台说它是一个对象。我不明白。

2 个答案:

答案 0 :(得分:4)

这也可能是你所追求的:

scene.add( camera );

brick.position.set( 0, 0, -1 );
camera.add( brick );

答案 1 :(得分:3)

摄像机位于其坐标系的原点,向下看它的负Z轴。直接位于相机前方的点的相机坐标格式为( 0, 0, z ),其中z为负数。

您转换点p

p = new THREE.Vector3(); // create once and reuse if you can

p.set( x, y, z );

从相机坐标到世界坐标,如:

p.applyMatrix4( camera.matrixWorld );
默认情况下,

camera.matrixWorld每帧都会更新,但如果需要,您可以通过调用camera.updateMatrixWorld();

自行更新

three.js r.95