Scripting/SVector

From sine.space Wiki
Jump to: navigation, search

The SVector struct contains a simple 3D vector of X, Y and Z floats

Fields

X

float X { get; set; }

X axis (red axis)

local obj = Space.Host.ExecutingObject;

local originalPos = obj.LocalPosition;
obj.SubscribeToEvents();

local onStartMethod = function()
  Space.Log(originalPos.x);
  -- prints the X axis position of this object as a float

  originalPos.x = 100.0;
  -- assigns 100.0 value to the X axis position of this object

  obj.LocalPosition = originalPos;
  -- sets the the new position
end

obj.OnStart(onStartMethod);

Y

float Y { get; set; }

Y axis (green axis)

local obj = Space.Host.ExecutingObject;

local originalPos = obj.LocalPosition;
obj.SubscribeToEvents();

local onStartMethod = function()
  Space.Log(originalPos.y);
  -- prints the Y axis position of this object as a float

  originalPos.y = 100.0;
  -- assigns 100.0 value to the Y axis position of this object

  obj.LocalPosition = originalPos;
  -- sets the the new position
end

obj.OnStart(onStartMethod);

Z

float Z { get; set; }

Z axis (blue axis)

local obj = Space.Host.ExecutingObject;

local originalPos = obj.LocalPosition;
obj.SubscribeToEvents();

local onStartMethod = function()
  Space.Log(originalPos.z);
  -- prints the Z axis position of this object as a float

  originalPos.z = 100.0;
  -- assigns 100.0 value to the Z axis position of this object

  obj.LocalPosition = originalPos;
  -- sets the the new position
end

obj.OnStart(onStartMethod);

Constructors

__new

SVector __new (float x, float y, float z)

Initialises vector from three floats

local newVector = Vector.New(0, 1, 0);
-- creates a new vector with value [0, 1, 0]

Members

Note: Add/Scale/Divide are also implemented as operators (e.g. A + B, A += B)

Add

SVector Add (SVector other);

Adds another vector to this, and returns the result

local vector = Vector.New(0, 10, 0);

local vectorOther = Vector.New(40, 50, 6);
Space.Log(vector.Add(vectorOther));
-- prints [40, 60, 6]

Space.Log(vector + vectorOther);

-- prints [40, 60, 6]

Add

SVector Add (float other);

Adds a float to each axis of this, and returns the result

local vectorB = Vector.New(0, 10, 0);

Space.Log(vectorB.Add(5));

-- prints [5, 15, 5]

Scale

SVector Scale (SVector other);

Multiplies another vector to this, and returns the result

local vector = Vector.New(0, 10, 0);

local vectorOther = Vector.New(2, 5, 4);
Space.Log(vector.Scale(vectorOther));
-- prints [0, 50, 0]

Space.Log(vector * vectorOther);

-- prints [0, 50, 0]

Scale

SVector Scale (float other);

Multiplies a float to each axis of this, and returns the result

local vector = Vector.New(0, 10, 0);

Space.Log(vector.Scale(5));
-- prints [0, 50, 0]

Space.Log(vector * 5);

-- prints [0, 50, 0]

Divide

SVector Divide (SVector other);

Divides another vector to this, and returns the result

local vector = Vector.New(10, 10, 10);

local vectorOther = Vector.New(2, 2, 2);
Space.Log(vector.Divide(vectorOther));
-- prints [5, 5, 5]

Space.Log(vector / vectorOther);

-- prints [5, 5, 5]

Divide

SVector Divide (float other);

Divides a float to each axis of this, and returns the result

local vector = Vector.New(10, 10, 10);

Space.Log(vector.Divide(2));
-- prints [5, 5, 5]

Space.Log(vector / 2);

-- prints [5, 5, 5]

Magnitude

float Magnitude { get ; }

Returns the magnitude of this vector

local vector = Vector.New(1.0, 5.0, 0.0);
Space.Log(vector.Magnitude);
-- prints 5.0990195274353

Normalised

SVector Normalised { get ; }

Returns the normalised version of this vector

local vector = Vector.New(0.0, 10.0, 0.0);
Space.Log(vector.Normalised);
-- prints [0, 1, 0]

Distance

float Distance (SVector other);

Returns the distance between this vector and other in meters

local vector = Vector.New(3, 3, 3.5);
local vectorOther = Vector.New(2, 2, 2);
Space.Log(vector.Distance(vectorOther));
-- prints 2.06155276298523

SquareDistance

float SquareDistance (SVector other);

Returns the square of the distance between this vector and other in meters, considerably faster than distance()

local vector = Vector.New(3, 3, 3.5);
local vectorOther = Vector.New(2, 2, 2);
Space.Log(vector.SquareDistance(vectorOther));
-- prints 4.25

InRange

bool InRange (SVector other, float range);

Returns if other is within range meters of this vector, inclusive

local vector = Vector.New(370, 30, 0);

local vectorOther = Vector.New(372, 30, 0);
Space.Log(vector.InRange(vectorOther, 2.0));
-- prints True

local vector2 = Vector.New(80, 30, 20);
local vectorOther2 = Vector.New(1, 15, 25);
Space.Log(vector2.InRange(vectorOther2, 1.0));

-- prints False

Cross

SVector Cross (SVector other);

Returns the cross product of this vector and other

local vector = Vector.New(0, 1, 0);
local vectorOther = Vector.New(1, 0, 0);
Space.Log(vector.Cross(vectorOther));
-- prints [0, 0, -1]

Lerp

SVector Lerp (SVector other, float t);

Linear interpolates between this and other based on factor t (0..1)

