#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 } }