spite / THREE.MeshLine

Mesh replacement for THREE.Line
MIT License
2.16k stars 380 forks source link

Not consistent line width. #136

Open pumanitro opened 3 years ago

pumanitro commented 3 years ago

image

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

jacopocolo commented 3 years ago

Hard to say without seeing the code.

pumanitro commented 3 years ago

@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
  });
jacopocolo commented 3 years ago

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:

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.

pumanitro commented 3 years ago

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 😄

jacopocolo commented 3 years ago

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!

chimeiaiwangliang commented 2 years ago

Has the problem been solved?

jon-mcclung-fortyau commented 2 years ago

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),
]