MeshPhysicalMaterial + visible seams on facetted surface

Hi

I’ve loaded an .obj model and I’m using MeshPhysicalMaterial to display a glass like surface.

The orginal 3D model had quads on the surface, by saving it as an .obj these quads turn into triangles. To create the facetted look I used computerVertexNormals() to have the 3 vertex normals align in the exact same direction (which happens automatically on .obj non-indexed geometries).

This of course creates the problem that the triangles have normals aligned to their triangle and since a quad consists of 2 triangles I see a visible seam that seperates the two triangles.

My next thought was to copy the normal information from 1 triangle to the neighbouring triangle. So that the light would be calculated on both of them exactly the same. But the problem persists.

const positionAttribute = obj.geometry.attributes.position
const normalAttribute = obj.geometry.attributes.normal
const pA = new Vector3(), pB = new Vector3(), pC = new Vector3(), cb = new Vector3(), ab = new Vector3()
for ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {

  pA.fromBufferAttribute( positionAttribute, i + 0 );
  pB.fromBufferAttribute( positionAttribute, i + 1 );
  pC.fromBufferAttribute( positionAttribute, i + 2 );

  cb.subVectors( pC, pB );
  ab.subVectors( pA, pB );
  cb.cross( ab );

  // Original triangle
  normalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );
  normalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );
  normalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );

  // Neighbouring triangle
  normalAttribute.setXYZ( i + 4, cb.x, cb.y, cb.z );
  normalAttribute.setXYZ( i + 5, cb.x, cb.y, cb.z );
  normalAttribute.setXYZ( i + 6, cb.x, cb.y, cb.z );
}

normalAttribute.needsUpdate = true

obj.geometry.normalizeNormals()

Am I overlooking something? I don’t know the exact internals of MeshStandard & MeshPhysical Materials. Any Idea?

Thanks in advance!

Just to ask about i+=3 → should it be i+=6?

1 Like

Dear god, how I could overlooked that ¯_(ツ)_/¯

And the indices were wrong too (i + 0, 1, 2, 4, 5, 6) instead of (i + 0, 1, 2, 3, 4, 5)

Thanks a lot!