THREE.MeshLine icon indicating copy to clipboard operation
THREE.MeshLine copied to clipboard

Not consistent line width.

Open pumanitro opened this issue 3 years ago • 7 comments

image

Any idea how to make a line to be consistent even it is not straight?

pumanitro avatar Mar 30 '21 08:03 pumanitro

Hard to say without seeing the code.

  • What points/vertices are you passing to Meshline?
  • Are you using setPoints after?
  • Are you maybe passing some strange arguments to the setPoints second parameter that sets the width?

jacopocolo avatar Mar 30 '21 09:03 jacopocolo

@jacopocolo

  1. Any points that are not straight-line looks like above
  2. I am using setPoints
  3. my second parameter looks like this: line.setPoints(new Float32Array(points), p => 1); So it does nothing special. I just tested it.

Additionally, my material looks like this:

const color = new THREE.Color(getColor(propertiesColor, 'hex'));

const material = new MeshLineMaterial({
    map: null,
    useMap: false,
    color,
    dashArray: false,
    resolution: new THREE.Vector2( window.innerWidth, window.innerHeight ),
    sizeAttenuation: true,
    lineWidth: 1200
  });

pumanitro avatar Mar 30 '21 09:03 pumanitro

I'm not one of the devs and they may help more BUT it looks like a bug. Meshline really struggles with too much variation on the z-axis. If you add wireframe: true to your material you may see that the mesh itself is not evenly wide.

I did a quick test here and it confirms the issue:

  • https://pacific-alike-justice.glitch.me/ (preview)
  • https://glitch.com/edit/#!/pacific-alike-justice?path=script.js%3A23%3A115 (source)

Reducing the Math.random() in the z of points visibly solves the problem and the mesh stops bending. So maybe adding more points in your geometry could solve the problem.

jacopocolo avatar Mar 30 '21 11:03 jacopocolo

adding more points in your geometry could solve the problem

I thought about this too, but I am not sure about the performance + I would need to calculate points in between 2 points (shouldn't be hard). Still, I was really surprised how hard it is to create such a line path in three.js in XXI century 😄

pumanitro avatar Mar 30 '21 12:03 pumanitro

Take a look at the various curves in three (like https://threejs.org/docs/#api/en/extras/curves/CatmullRomCurve3) you can pass your points to the curve and then get back however many points you need with curve.getPoints( number ). Playing around with the various settings may work!

jacopocolo avatar Mar 30 '21 12:03 jacopocolo

Has the problem been solved?

chimeiaiwangliang avatar Nov 05 '21 08:11 chimeiaiwangliang

Ran into the same issue today, it appears that duplicating each point besides the first and last works pretty well. You get a thick, consistent line between each point. Instead of this:

points = [
      new THREE.Vector3(-5, 0, 0),
      new THREE.Vector3(5, 0, 0),
      new THREE.Vector3(5, 10, 0),
      new THREE.Vector3(-5, 0, 0),
]

You want this:

points = [
      new THREE.Vector3(-5, 0, 0),
      new THREE.Vector3(5, 0, 0),
      new THREE.Vector3(5, 0, 0),
      new THREE.Vector3(5, 10, 0),
      new THREE.Vector3(5, 10, 0),
      new THREE.Vector3(-5, 0, 0),
]

jon-mcclung-fortyau avatar Mar 22 '22 16:03 jon-mcclung-fortyau