Hello,
I’ve got a hell of an headache trying to debug that during 3 days.
So there is the problem :
First of all, I’m working with unity script (C#).
I’ve got 2 prefabs which contain a meshfilter. I’m trying to compare the vertices positions, vertex per vertex, between these two prefabs.
Basically, I’m using gameObject.transform.GetComponent().mesh.vertices to get the vertices of each mesh.
As these vertice are in local coordinates, I’m using gameObject.transform.TransformPoint() to put it in world space, and gameObject.transform.InverseTransformPoint() to put it back in local space.
So there is my algorithm :
// Run through vertices
for(int j = 0; j < mesh1vertices.Count; j++)
{
Vector3 mesh1worldpoint = mesh1transform.TransformPoint(mesh1vertices[j]);
Vector3 mesh2worldpoint = mesh2transform.TransformPoint(mesh2vertices[j]);
// Check if points are equals, if not, fix that mess !
if( Vector3.Distance(mesh1worldpoint, mesh2worldpoint) > Mathf.Epsilon )
{
mesh1vertices[j] = mesh1transform.InverseTransformPoint(mesh2worldpoint);
}
}
// Update mesh
mesh1.vertices = mesh1vertices;
mesh1.RecalculateNormals();
mesh1.RecalculateBounds();
When I compared points in world coordinate, they’re differents (not far from each other, but still different). But when I go back to local coordinates, mesh1transform.InverseTransformPoint(mesh2worldpoint) is exactly the same value than mesh1vertices[j] which means that InverseTransformPoint() has some crappy rounds or I just didn’t get it.
If someone can give me a clue or a solution, it’ll prevent me from killing myself…
Thanks for the answer but I already know that
That’s not my problem here. I’ve got troubles with InverseTransformPoint() which returns me exactly the same local coordinates for 2 differents Vector3 in world coordinates.
There is an example :
Vector3 A = new Vector3(-2.0f, -2.0f, 47.4f);
Vector3 B = new Vector3(-2.0f, -2.0f, 47.5f);
Debug.Log(mesh1transform.InverseTransformPoint(A));
Debug.Log(mesh1transform.InverseTransformPoint(B));
--------------------------------------------------------
Prints :
(0.0, 0.0, 0.0)
(0.0, 0.0, 0.0)
Vector3 A = new Vector3(-1.986626f, -1.998096f, 47.3696f);
Vector3 B = new Vector3(-1.990423f, -2.0f, 47.50004f);
Debug.Log(mesh1transform.InverseTransformPoint(A));
Debug.Log(mesh1transform.InverseTransformPoint(B));
--------------------------------------------------------
Prints :
(-0.02488029, 0.0, -0.025)
(-0.02488029, 0.0, 0.025)
So yeah they’re different, but when I’m doing :
A = mesh1transform.InverseTransformPoint(B);
B = mesh1transform.InverseTransformPoint(B);
It didn’t change anything on screen, I mean A isn’t moving at all and I still see them “differents”.
// Check if points are equals, if not, fix that mess !
if( Vector3.Distance(mesh1worldpoint, mesh2worldpoint) < Mathf.Epsilon )
{
tmpvertices[j] = mesh1transform.InverseTransformPoint(mesh2worldpoint);
}
According to your commentary the error may be there, you go in the function when the points are close enought ( ~ equals). You want the opposite, so I would change with “> Mathf.Epsilon.”
Yeah that’s my bad. I already fixed that bug, but I forgot to update the topic. I’m doing it right now.
According to another answer I had on the forum, I also tried that :