User Tools

Site Tools


4rpl:commands:signalgenerator

Index
Math Utility

SignalGenerator

SignalGenerator(<-time <-frequency <-phaseShift <-invert <-signalType) ->sigValue

Description

Computes the value for a given signal waveform and pushes it to the stack.

A function to derive the y-coordinate for a given x-coordinate on a graph line following one of the indicated wave patterns.

Useful to animate an object or to produce a pattern over time. For instance, could be used to vary the strength of an emitter over time, or to “pulse” (oscillate) the brightness of light source or beacon.

Arguments and type in order:

  • time: (floating point number) X coordinate in the waveform or how long one repetition of the effect lasts
  • frequency: (floating point number) The number of values to generate over the Interval (stepsize) of the waveform
  • phaseShift: (floating point number) An offset from the origin value of the waveform (See Notes)
  • invert: (true/false) inverts the waveform
  • signalType: (0 to 6)
    • 0 = NONE
    • 1 = SINE
    • 2 = SQUARE
    • 3 = TRIANGLE
    • 4 = SAW - TOOTH
    • 5 = RANDOM
    • 6 = CONSTANT

Notes

For all waveforms

Phase Shift

The phase difference, or phase shift as it is also called, of a Sinusoidal Waveform is the angle Φ(Greek letter Phi), in degrees or radians that the waveform has shifted from a certain reference point along the horizontal zero axis. In other words phase shift is the lateral difference between two or more waveforms along a common axis. Sinusoidal waveforms of the same frequency can have a phase difference.

The phase difference, Φ of an alternating waveform can vary from between 0 to its maximum time period, T of the waveform during one complete cycle and this can be anywhere along the horizontal axis between, Φ = 0 to 2π(radians) or Φ = 0 to 360o depending upon the angular units used.

For sine wave function

Time and Frequency

float t = frequency * time + phase;
value = (float)Mathf.Sin(2f * Mathf.PI * t);

For square wave function

Time and Frequency

Square: value = Mathf.Sign(Mathf.Sin(2f * Mathf.PI * t));

For triangle wave function

Time and Frequency

Triangle value = 1f - 4f * (float)Mathf.Abs(Mathf.Round(t - 0.25f) - (t - 0.25f));

For sawtooth wave function

Time and Frequency

Sawtooth: value = 2f * (t - (float)Mathf.Floor(t + 0.5f));

For random wave function

Time and Frequency

The function will output the same number for a given interval. Interval is 1/frequency. It only changes to a new value on the next interval. Hence a random number per interval, or a random number at a given frequency. Otherwise, just use the rand functions to get a new value on each call.

Random: float interval = 1 / frequency;
                int slot = (int)(time / interval) ;
                slot = (slot * 1431655781) + (slot * 1183186591) + (slot * 622729787) + (slot * 338294347);
                if (slot < 0) slot = -slot;
                value = (float)GameSpace.instance.RandDoubleInput(randSeed + slot)*2-1;

Examples

Sine Wave Creeper on Terrain

# On a map with terrain of 200 in X direction and at least 150 in Z direction (3D coordinates)
# generate a sine wave of creeper across the map.
# On a map with terrain of 200 in X direction and at least 150 in Z direction (3D coordinates)
# generate a sine wave of creeper across the map.
 
180 ->numFrames 			# at 30 frames a sec, cycle every 6 seconds.
1 <-numFrames asFloat div ->frequency	#stepsize
0 ->phaseShift
false ->invert
1 ->signalType 				#sine
 
do (<-numFrames 0)
    SignalGenerator(I <-frequency <-phaseShift <-invert <-signalType) ->sigValue
    Round(<-sigValue 2) ->sigValue
    TraceAllSp (I " : " <-sigValue)
    SetCreeper(I 75 add(<-sigValue mul(50)) 15 true)
loop

The above command generated this sinusoidal creeper pattern on a map

Make a Unit Move or "Float" Above Terrain

# Oscillate
$UID:1
 
GetUnitMoveCell(<-UID) ->cellZ ->cellX
if (<-cellz  -1 EQ)
	SignalGenerator(<-time , <-frequency , <-phaseShift , <-invert , <-signaltype) ->sigValue
	<-time 1 + ->time
	<-sigvalue 1 + <-scale * ->sigvalue
	GetUnitPosition(<-UID) ->pos
	GetExactTerrain(<-pos.X <-pos.Z false) ->exactTerrainHeight
	SetUnitPosition(<-UID V3(<-pos.x , <-exactTerrainHeight <-sigvalue + , <-pos.z))	# Buil-in unit	
	# SetObjPosition(2  "" V3(0 <-sigValue 0) false)          							# for custom unit
else
	0 ->time
endIf
 
:Once
	# Parameters for SignalGenerator
	1.0  180 / ->frequency  		# we cycle over 180 frames
	0.0 ->phaseShift 			# offset from zero-time
	false ->invert 				# Invert the waveform
	1 ->signalType				# type of signal generated
	0.5 ->scale				# control the maximum size of movement
 
 
 

Index

4rpl/commands/signalgenerator.txt · Last modified: 2022/09/04 09:28 by Karsten75