Skip to content

Terrain3D integration example - digging a riverbed with the river #27

@aclave1

Description

@aclave1

Leaving this script here to help anyone who may be trying to make their rivers automatically dig a riverbed in Terrain3D. This approach probably over-samples a bit, but should be enough to get someone started. Feel free to close the issue!

const ROCK_TEXTURE_ID = 0
var river_width = 6.0
var river_depth = 2.0
var river_curve = river_manager.curve
var river_points = river_curve.get_baked_points()
var prev_pos = river_points[0]
for pidx in range(1, river_points.size()):
	var point = river_points[pidx]
	var pos:Vector3 = Vector3(point)
	var forward_vec = pos - prev_pos
	var side_vec = forward_vec.cross(Vector3.UP).normalized()
	var step_divs = 2
	for _offset in range(0, river_width * step_divs, 1):
		var offset = _offset / (step_divs as float)
		var pos1 = pos + (side_vec * offset)
		pos1.x = clamp(pos1.x, 0, world_size.x)
		pos1.z = clamp(pos1.z, 0, world_size.y)
		var pos2 = pos + (side_vec * -offset)
		pos2.x = clamp(pos2.x, 0, world_size.x)
		pos2.z = clamp(pos2.z, 0, world_size.y)
                # tweak the interpolation to change the shape of the riverbed
		var height = cubic_interpolate(-river_depth, 0.5, 0.25, 0.75, offset/river_width)
		terrain.data.set_height(pos1, height)
		terrain.data.set_height(pos2, height)
		terrain.data.set_control_base_id(pos1, ROCK_TEXTURE_ID)
		terrain.data.set_control_base_id(pos2, ROCK_TEXTURE_ID)

terrain.data.force_update_maps(Terrain3DRegion.TYPE_HEIGHT)
terrain.data.force_update_maps(Terrain3DRegion.TYPE_CONTROL)

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions