Constructor
new Position()
- Source:
- To Do:
-
Choose a better name ??
Constructor. Return the position corresponding to the origin with the reference frame.
Members
boost :Isometry
- Source:
The isometry component of the position.
Type:
facing :Matrix4
- Source:
The facing as a Matrix4, representing an element of O(3). This is the data that is actually passed to the shader
Type:
point
- Source:
Return the underlying point
quaternion
- Source:
The facing. We represent it as quaternion, whose action by conjugation on R^3 defines an element of O(3)
Methods
applyIsometry(isom) → {Position}
- Source:
Translate the current position by isom
(left action of the isometry group G on the set of positions).
Parameters:
Name | Type | Description |
---|---|---|
isom |
Isometry | the isometry to apply |
Returns:
The current position
- Type
- Position
applyQuaternion(quaternion) → {Position}
- Source:
Rotate the facing by m
(right action of O(3) in the set of positions).
Parameters:
Name | Type | Description |
---|---|---|
quaternion |
Quaternion | the facing to apply (in the observer frame) |
Returns:
The current position
- Type
- Position
clone() → {Position}
- Source:
Return a new copy of the current position.
Returns:
The clone of the current position
- Type
- Position
copy(position) → {Position}
- Source:
Set the current position with the given one.
Parameters:
Name | Type | Description |
---|---|---|
position |
Position | the position to copy |
Returns:
the current position
- Type
- Position
equals(position) → {boolean}
- Source:
Check if the current position and position
are the same.
Parameters:
Name | Type | Description |
---|---|---|
position |
Position |
Returns:
true if the positions are equal, false otherwise
- Type
- boolean
fakeDiffExpMap(matrix) → {Position}
- Source:
Fake version of the differential of the exponential map.
Assume that the current position is the (Id,Id).
Take as input a Matrix4 matrix
seen as an affine isometry of R^3 = T_oX with respect to the reference frame e = (e_1, e_2, e_3)
(or more precisely, an isometry of the tangent bundle of T_oX)
Update the position with the following properties.
Let u = matrix . (0,0,0,1) that is the image of the origin of T_oX by matrix
Let v = matrix . (0,0,1,0) that is the image of the vector e_3 by matrix
The updated position (g,m) is such that g . origin = exp(u) and d_og m v = d_u exp v
Or at least, this is the ideal goal.
We fake the behavior using parallel transport. Apparently the error made if of the order of O(|u|^2). https://mathoverflow.net/questions/126104/difference-between-parallel-transport-and-derivative-of-the-exponential-map Thus for controllers supposed to stay close to the user, it could be enough. (The overlay of the controllers and the seen is only correct at the first order.)
If the current position is not (Id, Id), then everything is made "relative" to the current position.
Parameters:
Name | Type | Description |
---|---|---|
matrix |
Matrix4 | an affine isometry of the tangent space at the origin |
Returns:
- Type
- Position
flow(v) → {Position}
- Source:
Flow the current position.
v
is the pull back at the origin by the position of the direction in which we flow
The time by which we flow is the norm of v
.
The procedure goes as follows.
Let e = (e1, e2, e3)
be the reference frame in the tangent space at the origin.
Assume that the current position is (g,m)
The vector v = (v1, v2, v3)
is given in the observer frame, that is v = d_og m u
,
where u = u1 . e1 + u2 . e2 + u3 . e3
.
- We first pull back the data at the origin by the inverse of
g
. - We compute the position
(g',m')
obtained from the initial position(id, id)
by flowing in the directionw = m u
. This position send the framem e
tod_o g' . m ' . m . e
- We move everything back using
g
, so that the new observer frame isd_o (gg') . m' . m e
.
Hence the new position (gg', m'm)
is obtained by multiplying (g,m)
and (g',m')
Parameters:
Name | Type | Description |
---|---|---|
v |
Vector | the direction in the observer frame |
Returns:
The current position
- Type
- Position
(abstract) flowFromOrigin(v) → {Position}
- Source:
Replace the current position, by the one obtained by flow the initial position (id, id)
in the direction v
(given in the reference frame).
Parameters:
Name | Type | Description |
---|---|---|
v |
Vector | the direction in the reference frame |
Returns:
The current position
- Type
- Position
invert() → {Position}
- Source:
- Deprecated:
- Not sure this is really needed
Set the current position to its inverse
Returns:
The current position
- Type
- Position
multiply(position) → {Position}
- Source:
Multiply the current position (g0,m0) on the right by the given position (g,m), i.e. return (g0 * g, m * m0)
Parameters:
Name | Type | Description |
---|---|---|
position |
Position |
Returns:
The current position
- Type
- Position
premultiply(position) → {Position}
- Source:
Multiply the current position (g0,m0) on the left by the given position (g,m), i.e. return (g * g0, m0 * m)
Parameters:
Name | Type | Description |
---|---|---|
position |
Position |
Returns:
The current position
- Type
- Position
reduceError() → {Position}
- Source:
Reduce the error of the boost part and the quaternion part.
Returns:
The current position
- Type
- Position
reduceErrorBoost() → {Position}
- Source:
Reduce the eventual numerical error of the current boost.
Returns:
The current position
- Type
- Position
reduceErrorQuaternion() → {Position}
- Source:
Make the the quaternion has length one.
Returns:
The current position
- Type
- Position
reset() → {Position}
- Source:
Reset the position in its default position (boost = identity, quaternion = 1)
Returns:
The current position
- Type
- Position
setBoost(isom) → {Position}
- Source:
Set the boost part of the position.
Parameters:
Name | Type | Description |
---|---|---|
isom |
Isometry |
Returns:
The current position
- Type
- Position
setQuaternion(quaternion) → {Position}
- Source:
Set the facing part of the position.
Parameters:
Name | Type | Description |
---|---|---|
quaternion |
Quaternion |
Returns:
The current position
- Type
- Position