How to align an entity(not a car) to terrain?

Blitz3D Forums/Blitz3D Programming/How to align an entity(not a car) to terrain?

Rick Nasher(Posted 2014) [#1]
Hi guys, this probably been answered before somewhere or my approach is just way off, but I can't seem to get it right.

I have a terrain with hills/mountains and want to align some free roaming enemy entities to it, but not completely upright, just a bit inclined depending on the terrain steepness so that it looks more natural. Unlike so:

I thought to do a basic align(straight upright) first without any adjustments like this but apparently that's not the way:


Any help is greately appreciated.


Stevie G(Posted 2014) [#2]
A couple of things are wrong with this function ...

1. PickedNx, Ny etc.. must have open/closed brackets to return the correct values.
2. By default NX, NY and NZ will be integers, they should be explicitly defined as floats using # as the values are between -1 and 1.

You could change the function to this.

The InterRate is the rate of interpolation between a completely upright vector and the normal vector of the landscape. Change this rate to whatever suits between 0.0 and 1.0.

The AlignRate is one of the parameters of AlignToVector, values < 1.0 allow you to align the entity gradually rather than snapping it to the vector.

Function AlignToTerrain(entity, InterRate# = 0.5, AlignRate# = 1.0 )

	Local Pick, Nx#, Ny#, Nz#

    Pick = LinePick (EntityX(entity),EntityY(entity),EntityZ(entity),0,-2,0)

    If Pick <> 0 Then
	
		;Straight up normal = 0,1,0

		Nx = PickedNX() * InterRate
		Ny = 1.0 + ( PickedNY() - 1.0 ) * InterRate
		Nz = PickedNZ() * InterRate
		
		AlignToVector entity,Nx,Ny,Nz,2, AlignRate
		
    EndIf	
	
End Function


You might find that getting and average of a few different positions to get the terrain normal may be better (e.g. check infront and behind as well as current position).

Stevie


Rick Nasher(Posted 2014) [#3]
Many, many thanks Stevie G. At first it didn't work still, but when I changed the InterRate value to 1.0 it worked great!


Stevie G(Posted 2014) [#4]
Maybe I misunderstood you but if you're going to use an interrate of 1.0 then the new function is pointless, just make the following changes to your original:

NX#=PickedNX()
NY#=PickedNY()
NZ#=PickedNZ()


Rick Nasher(Posted 2014) [#5]
No it's alright for this particular model(a monster), but for others might be useful..


RemiD(Posted 2014) [#6]
What Stevie G explains here, (defining if the variable is an integer or a float or a string) is really important to keep in mind if you want to avoid errors.

I once spent hours to try to debug a code, and the error was simply that i had forgotten to define the variable as a float, so by default it was an integer.


Rick Nasher(Posted 2014) [#7]
Uhuh, indeed was a very silly slip-up(probably more to come). Was hammering my head over why-oh-why it didn't work.