setVelocityTransformation: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
No edit summary
mNo edit summary
 
(149 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


| arma2oa |= Game name
|game1= arma2oa
|version1= 1.50


|1.51|= Game version
|game2= tkoh
____________________________________________________________________________________________
|version2= 1.00


| Places an object at an interpolated position between two other objects and sets its vectors in proportion to the relative position. The final position/vector is determined by the "interval" specified in the command. This assumes an imaginary path between the two reference objects, where at the ''beginning'' of the path (interval: 0) the position and vector are identical to the ''first'' reference object,
|game3= arma3
at the ''end'' of the path (interval: 1) they're identical to the ''second'' reference object, and at 0.5 they are halfway in between (See [http://resources.bisimulations.com/wiki/setVelocityTransformation setVelocityTransformation (VBS2)] for more details).
|version3= 0.50


<br><br>This command works in multiplayer provided the velocity component is set correctly. It helps the engine to figure out what the next position of the moving object should be on other clients. |= Description
|eff= global
____________________________________________________________________________________________
|arg= local


| object '''setVelocityTransformation''' [position1, position2, velocity1, velocity2, direction1, direction2, upVector1, upVector2, interval] |= Syntax
|gr1= Object Manipulation


|p1= object: [[Object]] - Object to be positioned |=
|descr= [[File:setVelocityTransformation.jpg|thumb|right]]
|p2= position1: [[PositionASL]] - ASL position of first reference object
Interpolates and applies [[Position#PositionASL|PositionASL]], [[velocity]], [[vectorDir]] and [[vectorUp]] to the given object based on the interval value.<br>
|p3= position2: [[PositionASL]] - ASL position of second reference object
|p4= velocity1: [[Vector3D]] - [[velocity|Velocity]] of first reference object
|p5= velocity2: [[Vector3D]] - [[velocity|Velocity]] of second reference object
|p6= direction1: [[Vector3D]] - [[vectorDir|Direction vector]] of first reference object
|p7= direction2: [[Vector3D]] - [[vectorDir|Direction vector]] of second reference object
|p8= upVector1: [[Vector3D]] - [[vectorUp|Upright vector]] of first reference object
|p9= upVector2: [[Vector3D]] - [[vectorUp|Upright vector]] of second reference object
|p10= interval: [[Number]] - Relative position between the two reference objects where the manipulated object will be placed at. (Range 0..1)
| [[Nothing]] |= Return value


____________________________________________________________________________________________
When interval is 0 the "fromXXX" values are used for the beginning of the interpolation. When interval is 1, the "toXXX" values are used for the end of interpolation.
When interval value is in between, interpolated values are used (see diagram below). The interpolation is linear and along straight line between "from" and "to" positions.
If curve is needed, then it should be constructed from multiple straight sections or by dynamically changing value of position params during the interpolation cycle, similar to {{Link|https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Quadratic_curves|Quadratic Curve animation}} (see {{Link|#Example 3}}).<br>


|x1= <code>_tracker [[setVelocityTransformation]] [
The [[velocity]] param does not do much in SP, but in MP, provided the velocity component is set correctly, it helps the engine to figure out what the next position of the moving object should be on other clients.<br><br>
[[getPosASL]] _currentPos,
The actual approximate interpolation formula for this command is:
[[getPosASL]] _nextPos,
<sqf>_vecCurrent = _vecFrom vectorAdd (_vecTo vectorDiff _vecFrom vectorMultiply _interval);</sqf>
[[velocity]] _currentVelocity,
[[velocity]] _nextVelocity,
[[vectorDir]] _currentVectorDir,
[[vectorDir]] _nextVectorDir,
[[vectorUp]] _currentVectorUp,
[[vectorUp]] _nextVectorUp,
_timeDiff
];</code> |= Example 1


|x2= Bob on imaginary stairway to heaven:<code>bob = [[createAgent]] ["C_man_1", [[player]] [[getRelPos]] [5, 0], [], 0, "CAN_COLLIDE"];  
{{Feature|informative|
bob [[switchMove]] "ladderciviluploop";
For continuous movement this command should be executed each frame while changing the interval value.
pos1 = [[getPosASL]] bob;
For example to apply interpolation for 10 seconds one could use the following command to translate 10 seconds into 0..1 interval:
pos2 = pos1 [[vectorAdd]] [0,0,0.75];
<sqf>
bob [[addEventHandler]] ["AnimDone",  
t1 = time;
t2 = time + 10;
</sqf>
Later inside some on frame event...
<sqf>_interval = linearConversion [t1, t2, time, 0, 1];</sqf>
}}
 
|s1= object [[setVelocityTransformation]] [fromPosASL, toPosASL, fromVelocity, toVelocity, fromVectorDir, toVectorDir, fromVectorUp, toVectorUp, interval, customCenter]
 
|p1= object: [[Object]] - object to be interpolated
 
|p2= fromPosASL: [[Array]] format [[Position#PositionASL|PositionASL]] - starting [[getPosASL]] of the object
 
|p3= toPosASL: [[Array]] format [[Position#PositionASL|PositionASL]] - ending [[getPosASL]] of the object
 
|p4= fromVelocity: [[Array]] - starting [[velocity]] of the object
 
|p5= toVelocity: [[Array]] - ending [[velocity]] of the object
 
|p6= fromVectorDir: [[Array]] - starting [[vectorDir]] of the object
 
|p7= toVectorDir: [[Array]] - ending [[vectorDir]] of the object
 
|p8= fromVectorUp: [[Array]] - starting [[vectorUp]] of the object
 
|p9= toVectorUp: [[Array]] - ending [[vectorUp]] of the object
 
|p10= interval: [[Number]] - interpolation interval (variable value, normally between 0 and 1)
 
|p11= customCenter: [[Array]] - (Optional, default placing point of the model (see [[getModelInfo]])) custom center [x, y, z] to which transformation would be applied in model coordinates
|p11since= arma3 2.08
 
|r1= [[Nothing]]
 
|x1= <sqf>
_tracker setVelocityTransformation
[
_currentPos,
_nextPos,
_currentVelocity,
_nextVelocity,
_currentVectorDir,
_nextVectorDir,
_currentVectorUp,
_nextVectorUp,
_interval
];
</sqf>
 
|x2= Bob on imaginary stairway to heaven:
<sqf>
bob = createAgent ["C_man_1", player getRelPos [5, 0], [], 0, "CAN_COLLIDE"];
bob switchMove "ladderCivilUpLoop";
pos1 = getPosASL bob;
pos2 = pos1 vectorAdd [0,0,0.75];
bob addEventHandler ["AnimDone",
{
{
pos1 = pos2;  
pos1 = pos2;
pos2 = pos2 [[vectorAdd]] [0,0,0.75]
pos2 = pos2 vectorAdd [0,0,0.75]
}];
}];
[[onEachFrame]]
 
onEachFrame
{
{
[[if]] (![[alive]] bob) [[then]]
if (!alive bob) then
{
{
[[onEachFrame]] {};  
onEachFrame {};
bob [[switchMove]] "";
bob switchMove "";
bob [[removeAllEventHandlers]] "AnimDone";
bob removeAllEventHandlers "AnimDone";
};
};
bob [[setVelocityTransformation]] [
bob setVelocityTransformation [
pos1,  
pos1,
pos2,  
pos2,
[0,0,0],  
[0,0,0],
[0,0,0],  
[0,0,0],
[0,1,0],  
[0,1,0],
[0,1,0],  
[0,1,0],
[0,0,1],  
[0,0,1],
[0,0,1],
moveTime bob
];
};
</sqf>
 
|x3= Advanced trickery with curved movement. The curve is controlled with one control point (controlPointASL), just like quadratic Bézier curve:
<sqf>
disableSerialization;
player setDir 0;
interval = 0;
_disp = findDisplay 46 createDisplay "RscDisplayEmpty";
_ctrl = _disp ctrlCreate ["RscSlider", -1];
_ctrl ctrlSetPosition [safeZoneX + 0.1, 1, safeZoneW - 0.2, 0.1];
_ctrl ctrlSetActiveColor [1,0,0,1];
_ctrl ctrlCommit 0;
_ctrl sliderSetPosition 0;
_ctrl sliderSetRange [0,1];
_ctrl sliderSetSpeed [0.1,0.5];
_ctrl ctrlAddEventHandler ["SliderPosChanged", {interval = _this select 1}];
ctrlSetFocus _ctrl;
box = "Land_VR_Shape_01_cube_1m_F" createVehicle [0,0,0];
controlPointASL = AGLToASL (player getRelPos [70, -30]) vectorAdd [0, 0, 30];
fromPosASL = AGLToASL (player getRelPos [10, -45]);
toPosASL = AGLToASL (player getRelPos [10, 45]);
fromControlPointOffset = controlPointASL vectorDiff fromPosASL;
toControlPointOffset = toPosASL vectorDiff controlPointASL;
onEachFrame
{
hintSilent format ["Interval: %1", interval];
box setVelocityTransformation
[
fromPosASL vectorAdd (fromControlPointOffset vectorMultiply interval),
controlPointASL vectorAdd (toControlPointOffset vectorMultiply interval),
[0,0,0],
[0,0,0],
[0,1,0],
[1,0,0],
[0,0,1],
[0,0,1],
[[moveTime]] bob
[0,1,0],
interval
];
];
};</code> |= Example 2
};
____________________________________________________________________________________________
</sqf>


| [[velocity]], [[setVelocity]], [[velocityModelSpace]], [[setVelocityModelSpace]], [[setVelocityTransformation]], [[speed]], [[moveTime]] |= See also
|seealso= [[velocity]] [[setVelocity]] [[velocityModelSpace]] [[setVelocityModelSpace]] [[speed]] [[moveTime]] [[disableBrakes]] [[brakesDisabled]] [[getModelInfo]]
}}
}}


<h3 style="display:none">Notes</h3>
{{Note
<dl class="command_description">
|user= ffur2007slx2_5
<!-- Note Section BEGIN -->
|timestamp= 20140804123500
<dd class="notedate">Posted on Aug 4, 2014 – 12:35
|text= (A3 1.24) Generally speaking [[setVelocityTransformation]] is more likely a combination of [[setPosASL]], [[setVectorDirAndUp]] (or [[BIS_fnc_setPitchBank]]) and time multiplier.
<dt class="note">[[User:ffur2007slx2_5|ffur2007slx2_5]]<dd class="note">
It can be used as a position tracker with all necessary information collected, copied and then released within one function. Here’s a simple reproduction on how [[setVelocityTransformation]] works in game:
(A3 1.24) Generally speaking [[setVelocityTransformation]] is more likely a combination of [[setPosASL]], [[setVectorDirAndUp]] (or [[BIS_fnc_setPitchBank]]) and time multiplier. It can be used as a position tracker with all necessary information collected, copied and then released within one function. Here’s a simple reproduction on how [[setVelocityTransformation]] works in game:
<sqf>
<code>
private ["_dataOld","_dataNext","_capturedData","_obj","_fps","_startTrackingTime","_stepOld","_stepNext","_tracker","_tempTime"];
[[private]] ["_dataOld","_dataNext","_capturedData","_obj","_fps","_startTrackingTime","_stepOld","_stepNext","_tracker","_tempTime"];
_stepOld = 0;
_stepOld = 0;
_tempTime = 0;
_tempTime = 0;
_stepNext = 1;
_stepNext = 1;
[[while]] {[[true]]} [[do]] {
while {true} do
  _capturedData = _capturedData + [[ [[getPosASL]] _obj,[[velocity]] _obj,[[vectorDir]] _obj,[[vectorUp]] _obj]];
{
  [[sleep]] _fps;
_capturedData = _capturedData + [[getPosASL _obj,velocity _obj,vectorDir _obj,vectorUp _obj]];
  _tempTime = _tempTime + _fps;
sleep _fps;
  [[if]] (_tempTime >= _startTrackingTime) [[then]] {
_tempTime = _tempTime + _fps;
        _dataOld = _capturedData [[select]] _stepOld;
if (_tempTime >= _startTrackingTime) then
_dataNext = _capturedData [[select]] _stepNext;
{
_stepOld = _stepOld + 1;
_dataOld = _capturedData select _stepOld;
_stepNext = [[if]] (_stepNext >= ([[count]] _capturedData)) [[then]] [{_stepOld},{_stepNext + 1}];
_dataNext = _capturedData select _stepNext;
_tracker [[setVelocityTransformation]]
_stepOld = _stepOld + 1;
[_dataOld [[select]] 0,_dataNext [[select]] 0,_dataOld [[select]] 1,_dataNext [[select]] 1,
_stepNext = if (_stepNext >= (count _capturedData)) then { _stepOld } else { _stepNext + 1 };
_dataOld [[select]] 2,_dataNext [[select]] 2,_dataOld [[select]] 3,_dataNext [[select]] 3,1];
_tracker setVelocityTransformation [
  };
_dataOld select 0,
};</code>
_dataNext select 0,
_dataOld select 1,
_dataNext select 1,
_dataOld select 2,
_dataNext select 2,
_dataOld select 3,
_dataNext select 3,
1
];
};
};
</sqf>
Tracker starts coping the route and stance from the object when time start counting. TimeDiff determines the distance multiply between the current position and the next position.
Tracker starts coping the route and stance from the object when time start counting. TimeDiff determines the distance multiply between the current position and the next position.
<!-- Note Section END -->
}}
</dl>


<h3 style="display:none">Bottom Section</h3>
{{Note
 
|user= DrSova
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]]
|timestamp= 20200704081100
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
|text= You can't apply this command to the dead body in ragdoll.
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
}}
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]
[[Category:ArmA 2 OA: New Scripting Commands List|{{uc:{{PAGENAME}}}}]]

Latest revision as of 06:59, 27 November 2023

Hover & click on the images for description

Description

Description:
setVelocityTransformation.jpg

Interpolates and applies PositionASL, velocity, vectorDir and vectorUp to the given object based on the interval value.

When interval is 0 the "fromXXX" values are used for the beginning of the interpolation. When interval is 1, the "toXXX" values are used for the end of interpolation. When interval value is in between, interpolated values are used (see diagram below). The interpolation is linear and along straight line between "from" and "to" positions. If curve is needed, then it should be constructed from multiple straight sections or by dynamically changing value of position params during the interpolation cycle, similar to Quadratic Curve animation (see Example 3).

The velocity param does not do much in SP, but in MP, provided the velocity component is set correctly, it helps the engine to figure out what the next position of the moving object should be on other clients.

The actual approximate interpolation formula for this command is:

_vecCurrent = _vecFrom vectorAdd (_vecTo vectorDiff _vecFrom vectorMultiply _interval);

For continuous movement this command should be executed each frame while changing the interval value.

For example to apply interpolation for 10 seconds one could use the following command to translate 10 seconds into 0..1 interval:

t1 = time; t2 = time + 10;
Later inside some on frame event...

_interval = linearConversion [t1, t2, time, 0, 1];
Groups:
Object Manipulation

Syntax

Syntax:
object setVelocityTransformation [fromPosASL, toPosASL, fromVelocity, toVelocity, fromVectorDir, toVectorDir, fromVectorUp, toVectorUp, interval, customCenter]
Parameters:
object: Object - object to be interpolated
fromPosASL: Array format PositionASL - starting getPosASL of the object
toPosASL: Array format PositionASL - ending getPosASL of the object
fromVelocity: Array - starting velocity of the object
toVelocity: Array - ending velocity of the object
fromVectorDir: Array - starting vectorDir of the object
toVectorDir: Array - ending vectorDir of the object
fromVectorUp: Array - starting vectorUp of the object
toVectorUp: Array - ending vectorUp of the object
interval: Number - interpolation interval (variable value, normally between 0 and 1)
since Arma 3 logo black.png2.08
customCenter: Array - (Optional, default placing point of the model (see getModelInfo)) custom center [x, y, z] to which transformation would be applied in model coordinates
Return Value:
Nothing

Examples

Example 1:
_tracker setVelocityTransformation [ _currentPos, _nextPos, _currentVelocity, _nextVelocity, _currentVectorDir, _nextVectorDir, _currentVectorUp, _nextVectorUp, _interval ];
Example 2:
Bob on imaginary stairway to heaven:
bob = createAgent ["C_man_1", player getRelPos [5, 0], [], 0, "CAN_COLLIDE"]; bob switchMove "ladderCivilUpLoop"; pos1 = getPosASL bob; pos2 = pos1 vectorAdd [0,0,0.75]; bob addEventHandler ["AnimDone", { pos1 = pos2; pos2 = pos2 vectorAdd [0,0,0.75] }]; onEachFrame { if (!alive bob) then { onEachFrame {}; bob switchMove ""; bob removeAllEventHandlers "AnimDone"; }; bob setVelocityTransformation [ pos1, pos2, [0,0,0], [0,0,0], [0,1,0], [0,1,0], [0,0,1], [0,0,1], moveTime bob ]; };
Example 3:
Advanced trickery with curved movement. The curve is controlled with one control point (controlPointASL), just like quadratic Bézier curve:
disableSerialization; player setDir 0; interval = 0; _disp = findDisplay 46 createDisplay "RscDisplayEmpty"; _ctrl = _disp ctrlCreate ["RscSlider", -1]; _ctrl ctrlSetPosition [safeZoneX + 0.1, 1, safeZoneW - 0.2, 0.1]; _ctrl ctrlSetActiveColor [1,0,0,1]; _ctrl ctrlCommit 0; _ctrl sliderSetPosition 0; _ctrl sliderSetRange [0,1]; _ctrl sliderSetSpeed [0.1,0.5]; _ctrl ctrlAddEventHandler ["SliderPosChanged", {interval = _this select 1}]; ctrlSetFocus _ctrl; box = "Land_VR_Shape_01_cube_1m_F" createVehicle [0,0,0]; controlPointASL = AGLToASL (player getRelPos [70, -30]) vectorAdd [0, 0, 30]; fromPosASL = AGLToASL (player getRelPos [10, -45]); toPosASL = AGLToASL (player getRelPos [10, 45]); fromControlPointOffset = controlPointASL vectorDiff fromPosASL; toControlPointOffset = toPosASL vectorDiff controlPointASL; onEachFrame { hintSilent format ["Interval: %1", interval]; box setVelocityTransformation [ fromPosASL vectorAdd (fromControlPointOffset vectorMultiply interval), controlPointASL vectorAdd (toControlPointOffset vectorMultiply interval), [0,0,0], [0,0,0], [0,1,0], [1,0,0], [0,0,1], [0,1,0], interval ]; };

Additional Information

See also:
velocity setVelocity velocityModelSpace setVelocityModelSpace speed moveTime disableBrakes brakesDisabled getModelInfo

Notes

Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
ffur2007slx2_5 - c
Posted on Aug 04, 2014 - 12:35 (UTC)
(A3 1.24) Generally speaking setVelocityTransformation is more likely a combination of setPosASL, setVectorDirAndUp (or BIS_fnc_setPitchBank) and time multiplier. It can be used as a position tracker with all necessary information collected, copied and then released within one function. Here’s a simple reproduction on how setVelocityTransformation works in game:
private ["_dataOld","_dataNext","_capturedData","_obj","_fps","_startTrackingTime","_stepOld","_stepNext","_tracker","_tempTime"]; _stepOld = 0; _tempTime = 0; _stepNext = 1; while {true} do { _capturedData = _capturedData + [[getPosASL _obj,velocity _obj,vectorDir _obj,vectorUp _obj]]; sleep _fps; _tempTime = _tempTime + _fps; if (_tempTime >= _startTrackingTime) then { _dataOld = _capturedData select _stepOld; _dataNext = _capturedData select _stepNext; _stepOld = _stepOld + 1; _stepNext = if (_stepNext >= (count _capturedData)) then { _stepOld } else { _stepNext + 1 }; _tracker setVelocityTransformation [ _dataOld select 0, _dataNext select 0, _dataOld select 1, _dataNext select 1, _dataOld select 2, _dataNext select 2, _dataOld select 3, _dataNext select 3, 1 ]; }; };
Tracker starts coping the route and stance from the object when time start counting. TimeDiff determines the distance multiply between the current position and the next position.
DrSova - c
Posted on Jul 04, 2020 - 08:11 (UTC)
You can't apply this command to the dead body in ragdoll.