Position

From Bohemia Interactive Community
Revision as of 10:13, 11 April 2019 by Killzone Kid (talk | contribs) (Object as position format)
Jump to navigation Jump to search

Introduction

Positions in Arma could be either 2D, in which case it is in format [x,y], where x is the coordinate on the WestEast axis and y is the coordinate on SouthNorth 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.

Formats

There are a number of formats available in the game:
  • ASL – Presumably “Above Sea Level”
  • ATL – Presumably “Above Terrain Level”
  • ASLW – Presumably “Above Sea Level inc. Waves”
  • AGL – Presumably “Above Generic/Ground Level”
  • AGLS – Presumably “Above Generic/Ground Level inc. Surfaces”
  • World – Raw world coordinate system
  • Relative – Position relative to an object within its model space
  • Config – Position used in configs
  • Object – When object is used for position, PositionWorld of the object is used
The following diagram illustrates some of the most used formats:
position.jpg

PositionASL

z is measured from the sea level which is constant across the map.
Related commands:
getPosASL, setPosASL, getPosASLVisual, visiblePositionASL, ASLToATL, ATLToASL, AGLToASL, ASLToAGL, eyePos, aimPos, getTerrainHeightASL, lineIntersects, lineIntersectsWith, lineIntersectsObjs, lineIntersectsSurfaces, terrainIntersectASL, playSound3D, setDefaultCamera

PositionASLW

z is measured from the surface of the sea that could be higher or lower than sea level due to waves.
Related commands:
getPosASLW, setPosASLW

PositionATL

z is measured from the terrain level which varies across the map.
Related commands:
getPosATL, setPosATL, getPosATLVisual, ASLToATL, ATLToASL

PositionAGL

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.
Related commands:
modelToWorld, worldToModel, modelToWorldVisual, worldToModelVisual, positionCameraToWorld, intersect, terrainIntersect, isOnRoad, drawIcon3D, drawLine3D, distance, moveTo, doMove, move, setDestination, buildingPos, screenToWorld, worldToScreen, AGLToASL, ASLToAGL, unitAimPosition, unitAimPositionVisual

PositionAGLS

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:
z.jpg
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. 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.
Related commands:
position, visiblePosition, getPos, getPosVisual

setPosAGLS

The function below will place passed object onto walkable surface, if there is one, otherwise on the ground. If only x and y of the position are supplied, the object will be placed on surface, if z is supplied, it will be treated as offset from the surface level.

KK_fnc_setPosAGLS = { params ["_obj", "_pos", "_offset"]; _offset = _pos select 2; if (isNil "_offset") then {_offset = 0}; _pos set [2, worldSize]; _obj setPosASL _pos; _pos set [2, vectorMagnitude (_pos vectorDiff getPosVisual _obj) + _offset]; _obj setPosASL _pos; }; //---This will place player exactly on top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,0]] call KK_fnc_setPosAGLS; //---This will place player 2m above top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,2]] call KK_fnc_setPosAGLS; //---This will place player 2m below top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,-2]] call KK_fnc_setPosAGLS;

Alternatively, setVehiclePosition command can be used. It will put object onto nearest surface.

//---This will place player inside Cargo HQ on Stratis: player setVehiclePosition [[2437.18,5693.47,0], [], 0, "CAN_COLLIDE"]; //---This will place player on top deck of Cargo HQ on Stratis: player setVehiclePosition [[2437.18,5693.47,100], [], 0, "CAN_COLLIDE"];

PositionWorld

Similar to PositionASL, however z is measured from the sea level to the the model centre [0,0,0] of an object, rather than transformed boundingCenter or land contact vertices.

_identical = getPosWorld _obj isEqualTo AGLtoASL (_obj modelToWorld [0,0,0]); //should be true

Related commands:
getPosWorld, setPosWorld, mapCenterOnCamera

PositionRelative

Relative position is normally an [x,y,z] offset from the model centre.
Related commands:
positionCameraToWorld, selectionPosition, attachTo, modelToWorld, worldToModel, modelToWorldVisual, worldToModelVisual, camPrepareRelPos, camSetRelPos

PositionConfig

The format used in configs, such as mission.sqm, is [x,z,y], where z and y are swapped around. One other command that uses this format is positionCameraToWorld. z in configs is measured from the sea level.