Position: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
m (category)
(Rewrote Introduction section, did a lot of cleanup everywhere else)
Line 1: Line 1:
{{TOC|side}}
{{TOC|side}}
== Introduction ==
== Introduction ==
Positions in Arma are always represented as [[Array|arrays]]. There are two types of positions:
* 2D positions: <tt>[X, Y]</tt>
* 3D positions: <tt>[X, Y, Z]</tt>
On the map, the X-axis runs from west to east and the Y-axis runs from south to north. The origin <tt>[0, 0]</tt> is (usually) located in the bottom left corner.<br>
While the Z-coordinate is always the height, the point relative to which that height is measured depends on the specific position format (see below).
{{Informative|Since Arma 3 v1.93.145664: X, Y and Z are limited to values between -50km and +500km.}}


Positions in Arma could be either '''2D''', in which case it is in format '''[x,y]''', where '''x''' is the coordinate on the ''West'' – ''East'' axis and '''y''' is the coordinate on ''South'' – ''North'' 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.
<br><br>
{{Warning | Since Arma 3 v1.93.145664 position values are limited to [-50km/+500km,-50km/+500km,-50km/+500km]}}
== Formats ==
== Formats ==
There are a number of formats available in the game:
* '''ASL''' – Presumably "'''A'''bove '''S'''ea '''L'''evel"
* '''ATL''' – Presumably "'''A'''bove '''T'''errain '''L'''evel"
* '''ASLW''' – Presumably "'''A'''bove '''S'''ea '''L'''evel including '''W'''aves"
* '''AGL''' – Presumably "'''A'''bove '''G'''eneric/'''G'''round '''L'''evel"
* '''AGLS''' – Presumably "'''A'''bove '''G'''eneric/'''G'''round '''L'''evel including '''S'''urfaces"
* '''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


:There are a number of formats available in the game:
<br>This diagram illustrates some of the most used formats:<br>
 
[[Image:position.jpg|600px]]
:* '''ASL''' – Presumably “'''A'''bove '''S'''ea '''L'''evel”
:* '''ATL''' – Presumably “'''A'''bove '''T'''errain '''L'''evel”
:* '''ASLW''' – Presumably “'''A'''bove '''S'''ea '''L'''evel inc. '''W'''aves”
:* '''AGL''' – Presumably “'''A'''bove '''G'''eneric/'''G'''round '''L'''evel”
:* '''AGLS''' – Presumably “'''A'''bove '''G'''eneric/'''G'''round '''L'''evel inc. '''S'''urfaces”
:* '''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:
 
:[[Image:position.jpg|600px]]


== PositionASL ==
== PositionASL ==
Z is measured from the sea level which is constant across the map.


:'''z''' is measured from the sea level which is constant across the map.
'''See also:'''
 
[[getPosASL]], [[setPosASL]], [[getPosASLVisual]], [[visiblePositionASL]], [[ASLToATL]], [[ATLToASL]], [[AGLToASL]], [[ASLToAGL]], [[eyePos]], [[aimPos]], [[getTerrainHeightASL]], [[lineIntersects]], [[lineIntersectsWith]], [[lineIntersectsObjs]], [[lineIntersectsSurfaces]], [[terrainIntersectASL]], [[playSound3D]], [[setDefaultCamera]]
:<u>Related commands:</u>
 
:[[getPosASL]], [[setPosASL]], [[getPosASLVisual]], [[visiblePositionASL]], [[ASLToATL]], [[ATLToASL]], [[AGLToASL]], [[ASLToAGL]], [[eyePos]], [[aimPos]], [[getTerrainHeightASL]], [[lineIntersects]], [[lineIntersectsWith]], [[lineIntersectsObjs]], [[lineIntersectsSurfaces]], [[terrainIntersectASL]], [[playSound3D]], [[setDefaultCamera]]


==PositionASLW==
== PositionASLW ==
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 surface of the sea that could be higher or lower than sea level due to waves.
'''See also:'''
 
[[getPosASLW]], [[setPosASLW]]
:<u>Related commands:</u>
 
:[[getPosASLW]], [[setPosASLW]]


== PositionATL ==
== PositionATL ==
Z is measured from the terrain level which varies across the map.


:'''z''' is measured from the terrain level which varies across the map.
'''See also:'''
 
[[getPosATL]], [[setPosATL]], [[getPosATLVisual]], [[ASLToATL]], [[ATLToASL]]
:<u>Related commands:</u>
 
:[[getPosATL]], [[setPosATL]], [[getPosATLVisual]], [[ASLToATL]], [[ATLToASL]]


== PositionAGL ==
== 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]].


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


== PositionAGLS ==
== 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:


: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:
[[Image:z.jpg|600px]]


:[[Image:z.jpg|600px]]
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<sub>surface</sub>, it becomes impossible to convert given [[PositionAGLS]] into other formats, unlike with other position formats.


: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.
'''See also:'''
 
[[position]], [[visiblePosition]], [[getPos]], [[getPosVisual]]
:<u>Related commands:</u>
 
:[[position]], [[visiblePosition]], [[getPos]], [[getPosVisual]]


=== setPosAGLS ===
=== 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.


