javascript - 如何使用 three.js 'wrap' 球体上的平面?

标签 javascript 3d three.js collision-detection raycasting

我对 three.js 比较陌生,我正在尝试定位和操纵平面对象以产生覆盖球体对象(或任何相关对象)表面的效果,以便平面采用以下形式物体表面。目的是以后能够在表面上移动飞机。

我将平面定位在球体前面,并通过平面的顶点进行索引,向球体转换光线以检测与球体的交点。然后我尝试更改所述顶点的 z 位置,但它没有达到预期的结果。任何人都可以就如何使这项工作提供一些指导,或者确实建议另一种方法吗?

这就是我尝试更改顶点的方式(偏移量为 1 以在球体表面“可见”);

planeMesh.geometry.vertices[vertexIndex].z = collisionResults[0].distance - 1;

确保在渲染之前设置以下内容;

planeMesh.geometry.verticesNeedUpdate = true;
planeMesh.geometry.normalsNeedUpdate = true;

我有一个显示我所在位置的 fiddle ,在这里我将光线转换到 z 轴上,但我没有与球体发生交叉(碰撞),也无法按照我希望的方式改变平面。

http://jsfiddle.net/stokewoggle/vuezL/

您可以使用左右箭头(无论如何在 chrome 中)围绕场景旋转相机以查看平面的形状。我已经让球体看透了,因为我发现它有助于更​​好地看清飞机。

编辑:更新了 fiddle 并更正了描述错误。

最佳答案

很抱歉耽搁了,但我花了几天时间才弄明白这个问题。碰撞不起作用的原因是(正如我们所怀疑的那样)planeMesh 顶点位于局部空间中,这与从球体中心开始基本相同,而不是您所期望的。起初,我认为一个快速修复方法是应用 worldMatrix,就像 stemkoski 在我链接到的他的 github three.js 碰撞示例中所做的那样,但这并没有最终奏效,因为平面本身是在 x 和 y 坐标中定义的、上下、左右 - 但当您创建平面 2D 平面网格时,不会在本地生成 z 信息(深度)。

最终的工作是手动设置平面每个顶点的 z 分量。您最初希望平面位于 z = 201,所以我只是将代码移到通过每个顶点的循环中,然后我手动将每个顶点设置为 z = 201;现在,所有光线起始位置都是正确的(全局)并且光线方向为 (0,0,-1) 会导致正确的碰撞。

var localVertex = planeMesh.geometry.vertices[vertexIndex].clone();
localVertex.z = 201;

还有一件事是为了使 plane-wrap 的形状绝对完美,我没有使用 (0,0,-1) 作为每个光线方向,而是通过从球体中心减去每个顶点来手动计算每个光线方向位置定位并对结果向量进行归一化。现在,碰撞结果交点会更好。

var directionVector = new THREE.Vector3();
directionVector.subVectors(sphereMesh.position, localVertex);
directionVector.normalize();
var ray = new THREE.Raycaster(localVertex, directionVector);

这是一个工作示例: http://jsfiddle.net/FLyaY/1/

如您所见,平面网格紧贴球体,有点像贴片或创可贴。 :)

希望这对您有所帮助。感谢您在 three.js 的 github 页面上发布问题 - 我不会在这里看到它。起初我认为这是 THREE.Raycaster 中的错误,但最后它只是用户(我的)错误。我从处理这个问题中学到了很多关于碰撞代码的知识,稍后我将在我自己的 3D 游戏项目中使用它。您可以在以下位置查看我的游戏之一:https://github.com/erichlof/SpacePong3D

祝你好运! -埃里希

关于javascript - 如何使用 three.js 'wrap' 球体上的平面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23405683/

相关文章:

javascript - 用螺旋线包裹圆环

javascript - 用音符名称标记 y 轴刻度

c - 3d轨迹路径计算

opengl - 使用选择框选择 3D 曲面(以两种不同的方式)

javascript - 您对使用 javascript 实现 3D 地球仪的想法

javascript - drawcalls 如何在 three.js 中工作?

javascript - 如何发送像表单数据 postman 这样的值 - React js

当另一个声音开始时,Javascript 停止播放声音

javascript - 宽度不随 JS 变量改变

graphics - 两个网格,相同的纹理,不同的偏移量?