2015-04-23 78 views
0

我three.js所69转换三维点要Screen2D得到错误的结果three.js所

function Point3DToScreen2D(point3D,camera){ 
    var p = point3D.clone(); 
    var vector = p.project(camera); 

    vector.x = (vector.x + 1)/2 * window.innerWidth; 
    vector.y = -(vector.y - 1)/2 * window.innerHeight; 

    return vector; 

    } 

使用功能这样当我把现场仍然正常工作。 但是,当我旋转场景它犯了一个错误,并在屏幕上返回错误的位置。 它发生在我旋转180度左右。它没有在屏幕上的位置,但它显示。

我设置的位置var tmpV=Point3DToScreen2D(new THREE.Vector3(-67,1033,-2500),camera);update与css3d.And表明它,当我像旋转180度,但小于360点显示在屏幕again.Obviously这是一个错误的位置,可以从现场被telled而且我还没有旋转360度。

我对Matrix知之甚少,所以我不知道project是如何工作的。

这里是project在three.js所来源:

project: function() { 

     var matrix; 

     return function (camera) { 

      if (matrix === undefined) matrix = new THREE.Matrix4(); 

      matrix.multiplyMatrices(camera.projectionMatrix, matrix.getInverse(camera.matrixWorld)); 
      return this.applyProjection(matrix); 

     }; 

    }() 

是在matrix.getInverse(camera.matrixWorld)冗余?我试图删除它,它不起作用。 任何人都可以帮我吗?谢谢。

+0

重复:http://stackoverflow.com/questions/27409074/three-js-converting-3d-position-to-2d-screen-position-r69 – WestLangley

+0

你所使用的代码是“旋转现场”? – WestLangley

+0

@WestLangley我的意思是这里有一个错误。我使用正常的旋转控制像http://threejs.org/examples/webgl_panorama_equirectangular.html – aboutqx

回答

1

你用图案像这样的投影距离世界空间中的3D点到屏幕空间:

var vector = new THREE.Vector3(); 
var canvas = renderer.domElement; 

vector.set(1, 2, 3); 

// map to normalized device coordinate (NDC) space 
vector.project(camera); 

// map to 2D screen space 
vector.x = Math.round(( vector.x + 1) * canvas.width/2), 
vector.y = Math.round((- vector.y + 1) * canvas.height/2); 
vector.z = 0; 

但是,使用这种方法,指向背后的摄像头投射到屏幕空间了。

你说你想过滤出相机后面的点。要做到这一点,您可以使用此模式第一:

var matrix = new THREE.Matrix4(); // create once and reuse 

... 

// get the matrix that maps from world space to camera space 
matrix.getInverse(camera.matrixWorld); 

// transform your point from world space to camera space 
p.applyMatrix(matrix); 

由于相机位于相机空间的原点,并且由于相机总是低头在摄像机空间负Z轴指向背后的相机将具有大于零的z坐标。

// check if point is behind the camera 
if (p.z > 0) ... 

three.js所r.71

+0

好吧,也许我应该告诉更多clearly.What我想要做的是显示与css3d点和点会移动一样,它在scene.So我应该弄清楚当点出摄像机视图,而无需改变该点的位置。我会创建一个小提琴,你可以编辑它。谢谢你的帮助。 – aboutqx

+0

我试着去'如果(camera.target.z - ( - 2500)<0)',-2500点是的'z',但它显示了三维点之前.The点消失了相机的一个bug视图。 – aboutqx

+0

我更正了我的答案...对不起,我只能回答关于three.js的问题。我无法为你调试你的代码。我希望你明白。 – WestLangley

0

像上面的例子,但你可以检查vector.z,以确定它是否在前面。

var vector = new THREE.Vector3(); 
var canvas = renderer.domElement; 

vector.set(1, 2, 3); 

// map to normalized device coordinate (NDC) space 
vector.project(camera); 

// map to 2D screen space 
vector.x = Math.round(( vector.x + 1) * canvas.width/2), 
vector.y = Math.round((- vector.y + 1) * canvas.height/2); 

//behind the camera if z isn't in 0..1 [frustrum range] 
if(vector.z > 1){ 
    vector = null; 
} 
+0

这是不正确的内部。映射不是连续的。远平面以外的点也映射到大于1的z值。 – WestLangley