- Home /
Question by
Rizzutp · Feb 05, 2020 at 10:06 AM ·
imagerendertextureboundingbox
Saving all 8 vertices of a 3D Bounding Box with respect to the 2D rendering of a camera
Hello there. I wrote the following code, in order to save all 8 vertices of a 3D bounding box. I need this, since I previously took pitcures of some objects in my scene: after that, I create a CSV in which I save the coordinates of the 8 vertices with respect to the newly generated image. I'm specifying this because I'm NOT interested in finding a 2D bounding box, it's a slightly different problem, which was already discussed in many threads! Here's my code:
public Vector3[] GetBoundingBoxVertices (GameObject obj, Camera cam)
{
if (cam.WorldToScreenPoint(obj.GetComponentInChildren<Renderer>().bounds.center).z < 0)
Debug.LogWarning("The object " + obj.name + " is behind the camera!");
Renderer[] rends = obj.GetComponentsInChildren<Renderer>();
Bounds bounds = rends[0].bounds;
foreach (Renderer rend in rends)
{
bounds = bounds.GrowBounds(rend.bounds);
}
Vector3 center = bounds.center;
Vector3 extents = bounds.extents;
Vector3 frontTopLeft = new Vector3(center.x - extents.x, center.y + extents.y, center.z - extents.z);
Vector3 frontTopRight = new Vector3(center.x + extents.x, center.y + extents.y, center.z - extents.z);
Vector3 frontBottomLeft = new Vector3(center.x - extents.x, center.y - extents.y, center.z - extents.z);
Vector3 frontBottomRight = new Vector3(center.x + extents.x, center.y - extents.y, center.z - extents.z);
Vector3 backTopLeft = new Vector3(center.x - extents.x, center.y + extents.y, center.z + extents.z);
Vector3 backTopRight = new Vector3(center.x + extents.x, center.y + extents.y, center.z + extents.z);
Vector3 backBottomLeft = new Vector3(center.x - extents.x, center.y - extents.y, center.z + extents.z);
Vector3 backBottomRight = new Vector3(center.x + extents.x, center.y - extents.y, center.z + extents.z);
Vector3[] results = new Vector3[8];
results[0] = frontTopLeft;
results[1] = frontTopRight;
results[2] = frontBottomLeft;
results[3] = frontBottomRight;
results[4] = backTopLeft;
results[5] = backTopRight;
results[6] = backBottomLeft;
results[7] = backBottomRight;
for (int i = 0; i < results.Length; i++)
{
//World space
results[i] = obj.transform.TransformPoint(results[i]);
//GUI space
results[i] = cam.WorldToScreenPoint(results[i]);
results[i].y = Screen.height - results[i].y;
}
return results;
}
Am I doing right or there are some sort of issues? Any advice?
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612222754im_/https://answers.unity.com/themes/thub/images/avi.jpg)