Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Aligning a path, along a another dynamically


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 dribble04   Members   -  Reputation: 150

Like
0Likes
Like

Posted 09 May 2014 - 05:40 AM

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



Sponsor:

#2 dribble04   Members   -  Reputation: 150

Like
0Likes
Like

Posted 09 May 2014 - 07:45 AM

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



#3 eppo   Crossbones+   -  Reputation: 2508

Like
1Likes
Like

Posted 09 May 2014 - 07:47 AM

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, 09 May 2014 - 07:48 AM.


#4 dribble04   Members   -  Reputation: 150

Like
0Likes
Like

Posted 12 May 2014 - 11:32 PM

I thought of this approach, any other solutions?



#5 ferrous   Members   -  Reputation: 2074

Like
0Likes
Like

Posted 15 May 2014 - 11:33 AM

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?



#6 dribble04   Members   -  Reputation: 150

Like
0Likes
Like

Posted 15 May 2014 - 12:25 PM

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



#7 ferrous   Members   -  Reputation: 2074

Like
0Likes
Like

Posted 16 May 2014 - 05:15 PM

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, 16 May 2014 - 05:19 PM.





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS