Panda3D
Public Types | Public Member Functions | List of all members
SmoothMover Class Reference

This class handles smoothing of sampled motion points over time, e.g. More...

Public Types

enum  PredictionMode { PM_off = 0, PM_on = 1 }
 
enum  SmoothMode { SM_off = 0, SM_on = 1 }
 

Public Member Functions

 __init__ ()
 
 __init__ (const SmoothMover)
 
 applySmoothHpr (NodePath node)
 Applies the smoothed orientation to the indicated NodePath. More...
 
 applySmoothPos (NodePath node)
 Applies the smoothed position to the indicated NodePath. More...
 
 applySmoothPosHpr (NodePath pos_node, NodePath hpr_node)
 Applies the smoothed position and orientation to the indicated NodePath. More...
 
 clearPositions (bool reset_velocity)
 Erases all the old position reports. More...
 
 computeAndApplySmoothHpr (NodePath hpr_node)
 A further optimization to reduce Python calls. More...
 
 computeAndApplySmoothPos (NodePath node)
 A further optimization to reduce Python calls. More...
 
 computeAndApplySmoothPosHpr (NodePath pos_node, NodePath hpr_node)
 A further optimization to reduce Python calls. More...
 
bool computeSmoothPosition ()
 Computes the smoothed position (and orientation) of the mover at the indicated point in time, based on the previous position reports. More...
 
bool computeSmoothPosition (double timestamp)
 Computes the smoothed position (and orientation) of the mover at the indicated point in time, based on the previous position reports. More...
 
bool getAcceptClockSkew ()
 Returns the current state of the 'accept clock skew' flag. More...
 
bool getDefaultToStandingStill ()
 Returns the current state of the 'default to standing still' flag. More...
 
double getDelay ()
 Returns the amount of time, in seconds, to delay the computed position of a SmoothMover. More...
 
bool getDirectionalVelocity ()
 Returns the current state of the 'directional velocity' flag. More...
 
double getExpectedBroadcastPeriod ()
 Returns the interval at which we expect the SmoothNodes to broadcast their position, in elapsed seconds. More...
 
const LVecBase3 getForwardAxis ()
 Returns the smoothed position as computed by a previous call to compute_smooth_position(). More...
 
bool getLatestPosition ()
 Updates the smooth_pos (and smooth_hpr, etc.) members to reflect the absolute latest position known for this avatar. More...
 
double getMaxPositionAge ()
 Returns the maximum amount of time a position is allowed to remain unchanged before assuming it represents the avatar actually standing still. More...
 
double getMostRecentTimestamp ()
 Returns most recently recorded timestamp. More...
 
SmoothMover::PredictionMode getPredictionMode ()
 Returns the predictioning mode of all SmoothMovers in the world. More...
 
double getResetVelocityAge ()
 Returns the amount of time that should elapse after the last position report before the velocity is reset to 0. More...
 
const LVecBase3 getSampleHpr ()
 Returns the current orientation of the working sample point. More...
 
const LPoint3 getSamplePos ()
 Returns the current position of the working sample point. More...
 
float getSmoothForwardVelocity ()
 Returns the speed at which the avatar is moving, in feet per second, along its own forward axis (after applying the avatar's hpr). More...
 
const LVecBase3 getSmoothHpr ()
 Returns the smoothed orientation as computed by a previous call to compute_smooth_position(). More...
 
float getSmoothLateralVelocity ()
 Returns the speed at which the avatar is moving, in feet per second, along its own lateral axis (after applying the avatar's hpr). More...
 
SmoothMover::SmoothMode getSmoothMode ()
 Returns the smoothing mode of all SmoothMovers in the world. More...
 
const LPoint3 getSmoothPos ()
 Returns the smoothed position as computed by a previous call to compute_smooth_position(). More...
 
float getSmoothRotationalVelocity ()
 Returns the speed at which the avatar is rotating in the horizontal plane (i.e. More...
 
 handleWrtReparent (NodePath old_parent, NodePath new_parent)
 Node is being wrtReparented, update recorded sample positions to reflect new parent. More...
 
bool hasMostRecentTimestamp ()
 Returns true if we have most recently recorded timestamp. More...
 
 markPosition ()
 Stores the position, orientation, and timestamp (if relevant) indicated by previous calls to set_pos(), set_hpr(), and set_timestamp() in a new position report. More...
 
 output (Ostream out)
 
 setAcceptClockSkew (bool flag)
 Sets the 'accept clock skew' flag. More...
 
 setDefaultToStandingStill (bool flag)
 Sets the flag that indicates whether to assume that the node stopped moving during periods when we don't get enough position updates. More...
 
 setDelay (double delay)
 Sets the amount of time, in seconds, to delay the computed position of a SmoothMover. More...
 
 setDirectionalVelocity (bool flag)
 Sets the flag that indicates whether the avatar's direction is considered in computing the velocity. More...
 
 setExpectedBroadcastPeriod (double period)
 Sets the interval at which we expect the SmoothNodes to broadcast their position, in elapsed seconds. More...
 
bool setH (float h)
 Sets the heading only. More...
 
bool setHpr (const LVecBase3 hpr)
 Specifies the orientation of the SmoothMover at a particular time in the past. More...
 
bool setHpr (float h, float p, float r)
 Specifies the orientation of the SmoothMover at a particular time in the past. More...
 
 setMaxPositionAge (double age)
 Sets the maximum amount of time a position is allowed to remain unchanged before assuming it represents the avatar actually standing still. More...
 
bool setP (float p)
 Sets the pitch only. More...
 
 setPhonyTimestamp (double timestamp, bool period_adjust)
 Lies and specifies that the current position report was received now. More...
 
bool setPos (const LVecBase3 pos)
 Specifies the position of the SmoothMover at a particular time in the past. More...
 
bool setPos (float x, float y, float z)
 Specifies the position of the SmoothMover at a particular time in the past. More...
 
bool setPosHpr (const LVecBase3 pos, const LVecBase3 hpr)
 Specifies the position and orientation of the SmoothMover at a particular time in the past. More...
 
bool setPosHpr (float x, float y, float z, float h, float p, float r)
 Specifies the position of the SmoothMover at a particular time in the past. More...
 
 setPredictionMode (SmoothMover::PredictionMode mode)
 Sets the predictioning mode of all SmoothMovers in the world. More...
 
bool setR (float r)
 Sets the roll only. More...
 
 setResetVelocityAge (double age)
 Sets the amount of time that should elapse after the last position report before the velocity is reset to 0. More...
 
 setSmoothMode (SmoothMover::SmoothMode mode)
 Sets the smoothing mode of all SmoothMovers in the world. More...
 
 setTimestamp (double timestamp)
 Specifies the time that the current position report applies. More...
 
bool setX (float x)
 Sets the X position only. More...
 
bool setY (float y)
 Sets the Y position only. More...
 
bool setZ (float z)
 Sets the Z position only. More...
 
 write (Ostream out)
 

Detailed Description

This class handles smoothing of sampled motion points over time, e.g.

for smoothing the apparent movement of remote avatars, whose positions are sent via occasional telemetry updates.

It can operate in any of three modes: off, in which it does not smooth any motion but provides the last position it was told; smoothing only, in which it smooths motion information but never tries to anticipate where the avatar might be going; or full prediction, in which it smooths motion as well as tries to predict the avatar's position in lead of the last position update. The assumption is that all SmoothMovers in the world will be operating in the same mode together.

Member Enumeration Documentation

◆ PredictionMode

Enumerator
PM_off 
PM_on 

◆ SmoothMode

enum SmoothMode
Enumerator
SM_off 
SM_on 

Member Function Documentation

◆ __init__() [1/2]

__init__ ( )

◆ __init__() [2/2]

__init__ ( const  SmoothMover)

◆ applySmoothHpr()

applySmoothHpr ( NodePath  node)

Applies the smoothed orientation to the indicated NodePath.

This is equivalent to calling node.set_hpr(smooth_mover->get_smooth_hpr()). It exists as an optimization only, to avoid the overhead of passing the return value through Python.

◆ applySmoothPos()

applySmoothPos ( NodePath  node)

Applies the smoothed position to the indicated NodePath.

This is equivalent to calling node.set_pos(smooth_mover->get_smooth_pos()). It exists as an optimization only, to avoid the overhead of passing the return value through Python.

◆ applySmoothPosHpr()

applySmoothPosHpr ( NodePath  pos_node,
NodePath  hpr_node 
)

Applies the smoothed position and orientation to the indicated NodePath.

This is equivalent to calling node.set_pos_hpr(smooth_mover->get_smooth_pos(), smooth_mover->get_smooth_hpr()). It exists as an optimization only, to avoid the overhead of passing the return value through Python.

◆ clearPositions()

clearPositions ( bool  reset_velocity)

Erases all the old position reports.

This should be done, for instance, prior to teleporting the avatar to a new position; otherwise, the smoother might try to lerp the avatar there. If reset_velocity is true, the velocity is also reset to 0.

◆ computeAndApplySmoothHpr()

computeAndApplySmoothHpr ( NodePath  hpr_node)

A further optimization to reduce Python calls.

This computes the smooth position and applies it to the indicated node or nodes in one call. The pos_node and hpr_node might be the same NodePath.

◆ computeAndApplySmoothPos()

computeAndApplySmoothPos ( NodePath  node)

A further optimization to reduce Python calls.

This computes the smooth position and applies it to the indicated node in one call.

◆ computeAndApplySmoothPosHpr()

computeAndApplySmoothPosHpr ( NodePath  pos_node,
NodePath  hpr_node 
)

A further optimization to reduce Python calls.

This computes the smooth position and applies it to the indicated node or nodes in one call. The pos_node and hpr_node might be the same NodePath.

◆ computeSmoothPosition() [1/2]

bool computeSmoothPosition ( )

Computes the smoothed position (and orientation) of the mover at the indicated point in time, based on the previous position reports.

After this call has been made, get_smooth_pos() etc. may be called to retrieve the smoothed position.

With no parameter, the function uses ClockObject::get_frame_time() as the default time.

◆ computeSmoothPosition() [2/2]

bool computeSmoothPosition ( double  timestamp)

Computes the smoothed position (and orientation) of the mover at the indicated point in time, based on the previous position reports.

After this call has been made, get_smooth_pos() etc. may be called to retrieve the smoothed position.

The return value is true if the value has changed (or might have changed) since the last call to compute_smooth_position(), or false if it remains the same.

◆ getAcceptClockSkew()

bool getAcceptClockSkew ( )

Returns the current state of the 'accept clock skew' flag.

See set_accept_clock_skew().

◆ getDefaultToStandingStill()

bool getDefaultToStandingStill ( )

Returns the current state of the 'default to standing still' flag.

See set_default_to_standing_still().

◆ getDelay()

double getDelay ( )

Returns the amount of time, in seconds, to delay the computed position of a SmoothMover.

See set_delay().

◆ getDirectionalVelocity()

bool getDirectionalVelocity ( )

Returns the current state of the 'directional velocity' flag.

See set_directional_velocity().

◆ getExpectedBroadcastPeriod()

double getExpectedBroadcastPeriod ( )

Returns the interval at which we expect the SmoothNodes to broadcast their position, in elapsed seconds.

See set_expected_broadcast_period().

◆ getForwardAxis()

const LVecBase3 getForwardAxis ( )

Returns the smoothed position as computed by a previous call to compute_smooth_position().

◆ getLatestPosition()

bool getLatestPosition ( )

Updates the smooth_pos (and smooth_hpr, etc.) members to reflect the absolute latest position known for this avatar.

This may result in a pop to the most recent position.

Returns true if the latest position is known, false otherwise.

◆ getMaxPositionAge()

double getMaxPositionAge ( )

Returns the maximum amount of time a position is allowed to remain unchanged before assuming it represents the avatar actually standing still.

◆ getMostRecentTimestamp()

double getMostRecentTimestamp ( )

Returns most recently recorded timestamp.

◆ getPredictionMode()

SmoothMover::PredictionMode getPredictionMode ( )

Returns the predictioning mode of all SmoothMovers in the world.

See set_prediction_mode().

◆ getResetVelocityAge()

double getResetVelocityAge ( )

Returns the amount of time that should elapse after the last position report before the velocity is reset to 0.

See set_reset_velocity_age().

◆ getSampleHpr()

const LVecBase3 getSampleHpr ( )

Returns the current orientation of the working sample point.

This orientation is updated periodically by set_h(), set_p(), etc., and its current value is copied to the sample point table when mark_position() is called.

◆ getSamplePos()

const LPoint3 getSamplePos ( )

Returns the current position of the working sample point.

This position is updated periodically by set_x(), set_y(), etc., and its current value is copied to the sample point table when mark_position() is called.

◆ getSmoothForwardVelocity()

float getSmoothForwardVelocity ( )

Returns the speed at which the avatar is moving, in feet per second, along its own forward axis (after applying the avatar's hpr).

This will be a positive number if the avatar is moving forward, and a negative number if it is moving backward.

◆ getSmoothHpr()

const LVecBase3 getSmoothHpr ( )

Returns the smoothed orientation as computed by a previous call to compute_smooth_position().

◆ getSmoothLateralVelocity()

float getSmoothLateralVelocity ( )

Returns the speed at which the avatar is moving, in feet per second, along its own lateral axis (after applying the avatar's hpr).

This will be a positive number if the avatar is moving right, and a negative number if it is moving left.

◆ getSmoothMode()

SmoothMover::SmoothMode getSmoothMode ( )

Returns the smoothing mode of all SmoothMovers in the world.

See set_smooth_mode().

◆ getSmoothPos()

const LPoint3 getSmoothPos ( )

Returns the smoothed position as computed by a previous call to compute_smooth_position().

◆ getSmoothRotationalVelocity()

float getSmoothRotationalVelocity ( )

Returns the speed at which the avatar is rotating in the horizontal plane (i.e.

heading), in degrees per second. This may be positive or negative, according to the direction of rotation.

◆ handleWrtReparent()

handleWrtReparent ( NodePath  old_parent,
NodePath  new_parent 
)

Node is being wrtReparented, update recorded sample positions to reflect new parent.

◆ hasMostRecentTimestamp()

bool hasMostRecentTimestamp ( )

Returns true if we have most recently recorded timestamp.

◆ markPosition()

markPosition ( )

Stores the position, orientation, and timestamp (if relevant) indicated by previous calls to set_pos(), set_hpr(), and set_timestamp() in a new position report.

When compute_smooth_position() is called, it uses these stored position reports to base its computation of the known position.

◆ output()

output ( Ostream  out)

◆ setAcceptClockSkew()

setAcceptClockSkew ( bool  flag)

Sets the 'accept clock skew' flag.

When this flag is true, clock skew from the other clients will be tolerated by delaying each smooth mover's position an additional amount, on top of that specified by set_delay(), based on the measured average latency for timestamp messages received by the client.

In this way, if the other client has significant clock skew with respect to our clock, it will be evident as a large positive or negative average latency for timestamps. By subtracting out this average latency, we compensate for poor clock sync.

◆ setDefaultToStandingStill()

setDefaultToStandingStill ( bool  flag)

Sets the flag that indicates whether to assume that the node stopped moving during periods when we don't get enough position updates.

If true, the object will stand still momentarily. If false, the object will continuously lerp between the position updates that we did get.

◆ setDelay()

setDelay ( double  delay)

Sets the amount of time, in seconds, to delay the computed position of a SmoothMover.

This is particularly useful when the prediction mode is off, because it can allow the apparent motion of an avatar to appear smooth without relying on prediction, at the cost of introducing additional lag in the avatar's apparent position.

◆ setDirectionalVelocity()

setDirectionalVelocity ( bool  flag)

Sets the flag that indicates whether the avatar's direction is considered in computing the velocity.

When this is true, velocity is automatically decomposed into a forward and a lateral velocity (and both may be positive or negative); when it is false, all velocity is always returned as forward velocity (and it is always positive).

◆ setExpectedBroadcastPeriod()

setExpectedBroadcastPeriod ( double  period)

Sets the interval at which we expect the SmoothNodes to broadcast their position, in elapsed seconds.

This controls the length of time we assume the object has truly stopped, when we receive a long sequence of no updates.

◆ setH()

bool setH ( float  h)

Sets the heading only.

See set_hpr().

◆ setHpr() [1/2]

bool setHpr ( const LVecBase3  hpr)

Specifies the orientation of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with hpr and timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_hpr(), or false if they are the same.

◆ setHpr() [2/2]

bool setHpr ( float  h,
float  p,
float  r 
)

Specifies the orientation of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with hpr and timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_hpr(), or false if they are the same.

◆ setMaxPositionAge()

setMaxPositionAge ( double  age)

Sets the maximum amount of time a position is allowed to remain unchanged before assuming it represents the avatar actually standing still.

◆ setP()

bool setP ( float  p)

Sets the pitch only.

See set_hpr().

◆ setPhonyTimestamp()

setPhonyTimestamp ( double  timestamp,
bool  period_adjust 
)

Lies and specifies that the current position report was received now.

This is usually used for very old position reports for which we're not sure of the actual receipt time.

◆ setPos() [1/2]

bool setPos ( const LVecBase3  pos)

Specifies the position of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with hpr and timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_pos(), or false if they are the same.

◆ setPos() [2/2]

bool setPos ( float  x,
float  y,
float  z 
)

Specifies the position of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with hpr and timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_pos(), or false if they are the same.

◆ setPosHpr() [1/2]

bool setPosHpr ( const LVecBase3  pos,
const LVecBase3  hpr 
)

Specifies the position and orientation of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_pos_hpr(), or false if they are the same.

◆ setPosHpr() [2/2]

bool setPosHpr ( float  x,
float  y,
float  z,
float  h,
float  p,
float  r 
)

Specifies the position of the SmoothMover at a particular time in the past.

When mark_position() is called, this will be recorded (along with timestamp) in a position report, which will then be used along with all other position reports to determine the smooth position at any particular instant.

The return value is true if any parameter has changed since the last call to set_pos_hpr(), or false if they are the same.

◆ setPredictionMode()

setPredictionMode ( SmoothMover::PredictionMode  mode)

Sets the predictioning mode of all SmoothMovers in the world.

If this is PM_off, no prediction will be performed, but smoothing might still be performed.

◆ setR()

bool setR ( float  r)

Sets the roll only.

See set_hpr().

◆ setResetVelocityAge()

setResetVelocityAge ( double  age)

Sets the amount of time that should elapse after the last position report before the velocity is reset to 0.

This is similar to max_position_age, but it is only used to determine the resetting of the reported velocity. It should always be greater than or equal to max_position_age.

◆ setSmoothMode()

setSmoothMode ( SmoothMover::SmoothMode  mode)

Sets the smoothing mode of all SmoothMovers in the world.

If this is SM_off, no smoothing or prediction will be performed, and get_smooth_pos() will simply return the position last set by mark_position().

◆ setTimestamp()

setTimestamp ( double  timestamp)

Specifies the time that the current position report applies.

This should be called, along with set_pos() and set_hpr(), before a call to mark_position().

◆ setX()

bool setX ( float  x)

Sets the X position only.

See set_pos().

◆ setY()

bool setY ( float  y)

Sets the Y position only.

See set_pos().

◆ setZ()

bool setZ ( float  z)

Sets the Z position only.

See set_pos().

◆ write()

write ( Ostream  out)