コード例 #1
0
        public Vector3[] GetSegmentPoints(Vector3 worldPoint)
        {
            Vector3[] res = new Vector3[2];

            Vector3 initSegment = Vector3.zero;
            Vector3 endSegment  = Vector3.zero;

            BranchPoint nearestPoint  = GetNearestPointFrom(worldPoint);
            BranchPoint nextPoint     = nearestPoint.GetNextPoint();
            BranchPoint previousPoint = nearestPoint.GetPreviousPoint();

            if (nextPoint != null && previousPoint != null)
            {
                float distanceToNextPoint     = (worldPoint - nextPoint.point).magnitude;
                float distanceToPreviousPoint = (worldPoint - previousPoint.point).magnitude;

                if (distanceToNextPoint <= distanceToPreviousPoint)
                {
                    initSegment = nearestPoint.point;
                    endSegment  = nextPoint.point;
                }
                else
                {
                    initSegment = previousPoint.point;
                    endSegment  = nearestPoint.point;
                }
            }

            res[0] = initSegment;
            res[1] = endSegment;


            return(res);
        }
コード例 #2
0
        //private Vector3 GetNewLeafUpward()
        //{
        //	Vector3 oldForward = leaves[i].lpForward;
        //	Vector3 newLeafPosition = Vector3.LerpUnclamped(previousPoint.point, nextPoint.point, leaves[i].displacementFromInitSegment);

        //	float angle = Vector3.Angle(oldForward, newForward);
        //	Vector3 axis = cameraForward;
        //	Vector3 crossNewForwardOldForward = Vector3.Cross(newForward, oldForward);
        //	float sign = Mathf.Sign(Vector3.Dot(crossNewForwardOldForward, cameraForward));
        //	Vector3 newUpward = Quaternion.AngleAxis(angle * -sign, axis) * leaves[i].lpUpward;

        //	return newUpward;
        //}

        public void RepositionLeavesAfterAdd02(BranchPoint newPoint)
        {
            BranchPoint previousPoint = newPoint.GetPreviousPoint();
            BranchPoint nextPoint     = newPoint.GetNextPoint();

            List <LeafPoint> leaves = new List <LeafPoint>();

            GetLeavesInSegment(previousPoint, leaves);
            //leaves.AddRange(GetLeavesInSegment(removedPoint));

            Vector3 dirSegment01 = (newPoint.point - previousPoint.point).normalized;
            Vector3 dirSegment02 = (nextPoint.point - newPoint.point).normalized;

            for (int i = 0; i < leaves.Count; i++)
            {
                Vector3 oldLeafVector01 = leaves[i].point - branchPoints[leaves[i].initSegmentIdx].point;
                Vector3 oldLeafVector02 = leaves[i].point - branchPoints[leaves[i].endSegmentIdx].point;

                Vector3 projectionOnSegment01     = previousPoint.point + dirSegment01 * Vector3.Dot(oldLeafVector01, dirSegment01);
                Vector3 projectionOnSegment02     = nextPoint.point + dirSegment02 * Vector3.Dot(oldLeafVector02, dirSegment02);
                Vector3 newLeafPositionToNewPoint = newPoint.point - projectionOnSegment01;

                if (Vector3.Dot(newLeafPositionToNewPoint, dirSegment01) >= 0)
                {
                    leaves[i].SetValues(projectionOnSegment01, leaves[i].lpLength, dirSegment01, leaves[i].lpUpward, leaves[i].chosenLeave, previousPoint, newPoint);
                }
                else
                {
                    leaves[i].SetValues(projectionOnSegment02, leaves[i].lpLength, dirSegment02, leaves[i].lpUpward, leaves[i].chosenLeave, newPoint, nextPoint);
                }
            }
        }
コード例 #3
0
        public void RepositionLeavesAfterRemove02(BranchPoint removedPoint)
        {
            BranchPoint previousPoint = removedPoint.GetPreviousPoint();
            BranchPoint nextPoint     = removedPoint.GetNextPoint();

            List <LeafPoint> leaves = GetLeavesInSegment(previousPoint);

            leaves.AddRange(GetLeavesInSegment(removedPoint));

            for (int i = 0; i < leaves.Count; i++)
            {
                Vector3 pointToLeaf   = leaves[i].point - previousPoint.point;
                Vector3 newSegmentDir = (nextPoint.point - previousPoint.point).normalized;
                float   dotProduct    = Vector3.Dot(pointToLeaf, newSegmentDir);

                Vector3 newLeafPosition = previousPoint.point + newSegmentDir * dotProduct;

                //leaves[i].point = newLeafPosition;
                leaves[i].SetValues(newLeafPosition, leaves[i].lpLength, previousPoint.initialGrowDir,
                                    -previousPoint.grabVector, leaves[i].chosenLeave, previousPoint, nextPoint);

                //leaves[i].lpLength = 0f;
            }
        }