Aligning a path, along a another dynamically

Started by
5 comments, last by ferrous 9 years, 11 months ago

Am building a 2D top down game where there are roads, and intersections, and the user is creating a path, for the car to follow, but that path can be created only on the road, and it has to centre itself on that road. How would I attempt to do this? Am developing in Unity btw.

Right now am gathering the points on input, and based on the direction of the drawn path, it knows if its moving horizontally or vertically, but I am not quite sure how to figure out if its turning. My implementation knows if its turning but it also includes diagonals.


public void InputUpdate()
{
	if(Input.GetMouseButtonDown(0))
	{
	        dragPoints.Clear();
	        lineRenderer.SetVertexCount(0);
			
		horizontalCount = verticalCount = 0;

		isDragging = true;
		isComplete = false;
	}
		
	if(Input.GetMouseButtonUp(0))
	{
		isDragging = false;
		isComplete = true;
	}

	if(isDragging)
	{
		Vector3 tempPosition = gameCamera.ScreenToWorldPoint(Input.mousePosition);
		tempPosition = new Vector3(tempPosition.x, tempPosition.y, 0f);

		if(endPoint == tempPosition || !IsMouseOnRoad(tempPosition))
			return;

		Vector3 totalDirection = Vector3.zero;
			
		int minSamplePoints = 4;
			
		dragPoints.Add(tempPosition);

		startPoint = dragPoints[0];

		if(dragPoints.Count > minSamplePoints)
		{
			endPoint = dragPoints[dragPoints.Count - 1];
				
			for(int i = 0; i + minSamplePoints < dragPoints.Count; i++)
				totalDirection += (dragPoints[i + minSamplePoints] - dragPoints[i]).normalized;
				
		        prevAvgX = currentAvgX;
			prevAvgY = currentAvgY;
				
			currentAvgX = totalDirection.x / dragPoints.Count;
			currentAvgY = totalDirection.y / dragPoints.Count;

			if(Mathf.Abs(currentAvgY) <= 0.1f)
			{
			        currentAxis = Axis.Horizontal;
				horizontalCount++;
			}
			else if(Mathf.Abs(currentAvgX) <= 0.1f)
			{
				currentAxis = Axis.Vertical;
				verticalCount++;
	                 }
			else
			{
			   if(Mathf.Abs(currentAvgX) > Mathf.Abs(currentAvgY))
				currentAxis = Axis.TurnXY;
			   else if (Mathf.Abs(currentAvgX) < Mathf.Abs(currentAvgY))
						currentAxis = Axis.TurnYX;
			}
		}

		RenderLine();
	}
}

Any help would be much appreciated.

Cheers!!

Advertisement

Figured out how to align it. Anyone can tell me, how I will know if am making a turn?

This is probably easiest when the underlying road structure is defined as a network of interconnected splines. That way the center of the road and its tangent/direction are exactly defined. Also, you can do distance tests between the (tessellated) curve and surrounding points to see whether such points lie on the road. Lastly, a user-defined route becomes a simple series of (spline-)key-points.

I thought of this approach, any other solutions?

Figured out how to align it. Anyone can tell me, how I will know if am making a turn?

I thought of this approach, any other solutions?

Are you trying to figure out when a turn is occurring in a list of points? If you have all the points, and the first point has some known orientation (ie the point that the user is currently in), you might be able to make vectors out of the points (ie P0 - P1 is the first vector, P2-P1), and see if the angles ever get over some threshold?

I've figured all that out. My new problem is constraining the user defined path to a road.

I've figured all that out. My new problem is constraining the user defined path to a road.

Oh, I think I understand, the control points of the curve can be all within the road, but the curve generated by those control points can sometimes be outside the line?

EDIT: I'll have to think about it some if thats the issue at hand. Best I can come up with off the top of my head is to brute force check some points in between control points, and then if that point is off, then insert a control point that is within the road in between the two existing control points... and recheck... which isn't that great.

Second thought is to swap to a completely different system, like marco pinters, and then have non-road tiles be blocking tiles, but that might not be a road you want to go down.

This topic is closed to new replies.

Advertisement