我使用Three.js呈现从服务器检索到的点云数据。使用用户鼠标点击点云到点云
对于每个数据集,我循环遍历数据点并创建一个Three.js Vector3对象,其中每个数据点对应的x,y值为z。我将每个顶点都推送到一个列表中,然后将其传递到我的点组件中的几何组件的顶点支柱中。
render() {
this.pointCloudVertices = [];
if (this.props.points) {
const points = this.props.points
for (let i = 0; i < points.x.length; i++) {
const vertex = new THREE.Vector3();
vertex.x = points.x[i]
vertex.y = points.y[i]
vertex.z = points.z[i]
this.pointCloudVertices.push(vertex);
}
}
return (<points>
<geometry vertices={this.pointCloudVertices}/>
<pointsMaterial
color={ (Math.floor(Math.random()*16777215)) }
size={ 0.2 }
/>
</points>);
}
https://github.com/caseysiebel/pc-client/blob/master/src/components/PointCloud.js
我希望用户能够使用他们的鼠标点击画布里面添加点到另一个点云(点组成)。
我发现了很多指向Three.js'Raycaster的资源,但是这个工具似乎更适用于选择已经在画布中的对象。在我的情况下,我希望用户能够点击并且未被对象占据的区域,让客户端计算出该点击的x,y坐标,然后添加一个顶点,使用这些x/y/z值,直到用户通过此模式添加点为止的点分量(可能为空)。
我对将如何将2D鼠标事件转换为3D顶点值有点困惑。如果有人知道这个问题有什么好的资源,我很乐意检查它们。
“我有点困惑,我将如何将2D鼠标事件转换为3D顶点值”新THREE.Vector(mouseX,mouseY,0)'是最简单的解决方案,虽然可能不满意。我想说,在这一点上,这比数学更像是一个设计问题。 **你想**这个2D平面转换成3D空间吗?想象一下,你坐在你的客厅里,沙发上,指着某个方向。你想在哪里添加这一点?特别是在什么深度/距离你?如何决定第一点(s)?如何为后面的? – Thomas
感谢您的回复。根据你的评论,我认为这里有两个问题。如果我在2D平面上选择一个点,你是对的,我真的定义了一条从我坐的位置(相机位置)沿着无限延伸的第三轴延伸出来的光线。我希望我的新观点坐在这条线上的问题是一个设计问题。如何将相机的当前位置和由数据集定义的原点转换为我正在查看的平面是数学问题。 – Casey
在数学部分,摄像机的[projectionMatrix](https://threejs.org/docs/#api/cameras/Camera.projectionMatrix)应该是您在确定射线时感兴趣的那个;但已经过了一段时间,我做了THREE.js – Thomas