-- Lua Translation of Unity C# Documentation

--[["StartMarker" and "EndMaker" are game objects set up as endpoints.
These objects are attached to the script in the Object Reference section.
The name fields in that section should match these names for the example. --]]
local startMarker = Space.Host.GetReference("StartMarker");
local endMarker = Space.Host.GetReference("EndMarker");
local ball = Space.Host.ExecutingObject;
local speed = 1.0;
local startTime;
local journeyLength;
ball.SubscribeToEvents();

local onStartMethod = function()
  startTime = Space.Time;
  journeyLength = startMarker.LocalPosition.Distance(endMarker.LocalPosition);
end

-- This ball object will move from the start endpoint object to the end endpoint.
local moveBall = function()
  local distCovered = (Space.Time - startTime) * speed;
  local fracJourney = distCovered / journeyLength;
  ball.LocalPosition = startMarker.LocalPosition.Lerp(endMarker.LocalPosition, fracJourney);
end

ball.OnStart(onStartMethod);

ball.OnUpdate(moveBall);

Slerp

SVector Slerp (SVector other, float t);

Spherically linear interpolates between this and other based on factor t (0..1)

-- Lua Translation of Unity C# Documentation

--[["Sunrise" and "Sunset" are game objects set up as endpoints.
These objects are attached to the script in the Object Reference section.
The name fields in that section should match these names for the example. --]]
local sunrise = Space.Host.GetReference("Sunrise");
local sunset = Space.Host.GetReference("Sunset");

local ball = Space.Host.ExecutingObject;
local startTime;
local journeyTime = 1.0;
ball.SubscribeToEvents();

local onStartMethod = function()
  startTime = Space.Time;
end

-- This ball object will move from the start endpoint object to the end endpoint.
local moveBall = function()
  local center = (sunrise.LocalPosition + sunset.LocalPosition) * 0.5;
  center = center - Vector.Up;
  local riseRelCenter = sunrise.LocalPosition - center;
  local setRelCenter = sunset.LocalPosition - center;
  local fracComplete = (Space.Time - startTime) / journeyTime;

  ball.LocalPosition = riseRelCenter.Slerp(setRelCenter, fracComplete);
  ball.LocalPosition = ball.LocalPosition + center;
end

ball.OnStart(onStartMethod);

ball.OnUpdate(moveBall);

MoveTowards

SVector MoveTowards (SVector other, float maxDistance);

Moves this vector closer to other by a maximum of maxDistance units

-- Lua Translation of Unity C# Documentation

--[["Target" is a game object set up as a target position.
This object is attached to the script in the Object Reference section.
The name field in that section should match this name for the example. --]]
local target = Space.Host.GetReference("Target");

local ball = Space.Host.ExecutingObject;
local speed = 1.0;
ball.SubscribeToEvents();

local onStartMethod = function()
  startTime = Space.Time;
end

-- This ball object will move towards the target. Negative values for
-- the maxDistance parameter will push the ball away from the target.
local moveBall = function()
  local step = speed * Space.DeltaTime;
  ball.LocalPosition = ball.LocalPosition.MoveTowards(target.LocalPosition, step);
end

ball.OnStart(onStartMethod);
ball.OnUpdate(moveBall);

-- NOTE: If you use MoveTowards, the movement will not overshoot the target.

Dot

float Dot (SVector other);

Returns the dot product between this and other (note - normalise your vectors first!

local vectorA = Vector.New(0, 1, 0);

local vectorOtherA = Vector.New(1, 0, 0);
Space.Log(vectorA.Dot(vectorOtherA));
-- prints 0

local vectorB = Vector.New(0, 1, 0);
local vectorOtherB = Vector.New(0, 1, 0);
Space.Log(vectorB.Dot(vectorOtherB));
-- prints 1

local vectorC = Vector.New(0, 1, 0);
local vectorOtherC = Vector.New(0, -1, 0);
Space.Log(vectorC.Dot(vectorOtherC));

-- prints -1

Static Members

Up

SVector Up { get; }

Equivalent of new SVector(0,1,0)

Space.Log(Vector.Up);
-- prints [0, 1, 0]

Down

SVector Down { get; }

Equivalent of new SVector(0,-1,0)

Space.Log(Vector.Down);
-- prints [0, -1, 0]

Left

SVector Left { get; }

Equivalent of new SVector(-1,0,0)

Space.Log(Vector.Left);
-- prints [-1, 0, 0]

Right

SVector Right { get; }

Equivalent of new SVector(1,0,0)

Space.Log(Vector.Right);
-- prints [1, 0, 0]

Forward

SVector Forward { get; }

Equivalent of new SVector(0,0,1)

Space.Log(Vector.Forward);
-- prints [0, 0, 1]

Back

SVector Back { get; }

Equivalent of new SVector(0,0,-1)

Space.Log(Vector.Back);
-- prints [0, 0, -1]

Zero

SVector Zero { get; }

Equivalent of new SVector(0,0,0)

Space.Log(Vector.Zero);
-- prints [0, 0, 0]

One

SVector One { get; }

Equivalent of new SVector(1,1,1)

Space.Log(Vector.One);
-- prints [1, 1, 1]

MinValue

SVector MinValue { get; }

Contains the largest possible negative vector

Space.Log(Vector.MinValue);
-- prints [-3.402823E+38, -3.402823E+38, -3.402823E+38]

MaxValue

SVector MaxValue { get; }

Contains the largest possible vector

Space.Log(Vector.MaxValue);
-- prints [3.402823E+38, 3.402823E+38, 3.402823E+38]