====== Vector3 ======
**You can see the latest list of available methods in types.lua. **\\
Vector3 is a class with three values: X, Y and Z.\\
It is used to describe a position or direction of a force.\\
===== List of methods =====
**For the latest list of the methods, refer to "types.lua" file in "EmbeddedScriptWorkspace" folder. **\\
**To shorten the description, ''Vector3 type'' is abbreviated as ''Vec'' and ''number type'' is abbreviated as ''num''. **\\
**Arguments are shown in ''()'' and return values are shown after semicolons '':''. **
| Method name | Description |
| Slerp (a: Vec3, b: Vec3, t: num): Vec3 | Spherically interpolates between two vectors by the coefficient t. The range of t is [0, 1]. |
| SlerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3 | Same as Slerp, but doesn't restrict the t range to [0, 1]. Used for things like springs. |
| OrthoNormalize (normal: usertype, tangent: usertype) |  |
| RotateTowards (current, target, maxRadiansDelta, maxMagnitudeDelta): Vec3 |  |
| Lerp (a: Vec3, b: Vec3, t: num): Vec3 | Linearly interpolates between two vectors by the coefficient t. The range of t is [0, 1]. |
| LerpUnclamped (a: Vec3, b: Vec3, t: num): Vec3 | Same as Lerp, but doesn't restrict the t range to [0, 1]. Used for things like springs. |
| MoveTowards (current: Vec3, target: Vec3, maxDistanceDelta: num): Vec3 |  |
| SmoothDamp (current: Vec3, target: Vec3, currentVelocity: usertype, smoothTime: num, maxSpeed: num): Vec3 | Change the vector gradually toward the target as the time proceeds. |
| set_Item (index: num, value: num) |  |
| Set (newX: num, newY: num, newZ: num) |  |
| Scale (a: Vec3, b: Vec3): Vec3 | Multiply each element of two vectors. |
| Cross (lhs: Vec3, rhs: Vec3): Vec3 | Calculate the cross product of two vectors. |
| GetHashCode(): num | Not to be used. |
| Reflect (inDirection: Vec3, inNormal: Vec3): Vec3 |  |
| Normalize (value: Vec3): Vec3 | Normalize a vector to a unit vector. |
| Dot (lhs: Vec3, rhs: Vec3): num | Calculate the inner product of two vectors. |
| Project (vector: Vec3, onNormal: Vec3): Vec3 | Calculate the vector of the projection of the first argument, using onNormal as the base. |
| ProjectOnPlane (vector: Vec3, planeNormal: Vec3): Vec3 |  |
| Angle (from: Vec3, to: Vec3): num | Return the angle of the vector between two points (Return the result of Dot() as Euler angle)|
| SignedAngle (from: Vec3, to: Vec3, axis: Vec3): num |  |
| Distance (a: Vec3, b: Vec3): num | Calculate the distance between two points: a and b. * Same as (a-b).magnitude |
| ClampMagnitude (vector: Vec3, maxLength: num): Vec3 |  |
| Magnitude (vector: Vec3): num | Calculate the length of the vector. |
| SqrMagnitude (vector: Vec3): num | Calculate the squared length of the vector. |
| Min (lhs: Vec3, rhs: Vec3): Vec3 | Compare each element of two vectors and create a vector with the smallest values. |
| Max (lhs: Vec3, rhs: Vec3): Vec3 | Compare each element of two vectors and create a vector with the largest values. |
| ToString (): string |  |
| AngleBetween (from: Vec3, to: Vec3): num |  |
| Exclude (excludeThis: Vec3, fromThat: Vec3): Vec3 |  |
| normalized: Vec3 | Normalize the vector (Read-only) |
| magnitude: num | Read the vector as length. |
| sqrMagnitude: num | Read the vector as squared length. |
==== Methods for initialization ====
| Method name | Description |
| _new (x: num, y: num, z: num): Vec3 |  |
| zero: Vec3 | (0.0, 0.0, 0.0) |
| one: Vec3 | (1.0, 1.0, 1.0) |
| forward: Vec3 | (0.0, 0.0, 1.0) positive Z-axis |
| back: Vec3 | (0.0, 0.0, -1.0) negative Z-axis |
| up: Vec3 | (0.0, 1.0, 0.0) positive Y-axis |
| down: Vec3 | (0.0, -1.0, 0.0) negative Y-axis |
| left: Vec3 | (0.0, 0.0, 0.0) negative X-axis |
| right: Vec3 | (0.0, 0.0, 0.0) positive X-axis |
| positiveInfinity: Vec3 | (Infinity, Infinity, Infinity) |
| negativeInfinity: Vec3 | (-Infinity, -Infinity, -Infinity) |
| fwd: Vec3 | (0.0, 0.0, 1.0) positive Z-axis (same as forward) |
| kEpsilon: num |  |
| kEpsilonNormalSqrt: num |  |
| x: num | Access only the "x" in a "Vec3" |
| y: num | Access only the "y" in a "Vec3" |
| z: num | Access only the "z" in a "Vec3" |
===== About initialization =====
Example\\
local pos = Vector3.__new(1,1,1)
local zero = Vector3.zero
local one = Vector3.one
print(pos)
print(zero)
print(one)
The result\\
(1.0, 1.0, 1.0)
(0.0, 0.0, 0.0)
(1.0, 1.0, 1.0)
In VCI, to initialize a Vector3, use "new" as shown above.\\
You can also specify the value by using "zero" and "one" after "Vector3".\\
The types of value will be number, which is handled as floating-point numbers internally.
===== List of initialization types =====
Example\\
    local zero = Vector3.zero
    print(zero)
    local one = Vector3.one
    print(one)
    local forward = Vector3.forward
    print(forward)
    local back = Vector3.back
    print(back)
    local up = Vector3.up
    print(up)
    local down = Vector3.down
    print(down)
    local left = Vector3.left
    print(left)
    local right = Vector3.right
    print(right)
