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