Encapsulated bounds center error
Hi, I am trying to encapsulate multiple objets. I need to get capsule size as well as capsule rotation and position. My code is able to get correct size and rotation, but position is sometimes wrong. Here is my code:
private IEnumerator EncapsulateObj()
{
Transform trackedTransform = trackedObj.transform;
_renderers = trackedObj.GetComponentsInChildren<Renderer>();
if (_renderers.Length == 0)
{
_capsule = new Bounds(trackedObj.transform.position, Vector3.zero);
yield return null;
}
Quaternion originalRotation = trackedTransform.rotation;
trackedTransform.rotation = Quaternion.Euler(0, 0, 0);
bool foundNotNullRenderer = false;
if (_renderers.Length > 0)
{
for (int i = 0; i < _renderers.Length; i++)
{
if (_renderers[i])
if (!foundNotNullRenderer)
{
_capsule = _renderers[i].bounds;
foundNotNullRenderer = true;
continue;
}
_capsule.Encapsulate(_renderers[i].bounds);
}
}
trackedTransform.rotation = originalRotation;
positionHolder.transform.position = transform.TransformPoint(_capsule.center);
positionHolder.transform.localScale = _capsule.size;
positionHolder.transform.rotation = originalRotation;
}
I guess its problem with pivot but I am not sure how to gix it.
I do place BoxCollider to represent bounding box. Yellow model is trackedTransform
.
This is Good capsule And this is wrong
Thank you for any suggestions.
Answer by tomomichalek · Nov 12, 2020 at 08:26 AM
ok, so i guess i came up with the solution. Bassically generate 2 bounds, one will hold size, the otherone will hold position. To get size, original code is ok, to get center you won't rotate objects. It looks like this: _renderers = trackedObj.GetComponentsInChildren(); if (_renderers.Length == 0) { _capsule = new Bounds(trackedObj.transform.position, Vector3.zero); yield return null; } Transform holderTransform = positionHolder.transform; holderTransform.position = Vector3.zero;
Quaternion originalRotation = trackedObj.rotation;
bool foundNotNullRenderer = false;
_capsule = new Bounds();
Bounds centerBounds = new Bounds(); //to get center
if (_renderers.Length > 0)
{
for (int i = 0; i < _renderers.Length; i++)
{
if (_renderers[i])
{
Transform rendTrans = _renderers[i].transform;
Quaternion originalRot = rendTrans.rotation;
rendTrans.rotation = Quaternion.Euler(0,0,0);
if (!foundNotNullRenderer)
{
_capsule = _renderers[i].bounds;
foundNotNullRenderer = true;
rendTrans.rotation = originalRotation;
centerBounds = _renderers[i].bounds;
continue;
}
_capsule.Encapsulate(_renderers[i].bounds);
rendTrans.rotation = originalRotation;
centerBounds.Encapsulate(_renderers[i].bounds);
}
}
}
holderTransform.position = transform.TransformPoint(centerBounds.center);
holderTransform.localScale = _capsule.size;
holderTransform.rotation = originalRotation;
holderTransform.SetParent(Variables.Objects.initializeTransform.Value.parent);