2014-10-08 171 views
1

我正在使用版本的three.js的68Three.js - 获取鼠标点击的X,Y和Z坐标

我想点击某处并获取X,Y和Z坐标。我按照这里的步骤,但他们给我一个0的Z值:Mouse/Canvas X, Y to Three.js World X, Y, Z

基本上,如果我在场景中有一个网格,我点击它的中间,我希望能够计算与该网格的位置相同的值。 这只是一个例子。我知道我可以使用光线投射,看看我是否碰到了一个网格,然后检查它的位置。但是,即使我没有点击网格,我也想让它工作。

这可能吗?这里是一个jsfiddle:http://jsfiddle.net/j9ydgyL3/

在那个jsfiddle中,如果我能设法点击那个正方形的中心,我希望分别为X,Y和Z值计算10,10,10,因为那些是广场位置的坐标。以下是两个值得关注的功能:

function getMousePosition(clientX, clientY) { 
    var mouse2D = new THREE.Vector3(); 
    var mouse3D = new THREE.Vector3(); 
    mouse2D.x = (clientX/window.innerWidth) * 2 - 1; 
    mouse2D.y = -(clientY/window.innerHeight) * 2 + 1; 
    mouse2D.z = 0.5; 
    mouse3D = projector.unprojectVector(mouse2D.clone(), camera); 
    return mouse3D; 
    //var vector = new THREE.Vector3(
    //(clientX/window.innerWidth) * 2 - 1, 
    //- (clientY/window.innerHeight) * 2 + 1, 
    //0.5); 

    //projector.unprojectVector(vector, camera); 
    //var dir = vector.sub(camera.position).normalize(); 
    //var distance = - camera.position.z/dir.z; 
    //var pos = camera.position.clone().add(dir.multiplyScalar(distance)); 
    //return pos; 
} 

function onDocumentMouseUp(event) { 
    event.preventDefault(); 

    var mouse3D = getMousePosition(event.clientX, event.clientY); 
    console.log(mouse3D.x + ' ' + mouse3D.y + ' ' + mouse3D.z); 
} 

我遗留了一些其他代码,我尝试将其注释掉。请注意,这个注释掉的代码在jsfiddle网站中不起作用,可能是因为它们仍然使用three.js版本54。它适用于我的机器与版本68.

编辑:为了澄清,我希望能够得到坐标,无论鼠标在哪里。在这个例子中我只用了一个网格,因为通过查看计算出的坐标是否与网格相同,很容易验证它是否工作。我真的很喜欢它的工作原理,而不使用网格上的光线投射。例如,无论场景中出现什么内容,每次鼠标移动时,都可以始终将计算出的坐标打印到控制台。

+1

你将如何找到Z坐标而没有像网格点击的东西?它可以在任何地方从-Inf到+ Inf。你真的需要那里提供的坐标来测试,并根据你使用raycaster来检查的答案。 – Leeft 2014-10-08 08:34:39

+1

@Leeft我不确定,这就是为什么我问是否有可能。如果真的不可能,那么随意发布它作为答案,我会接受它=) – 2014-10-09 02:14:47

回答