Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unity3d - Get GameObject height for a rotating object

Tags:

c#

unity3d

I want to get a GameObject's height. I have tried with:

this.GetComponent<MeshRenderer>().bounds.size.y

But the problem with bounds is that it works with static objects only. When you have a moving object and if the rotation of the object is not perfectly aligned, the bounds (height) is not accurate anymore because it returns the height of the bounds that is a square and if you tilt an object like a plate you get the bounds height which is not accurate to the height of the object.

It is an Axis-Aligned Bounding Box (also known as an "AABB").

Please check the image I attached, there you can see the problem with moving objects and if you rotate them how the height is not accurate anymore.

enter image description here

Did anyone else have this kind of problem?

Any advice on how to get the object's height accurately?

like image 281
Adrian Ivasku Avatar asked May 09 '18 12:05

Adrian Ivasku


People also ask

How do you snap vertices in unity?

Press and hold the V key to activate the vertex snapping mode. Move your cursor over the vertex on your mesh that you want to use as the pivot point. Hold down the left button once your cursor is over the desired vertex and drag your mesh next to any other vertex on another mesh.


1 Answers

One option is to use the Game Object's Collider.

You can relatively easily find the height and width of a collider so this is one way you can measure the dimensions of a game object. The collider, for example a box collider on the game object, will have to fully encompasses the object. You can do this be resizing the collider until it snugly wraps around your game object. Then when you want to find a certain dimension of the object instead find that dimension on the collider and multiply by the Game Object's transform.scale.

Here are some examples I have tested.

Example 1:

CapsuleCollider m_Collider = GetComponent<CapsuleCollider>();
var height = m_Collider.height  * transform.localScale.y;

https://docs.unity3d.com/ScriptReference/CapsuleCollider-height.html

or

Example 2:

   BoxCollider m_Collider = GetComponent<BoxCollider>();
   var height = m_Collider.size.y  * transform.localScale.y;
   var width = m_Collider.size.x  * transform.localScale.x;
   var breadth = m_Collider.size.z  * transform.localScale.z;

https://docs.unity3d.com/ScriptReference/BoxCollider-size.html

Hopefully one of these will work for you.

If not, then a second inconvenient way you can find the height is to create 2 proxy objects as children at the top and bottom of your object. Afterwards find the scalar distance between them.

like image 56
Tyler S. Loeper Avatar answered Sep 19 '22 19:09

Tyler S. Loeper