0
\$\begingroup\$

enter image description here

I have a point A (x, y, z), and a Box: Center (x, y, z), Size (Width, Height)

How to get the closest point in the box from the point A ?

In Unity I can create a bound, and I can find the non-rotated position like that:

Bounds bounds = _mesh.bounds;
Vector3 closestPoint = bounds.ClosestPoint(pointA);

But then If the bound is rotated, the result is not correct. So I have 2 options:

Find the way to rotate my closestPoint from the pivot. Find the math formula myleft.

If someone can help ! thanks.

EDIT: here a video: the red point is the one find with bound.ClosestPoint the yellow point is the one find with:

Vector3 closestPointInverse = _currentTarget.InverseTransformPoint(closestPoint);

https://youtu.be/RMRRtSaJv8w

I have also tryed to do my own rotateFromPivot function:

public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
    {
        return Quaternion.Euler(angles) * (point - pivot) + pivot;
    }

When I use it, I get the same result with the InverseTransformPoint method.

\$\endgroup\$
2
  • \$\begingroup\$ Did you try first rotating the point into the mesh's coordinate space with transform.InverseTransformPoint? \$\endgroup\$
    – DMGregory
    Sep 29, 2019 at 13:52
  • \$\begingroup\$ I have edited my question: yes I have, see the result in the video \$\endgroup\$
    – Ugo Hed
    Sep 29, 2019 at 14:18

2 Answers 2

1
\$\begingroup\$

Note that I said "first" not "after" - you're using the transform method backwards.

Vector3 ClosestPointOnMeshOBB(MeshFilter meshFilter, Vector3 worldPoint) {
     // First, we transform the point into the local coordinate space of the mesh.
     var localPoint = meshFilter.transform.InverseTransformPoint(worldPoint);

     // Next, we compare it against the mesh's axis-aligned bounds in its local space.
     var localClosest = meshFilter.sharedMesh.bounds.ClosestPoint(localPoint);

     // Finally, we transform the local point back into world space.
     return meshFilter.transform.TransformPoint(localClosest);
}
\$\endgroup\$
0
\$\begingroup\$

you should use colliders and raycast. tray to make a box collider for you box mesh. then cast a ray from point to center of box.

  void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out hit))
            {
               print(hit.point);

            }
        }
    }

hit.point is nearest point t you empty object or point.

\$\endgroup\$

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .