Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds rotate vector function #6145

Closed
wants to merge 3 commits into from
Closed
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions addons/common/functions/fnc_rotateVectorAroundVector.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Author: LorenLuke
* Rotates the first vector around the second, clockwise by theta
*
* Arguments:
* 0: Vector <ARRAY>
* 1: Rotation Axis <ARRAY>
* 2: Angle <NUMBER>
*
* Return Value:
* Transformed Vector <ARRAY>
*
* Example:
* [eyeDirection player, weaponDirection (currentWeapon player), 45] call ace_common_fnc_rotateVectorAroundVector;
*
* Public: No
*/
#include "script_component.hpp"

params ["_vector1", "_vector2", "_theta"];
_vector1 params ["_vx", "_vy", "_vz"];

private _normalVector = vectorNormalized _vector2;
_normalVector params ["_ux", "_uy", "_uz"];

private _rotationMatrix = [
[cos(_theta) + ((_ux^2) * (1 - cos(_theta))), (_ux * _uy * (1-cos(_theta))) - (_uz * sin(_theta)), (_ux * _uz * (1 - cos(_theta))) + (_uy * sin (_theta))],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are doing cos(_theta) and sin(_theta) a lot in here. Saving it into a variable and reusing it would be alot more efficient.

[(_uy * _ux * (1-cos(_theta))) + (_uz * sin(_theta)), cos(_theta) + ((_uy^2) * (1 - cos(_theta))), (_uy * _uz * (1 - cos(_theta))) - (_ux * sin (_theta))],
[(_uz * _ux * (1-cos(_theta))) - (_uy * sin(_theta)), (_uz * _uy * (1 - cos(_theta))) + (_ux * sin (_theta)), cos(_theta) + ((_uz^2) * (1 - cos(_theta)))]
];

private _vxp = (_vx * ((_rotationMatrix select 0) select 0)) + (_vy * ((_rotationMatrix select 0) select 1)) + (_vz * ((_rotationMatrix select 0) select 2));
private _vyp = (_vx * ((_rotationMatrix select 1) select 0)) + (_vy * ((_rotationMatrix select 1) select 1)) + (_vz * ((_rotationMatrix select 1) select 2));
private _vzp = (_vz * ((_rotationMatrix select 2) select 0)) + (_vy * ((_rotationMatrix select 2) select 1)) + (_vz * ((_rotationMatrix select 2) select 2));
Copy link
Contributor

@ulteq ulteq Feb 13, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be written as:

private _vxp = _vector1 vectorDotProduct (_rotationMatrix select 0);
private _vyp = _vector1 vectorDotProduct (_rotationMatrix select 1);
private _vzp = _vector1 vectorDotProduct (_rotationMatrix select 2);


private _returnVector = [_vxp, _vyp, _vzp];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This serves no purpose.


[_vxp, _vyp, _vzp];