【问题标题】:How to "flatten" a 3D mesh into a 2D shape in Three.js如何在 Three.js 中将 3D 网格“展平”为 2D 形状
【发布时间】:2016-04-23 12:33:57
【问题描述】:

我正在尝试将 3D 网格展平为 2D 形状。我想要达到的目标是this

基本上,您在图像中看到的是给定的网格及其沿不同视图的轮廓。我想用 Three.js 对任何给定的网格做同样的事情,但我不知道如何获得剪影。

我想到了两种可能的解决方案:

1) 复制网格并沿给定轴缩放以使其变平(例如,如果我想获得从正 Z 到负的形状的轮廓,我只需将其缩放为这个:

myMesh.scale.z = 0.001 // Small value to make it "2D-like"

问题:我正在复制和重绘一个可能非常大的网格,因此效率不高。

2) 将网格的顶点投影到 2D 平面,使它们都处于同一水平,然后在顶点之间创建线。

问题:这样说它根本不起作用,因为我丢失了有关顶点如何连接为面的信息。生成的形状将完全取决于顶点的投影顺序。

例如,如果我们考虑这个mesh 我从那个角度投影“在我面前”的顶点,我会得到these points(或多或少),但我不知道如何连接它们。

我应该如何进行?

【问题讨论】:

  • mesh.geometry 包含有关顶点如何连接的所有信息。只需使用 getContext('2d') 将所有三角形绘制到另一个画布中,然后将该画布用作纹理

标签: javascript 3d three.js webgl


【解决方案1】:

我建议使用orthogonal projection 对纹理进行额外的渲染通道,并创建带有这些纹理的平面。

如果您不需要对象的材质细节,则值得将其材质更改为一些简单的材质。此外,如果您的平面和对象在同一个场景中,您可能希望在使用正交渲染时使它们不可见。

在三个.js 中,WebGLRenderTarget 可用于渲染到纹理,OrthographicCamera 用于获取正射投影,MeshBasicMaterial 作为简单材质。

【讨论】:

  • 感谢您的建议,但这对我来说可能太难了。你看,我需要在一个更大的项目中实现这个功能,并且由于项目的结构,添加渲染通道会太复杂。基本上我所拥有的只是一个场景对象,我必须在其中添加这些剪影,而无需添加/更改渲染通道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2019-11-22
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多