• Advertisement
Sign in to follow this  

Aligning a path, along a another dynamically

This topic is 1343 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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!!

Share this post


Link to post
Share on other sites
Advertisement

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.

Edited by eppo

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Edited by ferrous

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement