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); }
//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); } } }
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; } }