Positions in Arma could be either 2D, in which case it is in format [x,y], where x is the coordinate on the South – North axis and y is the coordinate on West – East axis, or 3D, in which case it is in format [x,y,z], where z is the height. The height relative to exactly what differs depending on the format of 3D position used.
There are a number of formats available in the game:
- ASL – Presumably “At Sea Level”
- ATL – Presumably “At Terrain Level”
- ASLW – Presumably “At Sea Level inc. Waves”
- AGL – Presumably “At Generic Level”
- AGLS – Presumably “At Generic Level inc. Surface”
- World – Raw world coordinate system
- Relative – Position relative to an object
- Config – Position used in configs
The following diagram illustrates some of the most used formats:
z is measured from the sea level which is constant across the map.
getPosASL, setPosASL, getPosASLVisual, ASLToATL, ATLToASL, eyePos, aimPos, getTerrainHeightASL, lineIntersects, lineIntersectsWith, lineIntersectsObjs, terrainIntersectASL, playSound3D, setDefaultCamera
z is measured from the surface of the sea that could be higher or lower than sea level due to waves.
z is measured from the terrain level which varies across the map.
getPosATL, setPosATL, getPosATLVisual, ASLToATL, ATLToASL
z is the same as in PositionASLW when over sea and is the same as in PositionATL when over land. Most commands either take or return PositionAGL.
modelToWorld, worldToModel, modelToWorldVisual, worldToModelVisual, positionCameraToWorld, terrainIntersect, isOnRoad, drawIcon3D, drawLine3D, distance, moveTo, doMove, move, setDestination, buildingPos, screenToWorld, worldToScreen
Over land, z is measured as height over terrain level minus the height of surface over terrain level underneath. If such surface exists and is counted in, the resulting z becomes 0. The following diagram illustrates how z is obtained for a soldier standing on a rock:
Over sea it gets even more complicated as instead of PositionATL, PositionASLW is used minus the offset for the surface height, presumably over waves too, as z seems static. There might be a way of testing this theory that I haven’t found. As there is currently no way to obtain H of the surface, it becomes impossible to convert given PositionAGLS into other formats, unlike with other position formats.
position, visiblePosition, getPos, getPosVisual
Similar to PositionASL however z is measured from sea level to the the model centre [0,0,0] of an object, rather than transformed boundingCenter or land contact vertices.
getPosWorld, setPosWorld, mapCenterOnCamera
Relative position is normally an [x,y,z] offset from the model centre.
positionCameraToWorld, selectionPosition, modelToWorld, worldToModel, modelToWorldVisual, worldToModelVisual, camPrepareRelPos, camSetRelPos
The format used in configs, such as mission.sqm, is [x,z,y], z and y are swapped around. One other command that uses this format is positionCameraToWorld. z in configs is measured from the sea level.
I think I should also mention this: For example distance command, as you can see, treats supplied position as PositionAGL and if object is supplied, it extracts PositionAGL from it. So any 3 coordinates passed to it as position will be relative to terrain over land and relative to waves over sea. Good for map, bad for normal geometric distance calculations. This is why vectorDistance command was introduced.
But here comes another problem, vector commands cannot be used with commands that return PositionAGL without first converting results into PositionASL or PositionWorld. Unevenness of terrain makes it impossible to do straight geometric calculation because of PositionAGL changing with the terrain. So far there are no commands available that would simply convert PositionAGL to PositionASL and back, thus making working with vectors and positions on a map a nightmare.