The result\\
(0.0, 0.0, 0.0)
(1.0, 1.0, 1.0)
(0.0, 0.0, 1.0)
(0.0, 0.0, -1.0)
(0.0, 1.0, 0.0)
(0.0, -1.0, 0.0)
(-1.0, 0.0, 0.0)
(1.0, 0.0, 0.0)
The X-axis corresponds to left-right direction, Y-axis corresponds to up-down direction and Z-axis corresponds to a forward-backward direction.
For example, by using SetVelocity() ([[en:vci:script:reference:exporttransform|ExportTransform]]) to add Vector3.forward on a SubItem, you can move the SubItem to the direction of Z-axis.
===== Access each x y z element =====
Example\\
    local pos = Vector3.__new(1,1,1)
    pos.x = pos.x + 1
    pos.x = pos.y + 2
    pos.x = pos.z + 3
    print(pos.x)
    print(pos.y)
    print(pos.z)
The result\\
2
3
4
To access each element of Vector3 individually, specify the element you want to access after a variable.\\
Use the format **VariableName.ElementToAccess**.
===== fwd, negativeInfinity, positiveInfinity =====
Example\\
    local fwd = Vector3.fwd
    print(fwd)
    local negativeInfinity = Vector3.negativeInfinity
    print(negativeInfinity)
    local positiveInfinity = Vector3.positiveInfinity
    print(positiveInfinity)
The result\\
(0.0, 0.0, 1.0)
(-Infinity, -Infinity, -Infinity)
(Infinity, Infinity, Infinity)
Vector3.fwd is the same as Vector3.forward.\\
===== normalized =====
Example\\
    local vec3 = Vector3.__new(0.5,1,2)
    print(vec3)
    print(vec3.normalized)
The result\\
(0.5, 1.0, 2.0)
(0.2, 0.4, 0.9)
Normalize a vector.\\
When comparing two vectors, it is difficult to handle them in their original values, therefore, perform normalization to align to the standard unit vector.\\
When you want to handle a vector as a direction, you need to align the vector to the length of 1, so that it can be handled as an element with just the direction.