Exemple #1
0
        public override void AddPoint(Vector3 point)
        {
            //base.AddPoint(Point);
            if (m_AllSubKeyPathpoints.Count == 0)
            {
                QuadPoint _firstPoint = CreateFirstMeshPoint(point) as QuadPoint;
                m_AllSubKeyPathpoints.Add(_firstPoint);
                return;
            }

            QuadPoint previousQuaPoint = m_AllSubKeyPathpoints[m_AllSubKeyPathpoints.Count - 1] as QuadPoint; //上一个Key路径点
            Vector3   direction        = point - previousQuaPoint.Point_Center;                               //两个Key路径点的向量

            if (m_AllSubKeyPathpoints.Count == 1)
            {  //第一个点的方向有第二个点决定
                previousQuaPoint.CenterLeftDirNor = new Vector3(-1, 0, 0);
                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadRight());
                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadLeft());
            }



            Vector3          controllPoint1 = VectorExpand.GetPointPerpendicularTo(previousQuaPoint.GetQuadLeft(), previousQuaPoint.Point_Center, point); //获得垂直于上一个QuadPoint 点且在direction 平面的单位控制点
            List <QuadPoint> subQuadPoint   = new List <QuadPoint>();                                                                                     // 子节点Point

            for (int dex = 0; dex < previousQuaPoint.SubsectionCount; dex++)
            {
                Vector3   _subPoint = Curve.CalculateBezier(previousQuaPoint.Point_Center, point, controllPoint1, (dex + 1) * 1f / (previousQuaPoint.SubsectionCount)); //根据二阶贝塞尔曲线获得 一个分割点
                QuadPoint currentSubPoint;
                int       previousStartIndex = m_AllSubMeshPoints.Count - 2;
                if (dex == 0)
                {
                    currentSubPoint = CreateSubKeyPoint(previousQuaPoint, _subPoint) as QuadPoint;
                }
                else
                {
                    currentSubPoint = CreateSubKeyPoint(subQuadPoint[subQuadPoint.Count - 1], _subPoint) as QuadPoint;
                }

                subQuadPoint.Add(currentSubPoint);
                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(previousStartIndex + 1);
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadRight());
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadLeft());
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);  //上一个Right,上一个Left,当前的Left

                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);  //上一个Right,当前的Left,但情感的Left

                if (dex == previousQuaPoint.SubsectionCount - 1)
                {
                    m_AllSubKeyPathpoints.Add(currentSubPoint);
                }
            }
        }
        public override void AddPoint(Vector3 point)
        {
            //base.AddPoint(point);

            if (m_AllSubKeyPathpoints.Count == 0)
            {
                Quad3DPoint _firstPoint = CreateFirstMeshPoint(point) as Quad3DPoint;
                m_AllSubKeyPathpoints.Add(_firstPoint);
                m_AllSubTrangles.Clear();
                m_AllSubMeshPoints.Clear();
                return;
            }

            Quad3DPoint previousQuaPoint = m_AllSubKeyPathpoints[m_AllSubKeyPathpoints.Count - 1] as Quad3DPoint; //上一个Key路径点
            Vector3     direction        = point - previousQuaPoint.Point_Center;                                 //两个Key路径点的向量


            if (m_AllSubKeyPathpoints.Count == 1)
            { //处理第一个Key点
                //Debug.Log("Deal With The First Point");
                previousQuaPoint.CenterDownUptDirNor = Vector3.Cross(new Vector3(-1, 0, 0), direction).normalized;
                previousQuaPoint.CenterLeftDirNor    = Vector3.Cross(direction, previousQuaPoint.CenterDownUptDirNor).normalized;

                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadUpRight());   //Up Right
                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadUpLeft());    //Up left
                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadDownRight()); //Down Right
                m_AllSubMeshPoints.Add(previousQuaPoint.GetQuadDownLeft());  //Down Left

                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 3);  //下三角

                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 3);  //
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 4);  //上三角
            }

            List <Quad3DPoint> subQuadPoint = new List <Quad3DPoint>(); // 子节点Point

            if (m_AllSubKeyPathpoints.Count >= 2)
            {
                Vector3 KeyPathDir1 = m_AllSubKeyPathpoints[m_AllSubKeyPathpoints.Count - 1].Point_Center - m_AllSubKeyPathpoints[m_AllSubKeyPathpoints.Count - 2].Point_Center; //上两个KeyPath Point 方向
                Vector3 KeyPathDir2 = point - m_AllSubKeyPathpoints[m_AllSubKeyPathpoints.Count - 1].Point_Center;                                                               //上一个KeyPath 点到当前KeyPath Point 的方向
                float   angle       = Vector3.Angle(KeyPathDir1, KeyPathDir2);
                Debug.Log("angle=" + angle);
                //if (angle >= 89.5f)
                //{   //需要绘制一个三角锥 而不是长方体
                //    if (point.y < AllKeyPathpoints[AllKeyPathpoints.Count - 1].Point_Center.y)
                //    { //在下面
                //    }
                //    else
                //    {

                //    }
                //    return;
                //}//if
            }//if

            //获得左右两个面曲线的控制点
            Vector3 controllPointLeftRight = VectorExpand.GetPointPerpendicularTo(previousQuaPoint.GetQuadUpLeft() - new Vector3(0, previousQuaPoint.LineHeight / 2f, 0), previousQuaPoint.Point_Center, point);  //获得垂直于上一个QuadPoint 点且在direction 平面的单位控制点

            for (int dex = 0; dex < previousQuaPoint.SubsectionCount; dex++)
            {
                Vector3     _subPoint = Curve.CalculateBezier(previousQuaPoint.Point_Center, point, controllPointLeftRight, (dex + 1) * 1f / (previousQuaPoint.SubsectionCount)); //根据二阶贝塞尔曲线获得 一个分割点
                Quad3DPoint currentSubPoint;
                int         previousStartIndex = m_AllSubMeshPoints.Count - 4;
                if (dex == 0)
                {
                    currentSubPoint = CreateSubKeyPoint(previousQuaPoint, _subPoint) as Quad3DPoint;
                }
                else
                {
                    currentSubPoint = CreateSubKeyPoint(subQuadPoint[subQuadPoint.Count - 1], _subPoint) as Quad3DPoint;
                }

                subQuadPoint.Add(currentSubPoint);

                #region Up Plane
                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(previousStartIndex + 1);
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadUpRight());
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadUpLeft());
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1); //上面 左三角

                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1); //上面 右三角
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                #endregion

                #region Down Plane
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadDownRight());
                m_AllSubMeshPoints.Add(currentSubPoint.GetQuadDownLeft());

                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(previousStartIndex + 2); //下面 右倒三角以显示

                m_AllSubTrangles.Add(previousStartIndex + 2);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(previousStartIndex + 3);;  //下面左倒三角以显示
                #endregion

                #region LeftPlane
                m_AllSubTrangles.Add(previousStartIndex + 1);
                m_AllSubTrangles.Add(previousStartIndex + 3);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1); //左侧 到下三角

                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 3);
                m_AllSubTrangles.Add(previousStartIndex + 1); //左侧倒上三角

                #endregion

                #region Right Plane
                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 4);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);

                m_AllSubTrangles.Add(previousStartIndex);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                m_AllSubTrangles.Add(previousStartIndex + 2);

                #endregion

                #region Forward Plane
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 2);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 4);   //前倒 下三角


                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 1);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 4);
                m_AllSubTrangles.Add(m_AllSubMeshPoints.Count - 3);   //前倒 上三角

                #endregion

                if (dex == previousQuaPoint.SubsectionCount - 1)
                {
                    m_AllSubKeyPathpoints.Add(currentSubPoint);
                    //Debug.Log("Add Key Path " + dex);
                }
            }
        }