Как проверить, сталкивается ли объект в верхней или нижней части сферы

#c# #unity3d #collision-detection

Вопрос:

У меня есть сталкивающийся объект, который может прийти с любого направления, и я хотел бы проверить положение относительно центра сферы.

введите описание изображения здесь

Моя идея состояла в том, чтобы создать вектор с тем же направлением, что и стрелка, проходящая через центр сферы, а затем проверить, находится ли положение стрелки над или под новым вектором, но я не знаю, как этого добиться.

Ответ №1:

В общем случае Вектор не имеет положения. Это только направление и величина в пространстве. Позиция в основном представляет собой сам вектор, который указывает от начала координат мира (0,0,0) к соответствующей позиции. Поэтому, если у вас есть только вектор направления, он не содержит никакой информации о местоположении.

Вам нужно было бы лучше определить верх и низ, но если вы просто хотите проверить глобальное пространство, вы можете просто проверить, находится ли точка контакта столкновения выше или ниже центра сферы, сравнивая их Y значение оси.

Что-то вроде, например

 // Assuming this script is on the Sphere private void OnCollisionEnter(Collision collision) {  // You could of course take all contact points into account and take an average etc  // but to keep things simple just use only one for now  var contact = collision.GetContact(0);  var contactPoint = contact.point;  var ownCenter = contact.thisCollider.bounds.center;   if(contactPoint.y gt; ownCenter.y)  {  Debug.Log("Hit on top half");  }  else  {  Debug.Log("Hit on bottom half");  } }  

Если вы хотите проверить локальное пространство (например, потому что ваша сфера повернута, как на вашей графике), вы можете использовать почти то же самое, но сначала просто преобразуйте позиции в локальное пространство

 var contactPoint = transform.InverseTransformPoint(contact.point);  // In the case for a sphere this should most probably be equal to simply using 0,0,0 // In case of a "SphereCollider" you could also use that specific type and then use "sphereCollider.center" which already is in local space // But to have it working generally keep using the center for now var ownCenter = transform.InverseTransformPoint(contact.thisCollider.bounds.center);  

Ответ №2:

Вы можете определить точку удара. Затем вы можете измерить расстояние от верхней и нижней части сферы до точки удара. Меньшее расстояние всегда является тем, к которому оно ближе.

 void OnCollisionEnter(Collision col) {  var top = transform.position   transform.localscale.y/2 * transform.up;  var bottom = transform.position   transform.localscale.y/2 * -transform.up;    var isTop = Vector3.Distance(top, collision.point) lt; Vector3.Distance(bottom, collision.point);    if (isTop) {  // It hit the top    } else {  // It hit the bottom    }  }