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\$ Commented Sep 29, 2019 at 13:52
  • \$\begingroup\$ I have edited my question: yes I have, see the result in the video \$\endgroup\$ Commented 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.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.