bitangent

tangent:

The seam along one axis is much more apparent than the other.

There must be a simple way to get rid of these and though I would put it to you guys.

While I could probably calculate these more accurately procedurally, I would like the method to work for loaded geometry too.

here's the code:

var ids:Vector.<uint> = mesh.ids; var vertices:Vector.<Number> = mesh.vertices; var uvs:Vector.<Number> = mesh.uvs; var tangents:Vector.<Number> = new Vector.<Number>(vertices.length); var bitangents:Vector.<Number> = new Vector.<Number>(vertices.length); var numTriangles:int = ids.length; for(var i:int = 0; i < numTriangles; i+=3) { var id1:int = ids[i]; var id2:int = ids[i+1]; var id3:int = ids[i+2]; var p1:Vector3D = new Vector3D(vertices[int(id1 * 3)], vertices[int(id1 * 3 + 1)], vertices[int(id1 * 3 + 2)]); var p2:Vector3D = new Vector3D(vertices[int(id2 * 3)], vertices[int(id2 * 3 + 1)], vertices[int(id2 * 3 + 2)]); var p3:Vector3D = new Vector3D(vertices[int(id3 * 3)], vertices[int(id3 * 3 + 1)], vertices[int(id3 * 3 + 2)]); var uv1:Point = new Point(uvs[int(id1 * 2)], uvs[int(id1 * 2 + 1)]); var uv2:Point = new Point(uvs[int(id2 * 2)], uvs[int(id2 * 2 + 1)]); var uv3:Point = new Point(uvs[int(id3 * 2)], uvs[int(id3 * 2 + 1)]); var edge1:Vector3D = p2.subtract(p1); var edge2:Vector3D = p3.subtract(p1); var edge1uv:Point = uv2.subtract(uv1); var edge2uv:Point = uv3.subtract(uv1); var cp:Number = edge1uv.y * edge2uv.x - edge1uv.x * edge2uv.y; if ( cp != 0 ) { var mul:Number = 1 / cp; var tangent:Vector3D = new Vector3D(); var bitangent:Vector3D = new Vector3D(); tangent.x = (edge2uv.y * edge1.x - edge1uv.y * edge2.x) * mul; tangent.y = (edge2uv.y * edge1.y - edge1uv.y * edge2.y) * mul; tangent.z = (edge2uv.y * edge1.z - edge1uv.y * edge2.z) * mul; bitangent.x = (-edge2uv.x * edge1.x + edge1uv.x * edge2.x) * mul; bitangent.y = (-edge2uv.x * edge1.y + edge1uv.x * edge2.y) * mul; bitangent.z = (-edge2uv.x * edge1.z + edge1uv.x * edge2.z) * mul; tangent.normalize(); bitangent.normalize(); tangents[int(id1 * 3)] = tangent.x; tangents[int(id1 * 3 + 1)] = tangent.y; tangents[int(id1 * 3 + 2)] = tangent.z; tangents[int(id2 * 3)] = tangent.x; tangents[int(id2 * 3 + 1)] = tangent.y; tangents[int(id2 * 3 + 2)] = tangent.z; tangents[int(id3 * 3)] = tangent.x; tangents[int(id3 * 3 + 1)] = tangent.y; tangents[int(id3 * 3 + 2)] = tangent.z; bitangents[int(id1 * 3)] = bitangent.x; bitangents[int(id1 * 3 + 1)] = bitangent.y; bitangents[int(id1 * 3 + 2)] = bitangent.z; bitangents[int(id2 * 3)] = bitangent.x; bitangents[int(id2 * 3 + 1)] = bitangent.y; bitangents[int(id2 * 3 + 2)] = bitangent.z; bitangents[int(id3 * 3)] = bitangent.x; bitangents[int(id3 * 3 + 1)] = bitangent.y; bitangents[int(id3 * 3 + 2)] = bitangent.z; } } mesh.tangents = tangents; mesh.bitangents = bitangents;

hopefully you will know right off the bat what the issue is, thank for your time

edit:

ah, looks like all I need to do is average them as I would the normals? if that's case then boy am I a melon.