1

我试图相对于相机放置一个立方体,而不是相对于场景。问题是,要将它放置在场景中(我必须让它显示),我必须知道对应于立方体相机空间坐标的场景坐标。我在 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 根本不接受 my myvec,或者说它是未定义的,即使控制台说它是一个对象。我不明白。

4

2 回答 2

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();

三.js r.95

于 2012-08-26T21:26:35.070 回答
3

这也可能是您所追求的:

scene.add( camera );

brick.position.set( 0, 0, -1 );
camera.add( brick );
于 2012-08-27T07:59:48.320 回答