public override void BeginApplyStroke(Ray ray) { RaycastHit hit; Mesh msh = target.GetComponent <MeshFilter>().sharedMesh; didHit = (RXLookingGlass.IntersectRayMesh(ray, msh, target.transform.localToWorldMatrix, out hit)); if (didHit) { var triangles = msh.triangles; int triangle = hit.triangleIndex; int i0 = triangles[triangle]; int i1 = triangles[triangle + 1]; int i2 = triangles[triangle + 2]; var bary = hit.barycentricCoordinate; Matrix4x4 mtx = target.transform.worldToLocalMatrix; normal = target.GetSafeNormal(i0) * bary.x + target.GetSafeNormal(i1) * bary.y + target.GetSafeNormal(i2) * bary.z; tangent = target.GetSafeTangent(i0) * bary.x + target.GetSafeTangent(i1) * bary.y + target.GetSafeTangent(i2) * bary.z; normal = mtx.MultiplyVector(mtx.MultiplyVector(normal)); Vector3 tng = new Vector3(tangent.x, tangent.y, tangent.z); tng = mtx.MultiplyVector(mtx.MultiplyVector(tng)); tangent.x = tng.x; tangent.y = tng.y; tangent.z = tng.z; } }