So I’ve been working on this concept for a bit. The goal here is to make my game’s terrain and roads in-engine, so that geometry, object spawns, traffic paths, and such are generated automatically. I’m posting this both because I wanted to share this, and to get opinions and advice.

Spoiler: more pics


Current challenge:
I have restarted this a couple times, trying different approaches. For the current iteration I have decided that I need to build the foundation properly before I bring in anything from the above screenshots.

The foundation:

The idea is to create a network of path and intersection nodes, to which I can add modifiers, such as road generator, mesh deform, or object spawn. Managing connections via editor tree became a pain very fast.

Now I need to figure out how to connect these easily, preferably via the viewport, by just dragging the path handle over the intersection handle. Any tips?

  • FeyterM
    link
    fedilink
    arrow-up
    2
    ·
    1 year ago

    Ok so if I understood correctly you want to have one Node(of type Path3D or Curve3D) that will be used to generate a street from a given staring point to a given end point. And a second type of Node that should be handling intersections of a road?

    My initial idea would be to have a area3D note for the intersection node and a area3D node as the start/endpoint of the path.

    Then using the area_entered signal in the intersection area to detect if a path start/end was connected…

    I have no experience of how well all of this will work in an tool script but this would be my starting point.

    PS: after thinking twice about it. Why would you want to have a distinct intersection node? I think simply having a start and a endpoint of a street that can be connected to a different start/end point of a different street (or even the same to make a circle) should be enough.

    • Bezier@suppo.fiOP
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      1 year ago

      Thanks. I actually tried Area3D, but it wasn’t ideal.

      • I had to turn on physics in the editor.
      • Enter/exit are called when loading and saving the scene, and when moving either node.
      • It’s not enough if the areas line up in viewport, since it’s a 2D representation of a 3D scene.

      Why distinct intersection nodes?
      This division seems the most sensible option for geometry generation. Intersection stuff is contained in one node instead of being divided between all connected paths, and path modifiers are also simpler, because they only have to care about the path.

      • FeyterM
        link
        fedilink
        arrow-up
        2
        ·
        1 year ago

        Ok I guess we are talking about the same idea here. Having one node that handles “connection” and a different note handling the course of the street.

        I would only argue that a connection with only on road connected should be able to exist in order to create a dead end. But don’t know if this would make sense for your specific gameplay.

        I’m sorry I can’t help you any further here, but maybe someone else will have an idea.

        • Bezier@suppo.fiOP
          link
          fedilink
          arrow-up
          2
          ·
          edit-2
          1 year ago

          You mean capping dead ends like this?

          spoiler

          It’s not really an issue, since adding an intersection is (supposed to be) easy, and I’d have it there regardless if I wanted to generate land patches around it, like in the post image.

          Thanks anyway, though!

      • FeyterM
        link
        fedilink
        arrow-up
        2
        ·
        1 year ago

        I mean the workaround would be to have something like a Array defined as an export variable and “drag and drop” the nodes you want to connect in the inspector?

        But I think you already had something like this in place?

        • Bezier@suppo.fiOP
          link
          fedilink
          arrow-up
          2
          ·
          1 year ago

          That was the initial approach, but finding the node in the list became way too much effort very quickly.