Position: Difference between revisions
No edit summary |
Lou Montana (talk | contribs) m (Text replacement - "<tt>([^= ]+)<\/tt>" to "{{hl|$1}}") |
||
Line 2: | Line 2: | ||
== Introduction == | == Introduction == | ||
Positions in Arma are always represented as [[Array|arrays]]. There are two types of positions: | Positions in Arma are always represented as [[Array|arrays]]. There are two types of positions: | ||
* 2D positions: | * 2D positions: {{hl|[X, Y]}} | ||
* 3D positions: | * 3D positions: {{hl|[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 | On the map, the X-axis runs from west to east and the Y-axis runs from south to north. The origin {{hl|[0, 0]}} 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). | 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). | ||
Line 105: | Line 105: | ||
== PositionWorld == | == PositionWorld == | ||
Similar to [[PositionASL]], however Z is measured from the sea level to the the model centre | Similar to [[PositionASL]], however Z is measured from the sea level to the the model centre {{hl|[0, 0, 0]}} of the 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> | <code>_identical = [[getPosWorld]] _obj [[isEqualTo]] [[AGLtoASL]] (_obj [[modelToWorld]] [0,0,0]); {{cc|should be true}}</code> | ||
Line 112: | Line 112: | ||
== PositionRelative == | == PositionRelative == | ||
Relative position is normally an | Relative position is normally an {{hl|[X, Y, Z]}} offset from the model centre. | ||
'''See also:''' | '''See also:''' | ||
Line 118: | Line 118: | ||
== PositionConfig == | == PositionConfig == | ||
The format used in configs, such as ''mission.sqm'', is | The format used in configs, such as ''mission.sqm'', is {{hl|[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 00:17, 16 November 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).
Formats
There are a number of formats available in Real Virtuality:
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 |
Visual: | Used for rendering objects on the screen. Useful for per-frame applications, such as drawIcon3D |
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 water at that position. Both waves and pond objects affect the result.
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.
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 the 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.