【问题标题】:How to get contact points from a trigger?如何从触发器中获取接触点?
【发布时间】:2015-07-26 20:20:03
【问题描述】:

我现在需要一个不会发生碰撞但还能为我提供碰撞接触点的 2d 传感器。

触发器不给我接触点,碰撞器给我接触点但会导致碰撞。

我尝试在使用碰撞器时禁用碰撞,以期获得碰撞进入回调,但实际上并没有发生碰撞,但没有运气。

那么如何从触发器中获取接触点?或者如何在不引起碰撞的情况下获得与刚体的碰撞回调?

基本上我有一个圆圈,我想充当雷达,但我希望它在接触点方面也相当准确。

【问题讨论】:

    标签: c# unity3d unityscript


    【解决方案1】:

    您可以使用 OnTriggerEnter 函数获取联系人

    OnTriggerEnter(Collider other)
    {
        RaycastHit hit;
        if (Physics.Raycast(transform.position, transform.forward, out hit))
        {
            Debug.Log("Point of contact: "+hit.point);
        }
    }
    

    【讨论】:

      【解决方案2】:

      由于这是 Google 的最高搜索结果而发布。

      我认为有一种比光线投射更简单(当然取决于你如何看待它)和更精确的方法来做到这一点。

      private void OnTriggerEnter(Collider collider)
      { 
          var collisionPoint = collider.ClosestPoint(transform.position);
      }
      

      collider 是输入触发器的碰撞器,transform 是触发器的变换。正如函数名所暗示的,这个填充在最接近所述触发器的碰撞器上找到一个点。 当然,这并不是特别精确,尤其是对于形状怪异的对撞机,但很可能对于大多数情况来说已经足够了,对于射弹或刀片击中刚体角色来说绝对足够好。

      作为奖励,这里有一个简单的向量数学来查找碰撞法线:

      var collisionNormal = transform.position - collisionPoint;
      

      再一次,不是超级精确,也不会是实际正确的法线(即垂直)到撞击点,但与之前的一样 - 很可能会足够好。

      玩得开心!

      【讨论】:

      • 这不一定总是正确的......特别是如果你的枢轴点不在你的对撞机的中心,这可能会返回完全错误的结果;)
      【解决方案3】:

      您应该使用OnCollisionEnter,但添加一个rigidbody 并将isTrigger 设置为false 并将刚体isKinematic 设置为true 然后它将像触发器一样起作用,您可以获得接触点像这样

       void OnCollisionEnter(Collision collision) {
              foreach (ContactPoint contact in collision.contacts) {
                  Debug.DrawRay(contact.point, contact.normal, Color.white);
              }
      

      【讨论】:

      • 谢谢,这是关键。我让它工作了。还要感谢我也必须使用光线投射。
      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2021-09-14
      • 1970-01-01
      相关资源
      最近更新 更多