使用 THREE.LineBasicMaterial 的线条粗细

IT技术 javascript webgl three.js
2021-01-21 11:52:29

我正在使用下面的代码在我的 Three.js 场景中创建数百行

edgeGeometry[i] = new THREE.Geometry();
edgeGeometry[i].vertices[0] = v(x1,y1,z1);
edgeGeometry[i].vertices[1] = v(x2,y2,z2);
edgesMat[i] = new THREE.LineBasicMaterial({
    color: 0x6699FF, linewidth: 1, fog:true});
edge[i] = new THREE.Line(edgeGeometry[i], edgesMat[i]);
edge[i].type = THREE.Lines;
scene2.add(edge[i]);

它工作得很好,但是当我将“线宽”的值更改为更大或更小的值时,我看不到场景中的任何差异。
我应该如何更改线条的粗细?有任何想法吗?
谢谢,迪米特里斯

6个回答

1) 使用原生 OpenGL

您可以通过将浏览器设置为使用本机 OpenGL 而不是 ANGLE 来通过变通方法实现线条粗细的渲染。您可以在此处阅读有关如何在 Chrome 上执行此操作的信息请记住,如果您切换到本机 OpenGL,您将遇到性能差异。

编辑:

MrDoob 大师自己在这里发布了如何为 Chrome 和 Firefox 执行此操作

注意: 第一个选项不再是有效的解决方案,因为最新的 OpenGL 版本也不再支持线宽。检查@gman 他的回答这意味着如果您想使用线条粗细,则可以使用第二个选项。


2)使用THREE.MeshLine

还有另一种解决方案;github上的这个THREE.MeshLine是一个很好的解决方法。它带有一个特殊的THREE.MeshLineMaterial. 根据文档,它很简单:

  • 创建和填充几何图形
  • 创建一个THREE.MeshLine并分配几何
  • 创建一个 THREE.MeshLineMaterial
  • 使用THREE.MeshLineTHREE.MeshLineMaterial创建一个THREE.Mesh
我有,请看我的回答
2021-03-16 11:52:29
使用 Native OpenGL 不再是一个解决方案 - 也许您想更新您的答案?
2021-03-19 11:52:29
三.meshline 不支持缓冲几何。有谁知道我如何使它与缓冲区几何一起工作?
2021-03-22 11:52:29
@gman 感谢您的评论。您能否添加一些对该信息来源的引用。然后我可以更新我的问题并添加对该来源的引用。
2021-03-29 11:52:29
不是最佳选择,不受 THREE.Fog 影响
2021-04-09 11:52:29

您使用的是 Windows 吗?
我记得这在 Windows 上不起作用,因为它没有在ANGLE 中实现

嗯,不确定......这是角度限制。我不知道他们是否可以添加一些东西。
2021-03-15 11:52:29
真遗憾。无论我尝试什么,一开始我总是遇到任何麻烦,我可能需要成为 QA。曾尝试实现简单的时钟图像,现在我必须覆盖线宽问题)我想我们可以尝试使用矩形代替线条(2px 宽度的矩形)
2021-03-17 11:52:29
是的,我使用的是 Windows 7。现在你提到它,一定是因为我一个月前在 Ubuntu 上运行我的应用程序并且宽度发生了完美的变化。我怎样才能让它在 Windows 中也能工作?
2021-03-25 11:52:29
感谢您的快速回复......至少现在我知道导致问题的不是我的代码中的错误......
2021-04-06 11:52:29
这在 OS X Chrome 上也发生在我身上,刚刚找到了关于它的报告:github.com/mrdoob/three.js/issues/10357
2021-04-13 11:52:29

这发生在 Windows Chrome 和 Firefox 中,两者都使用 ANGLE(WebGL 到 DirectX 包装器)。

这个问题仍然没有被 ANGLE 项目解决。您可以在此处为问题加星标以获得更高的优先级并在要实施时收到通知:

https://code.google.com/p/angleproject/issues/detail?id=119

我使用 TubeGeometry 在两点之间创建一条粗线:

参见 Helix 中的绿线

在此处输入图片说明

// line material
var lineMaterial = new THREE.LineBasicMaterial({ color: 0x00ff00 });


let startVector = new THREE.Vector3(
    RADI * Math.cos(t),
    RADI * Math.sin(t),
    3 * t
  );
  let endVector = new THREE.Vector3(
    RADI * Math.cos(t + 10),
    RADI * Math.sin(t + 10),
    3 * t
  );

  let linePoints = [];
  linePoints.push(startVector, endVector);

  // Create Tube Geometry
  var tubeGeometry = new THREE.TubeGeometry(
    new THREE.CatmullRomCurve3(linePoints),
    512,// path segments
    0.5,// THICKNESS
    8, //Roundness of Tube
    false //closed
  );

  let line = new THREE.Line(tubeGeometry, lineMaterial);
  scene.add(line);

这不再是 ANGLE 的问题,而是所有平台的问题。浏览器需要切换到 OpenGL 4+ 核心配置文件以支持 WebGL2,而 OpenGL 4+ 核心配置文件不支持大于 1 的线宽。来自 OpenGL 4.0+ 规范的 E.2.1 部分

E.2.1 已弃用但仍受支持的功能

以下功能已弃用,但仍存在于核心配置文件中。它们可能会从 OpenGL 的未来版本中删除,并在实现核心配置文件的前向兼容上下文中删除。

  • 宽线 - LineWidth 值大于 1.0 将生成 INVALID_VALUE 错误。

要绘制更粗的线条,您需要生成几何图形。对于 Three.js 有这个库(Wilt 也指出)

https://github.com/spite/THREE.MeshLine

我有 > 10k 行,所以 THREE.MeshLine 对我来说是不够的。我能做什么?将线挤出到服务器上的网格?
2021-03-15 11:52:29
截至今天(26 Frb 2018),Safari 实际上仍然正确地呈现 lineWidth > 1,而最新的 Chrome 不会;<
2021-03-18 11:52:29
是的,我在那里用了一个错误的词。改变规范真的很糟糕,但这就是生活;)。可能会使用来自 github 的 THREE.LineMesh。
2021-04-03 11:52:29
是的,我现在正在使用 THREE.MeshLine :)。干杯。
2021-04-07 11:52:29
WebGL 规范没有改变,实现却改变了。规范一直说 1 是所有必须支持的东西,而且对于大多数人来说,Windows 上的所有东西都是曾经支持过的。如果您曾经想要 line > 1,并且您希望您的应用程序可以在任何地方运行,那么您总是必须实施像 THREE.MeshLine 这样的解决方案。
2021-04-13 11:52:29