: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.
<blockquote>
<code>KK_fnc_setPosAGLS = {
<code>KK_fnc_setPosAGLS = {
[[params]] ["_obj", "_pos", "_offset"];
[[params]] ["_obj", "_pos", "_offset"];
Line 82: Line 71:
};
};
</code>
</code>
<code>{{codecomment|//---This will place player exactly on top deck of Cargo HQ on Stratis:}}
<code>{{cc|This will place the player exactly on top deck of Cargo HQ on Stratis:}}
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,0]] [[call]] KK_fnc_setPosAGLS;<br>
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,0]] [[call]] KK_fnc_setPosAGLS;<br>
{{codecomment|//---This will place player 2m above top deck of Cargo HQ on Stratis:}}
{{cc|This will place the player 2m above top deck of Cargo HQ on Stratis:}}
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,2]] [[call]] KK_fnc_setPosAGLS;<br>
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,2]] [[call]] KK_fnc_setPosAGLS;<br>
{{codecomment|//---This will place player 2m below top deck of Cargo HQ on Stratis:}}
{{cc|This will place the player 2m below top deck of Cargo HQ on Stratis:}}
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,-2]] [[call]] KK_fnc_setPosAGLS;</code>
<nowiki>[</nowiki>[[player]], [2437.18,5693.47,-2]] [[call]] KK_fnc_setPosAGLS;</code>
</blockquote>


:Alternatively, [[setVehiclePosition]] command can be used. It will put object onto nearest surface.  
Alternatively, [[setVehiclePosition]] can be used. It will put the object onto the nearest surface.  
<blockquote>
<code>{{cc|This will place the player inside Cargo HQ on Stratis:}}
<code>{{codecomment|//---This will place player inside Cargo HQ on Stratis:}}
[[player]] [[setVehiclePosition]] [<nowiki/>[2437.18,5693.47,0], [], 0, "CAN_COLLIDE"];<br>
[[player]] [[setVehiclePosition]] [<nowiki/>[2437.18,5693.47,0], [], 0, "CAN_COLLIDE"];<br>
{{codecomment|//---This will place player on top deck of Cargo HQ on Stratis:}}
{{cc|This will place the player on top deck of Cargo HQ on Stratis:}}
[[player]] [[setVehiclePosition]] [<nowiki/>[2437.18,5693.47,100], [], 0, "CAN_COLLIDE"];</code>
[[player]] [[setVehiclePosition]] [<nowiki/>[2437.18,5693.47,100], [], 0, "CAN_COLLIDE"];</code>
</blockquote>


== PositionWorld ==
== 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.
<code>_identical = [[getPosWorld]] _obj [[isEqualTo]] [[AGLtoASL]] (_obj [[modelToWorld]] [0,0,0]); {{cc|should be true}}</code>


: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.
'''See also:'''
<blockquote>
[[getPosWorld]], [[setPosWorld]], [[mapCenterOnCamera]]
<code>_identical = [[getPosWorld]] _obj [[isEqualTo]] [[AGLtoASL]] (_obj [[modelToWorld]] [0,0,0]); {{codecomment|// should be true}}</code>
</blockquote>
 
:<u>Related commands:</u>
 
:[[getPosWorld]], [[setPosWorld]], [[mapCenterOnCamera]]


== PositionRelative ==
== PositionRelative ==
Relative position is normally an <tt>[X, Y, Z]</tt> offset from the model centre.


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


== PositionConfig ==
== PositionConfig ==
 
The format used in configs, such as ''mission.sqm'', is <tt>[X, Z, Y]</tt>, 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.
: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.


[[Category:Arrays]]
[[Category:Arrays]]

Revision as of 20:39, 21 January 2021

Introduction

Positions in Arma are always represented as arrays. There are two types of positions:

  • 2D positions: [X, Y]
  • 3D positions: [X, Y, Z]

On the map, the X-axis runs from west to east and the Y-axis runs from south to north. The origin [0, 0] is (usually) located in the bottom left corner.
While the Z-coordinate is always the height, the point relative to which that height is measured depends on the specific position format (see below).

Since Arma 3 v1.93.145664: X, Y and Z are limited to values between -50km and +500km.

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 including Waves"
  • AGL – Presumably "Above Generic/Ground Level"
  • AGLS – Presumably "Above Generic/Ground Level including 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


This diagram illustrates some of the most used formats:
position.jpg

PositionASL

Z is measured from the sea level which is constant across the map.

See also: 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.

See also: getPosASLW, setPosASLW

PositionATL

Z is measured from the terrain level which varies across the map.

See also: 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.

See also: 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 Hsurface, it becomes impossible to convert given PositionAGLS into other formats, unlike with other position formats.

See also: 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 the player exactly on top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,0]] call KK_fnc_setPosAGLS;
// This will place the player 2m above top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,2]] call KK_fnc_setPosAGLS;
// This will place the player 2m below top deck of Cargo HQ on Stratis: [player, [2437.18,5693.47,-2]] call KK_fnc_setPosAGLS;

Alternatively, setVehiclePosition can be used. It will put the object onto the nearest surface. // This will place the player inside Cargo HQ on Stratis: player setVehiclePosition [[2437.18,5693.47,0], [], 0, "CAN_COLLIDE"];
// This will place the 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

See also: getPosWorld, setPosWorld, mapCenterOnCamera

PositionRelative

Relative position is normally an [X, Y, Z] offset from the model centre.

See also: 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.