(barys, vertex_idxs, v_tangents, v_bitangents, v_normals)
| 110 | return v_t, v_b, v_n |
| 111 | |
| 112 | def interpolate_tbn(barys, vertex_idxs, v_tangents, v_bitangents, v_normals): |
| 113 | nr_positions=barys.shape[0] |
| 114 | |
| 115 | sampled_tangents = v_tangents[vertex_idxs.reshape(-1),:].reshape(nr_positions,3,3) #nr_positions x vertices_on_face(3) x 3 |
| 116 | weighted_tangents = sampled_tangents*barys.reshape(nr_positions,3,1) |
| 117 | point_tangents = weighted_tangents.sum(axis=1) |
| 118 | point_tangents= point_tangents/np.linalg.norm(point_tangents,axis=-1, keepdims=True) |
| 119 | |
| 120 | |
| 121 | sampled_normals = v_normals[vertex_idxs.reshape(-1),:].reshape(nr_positions,3,3) |
| 122 | weighted_normals = sampled_normals*barys.reshape(nr_positions,3,1) |
| 123 | point_normals = weighted_normals.sum(axis=1) |
| 124 | point_normals= point_normals/np.linalg.norm(point_normals,axis=-1, keepdims=True) |
| 125 | |
| 126 | |
| 127 | point_bitangents=np.cross(point_normals,point_tangents) |
| 128 | point_bitangents= point_bitangents/np.linalg.norm(point_bitangents,axis=-1, keepdims=True) |
| 129 | |
| 130 | #make sure the tangent is also orthogonal |
| 131 | point_tangents=np.cross(point_bitangents,point_normals) |
| 132 | point_tangents= point_tangents/np.linalg.norm(point_tangents,axis=-1, keepdims=True) |
| 133 | |
| 134 | return point_tangents, point_bitangents, point_normals |
| 135 | |
| 136 | |
| 137 | #strands_tbn is [B, Nr_strands, 3, 3] where each column of the 3x3 matrix is T,B,N |
no outgoing calls
no test coverage detected