Esempio n. 1
0
        /// <summary>
        /// 射线
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public IEnumerable <MGFObject> RayCast2D(Fix64Vector2 start, Fix64Vector2 end)
        {
            HashSet <MGFObject> ls = new HashSet <MGFObject>();

            foreach (var item in m_Objects)
            {
                Fix64Vector2   hit;
                Fix64Vector2[] vertex  = item.GetVertex();
                Fix64Vector2[] vertexN = new Fix64Vector2[vertex.Length];
                for (int j = 0; j < vertexN.Length; j++)
                {
                    vertexN[j] = vertex[j] + item.GetPos();
                }
                for (int j = 0; j < 4; j++)
                {
                    int nt = j + 1;
                    if (j == 3)
                    {
                        nt = 0;
                    }
                    if (MGFPhysics.lineIntersection(start, end, vertexN[j], vertexN[nt], out hit))
                    {
                        Debug.Log(item.name + " line P1" + vertexN[j] + " P2 " + vertexN[nt] + " hit " + hit);
                        ls.Add(item);
                        break;
                    }
                }
            }
            return(ls);
        }
Esempio n. 2
0
        /// <summary>
        /// 射线
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public List <MGFObject> RayCast2D(Fix64Vector2 start, Fix64Vector2 end)
        {
            List <MGFObject> ls = new List <MGFObject>();

            for (int i = 0; i < m_Objects.Count; i++)
            {
                Fix64Vector2   hit;
                Fix64Vector2[] vertex  = m_Objects[i].GetVertex();
                Fix64Vector2[] vertexN = new Fix64Vector2[vertex.Length];
                for (int j = 0; j < vertexN.Length; j++)
                {
                    vertexN[j] = vertex[j] + m_Objects[i].GetPos();
                }
                for (int j = 0; j < 4; j++)
                {
                    int nt = j + 1;
                    if (j == 3)
                    {
                        nt = 0;
                    }
                    if (MGFPhysics.lineIntersection(start, end, vertexN[j], vertexN[nt], out hit))
                    {
                        Debug.Log(m_Objects[i].name + " line P1" + vertexN[j] + " P2 " + vertexN[nt] + " hit " + hit);
                        ls.Add(m_Objects[i]);
                        break;
                    }
                }
            }
            return(ls);
        }
Esempio n. 3
0
 /// <summary>
 /// 碰撞检测
 /// </summary>
 public void CheckCollision()
 {
     foreach (var item in m_DynamicObjs)
     {
         if (item.IsCollisionAble == false)
         {
             continue;
         }
         if (lcd.Count != 0)
         {
             lcd.Clear();
         }
         //获得需要进行碰撞检测的list
         m_Qt.Retrieve(lcd, item);
         bool flag = false;
         foreach (var item2 in lcd)
         {
             if (MGFPhysics.CheckBoundings(item2, item))
             {
                 if (MGFPhysics.GJK(item, item2))
                 {
                     flag = true;
                     item.CalcCollisionDir(item2);
                     item.OnMGFCollision(item2);
                     Debug.Log(item.name + " " + item2.name);
                 }
             }
         }
         item.IsCollsioning = flag;
     }
 }
Esempio n. 4
0
        /// <summary>
        /// 碰撞检测
        /// </summary>
        public void CheckCollision()
        {
            for (int i = 0; i < m_DynamicObjs.Count; i++)
            {
                if (m_DynamicObjs[i].IsCollisionAble == false)
                {
                    continue;
                }
                if (lcd.Count != 0)
                {
                    lcd.Clear();
                }
                //获得需要进行碰撞检测的list
                m_Qt.Retrieve(lcd, m_DynamicObjs[i]);
                bool flag = false;
                for (int j = 0; j < lcd.Count; j++)
                {
                    //先计算包围盒是否碰撞 再通过GJK检测多边形是否碰撞
                    if (MGFPhysics.CheckBoundings(lcd[j], m_DynamicObjs[i]))
                    {
                        if (MGFPhysics.GJK(m_DynamicObjs[i], lcd[j]))
                        {
                            flag = true;
                            m_DynamicObjs[i].CalcCollisionDir(lcd[j]);
                            m_DynamicObjs[i].OnMGFCollision(lcd[j]);
                        }
                    }
                }

                m_DynamicObjs[i].IsCollsioning = flag;
            }
        }