-
Notifications
You must be signed in to change notification settings - Fork 3.5k
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
Added VelocityVectorProperty #3908
Changes from 3 commits
88e9e04
3621eff
23ef115
2cb5ea4
beeae99
e8f061f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
/*global define*/ | ||
define([ | ||
'../Core/Cartesian3', | ||
'../Core/defaultValue', | ||
'../Core/defined', | ||
'../Core/defineProperties', | ||
'../Core/DeveloperError', | ||
'../Core/Event', | ||
'../Core/JulianDate', | ||
'./Property' | ||
], function( | ||
Cartesian3, | ||
defaultValue, | ||
defined, | ||
defineProperties, | ||
DeveloperError, | ||
Event, | ||
JulianDate, | ||
Property) { | ||
'use strict'; | ||
|
||
/** | ||
* A {@link Property} which evaluates to a {@link Cartesian3} vector | ||
* based on the velocity of the provided {@link PositionProperty}. | ||
* | ||
* @alias VelocityVectorProperty | ||
* @constructor | ||
* | ||
* @param {Property} [position] The position property used to compute the velocity. | ||
* | ||
* @example | ||
* //Create an entity with position and orientation. | ||
* var position = new Cesium.SampledProperty(); | ||
* position.addSamples(...); | ||
* var entity = viewer.entities.add({ | ||
* position : position, | ||
* orientation : new Cesium.VelocityVectorProperty(position) | ||
* })); | ||
*/ | ||
function VelocityVectorProperty(position) { | ||
this._position = undefined; | ||
this._subscription = undefined; | ||
this._definitionChanged = new Event(); | ||
|
||
this.position = position; | ||
} | ||
|
||
defineProperties(VelocityVectorProperty.prototype, { | ||
/** | ||
* Gets a value indicating if this property is constant. | ||
* @memberof VelocityVectorProperty.prototype | ||
* | ||
* @type {Boolean} | ||
* @readonly | ||
*/ | ||
isConstant : { | ||
get : function() { | ||
return Property.isConstant(this._position); | ||
} | ||
}, | ||
/** | ||
* Gets the event that is raised whenever the definition of this property changes. | ||
* @memberof VelocityVectorProperty.prototype | ||
* | ||
* @type {Event} | ||
* @readonly | ||
*/ | ||
definitionChanged : { | ||
get : function() { | ||
return this._definitionChanged; | ||
} | ||
}, | ||
/** | ||
* Gets or sets the position property used to compute orientation. | ||
* @memberof VelocityVectorProperty.prototype | ||
* | ||
* @type {Property} | ||
*/ | ||
position : { | ||
get : function() { | ||
return this._position; | ||
}, | ||
set : function(value) { | ||
var oldValue = this._position; | ||
if (oldValue !== value) { | ||
if (defined(oldValue)) { | ||
this._subscription(); | ||
} | ||
|
||
this._position = value; | ||
|
||
if (defined(value)) { | ||
this._subscription = value._definitionChanged.addEventListener(function() { | ||
this._definitionChanged.raiseEvent(this); | ||
}, this); | ||
} | ||
|
||
this._definitionChanged.raiseEvent(this); | ||
} | ||
} | ||
} | ||
}); | ||
|
||
var position1Scratch = new Cartesian3(); | ||
var position2Scratch = new Cartesian3(); | ||
var velocityScratch = new Cartesian3(); | ||
var timeScratch = new JulianDate(); | ||
var step = 1.0 / 60.0; | ||
|
||
/** | ||
* Gets the value of the property at the provided time. | ||
* | ||
* @param {JulianDate} [time] The time for which to retrieve the value. | ||
* @param {Cartesian3} [result] The object to store the value into, if omitted, a new instance is created and returned. | ||
* @returns {Cartesian3} The modified result parameter or a new instance if the result parameter was not supplied. | ||
*/ | ||
VelocityVectorProperty.prototype.getValue = function(time, result) { | ||
return this._getValue(time, result); | ||
}; | ||
|
||
/** | ||
* @private | ||
*/ | ||
VelocityVectorProperty.prototype._getValue = function(time, velocityResult, positionResult) { | ||
//>>includeStart('debug', pragmas.debug); | ||
if (!defined(time)) { | ||
throw new DeveloperError('time is required'); | ||
} | ||
//>>includeEnd('debug'); | ||
|
||
if (!defined(velocityResult)) { | ||
velocityResult = new Cartesian3(); | ||
} | ||
|
||
var property = this._position; | ||
if (Property.isConstant(property)) { | ||
return undefined; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wouldn't this be the zero vector instead of undefined? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, I guess if you wanted the vector to always be normalized this makes sense. Just wanted to double check. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The other properties seem to return undefined when there isn't a value at that time. This code was pretty much copied from the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, |
||
} | ||
|
||
var position1 = property.getValue(time, position1Scratch); | ||
var position2 = property.getValue(JulianDate.addSeconds(time, step, timeScratch), position2Scratch); | ||
|
||
//If we don't have a position for now, return undefined. | ||
if (!defined(position1)) { | ||
return undefined; | ||
} | ||
|
||
//If we don't have a position for now + step, see if we have a position for now - step. | ||
if (!defined(position2)) { | ||
position2 = position1; | ||
position1 = property.getValue(JulianDate.addSeconds(time, -step, timeScratch), position2Scratch); | ||
|
||
if (!defined(position1)) { | ||
return undefined; | ||
} | ||
} | ||
|
||
if (Cartesian3.equals(position1, position2)) { | ||
return undefined; | ||
} | ||
|
||
if (defined(positionResult)) { | ||
position1.clone(positionResult); | ||
} | ||
|
||
var velocity = Cartesian3.subtract(position2, position1, velocityScratch); | ||
return Cartesian3.normalize(velocity, velocityResult); | ||
}; | ||
|
||
/** | ||
* Compares this property to the provided property and returns | ||
* <code>true</code> if they are equal, <code>false</code> otherwise. | ||
* | ||
* @param {Property} [other] The other property. | ||
* @returns {Boolean} <code>true</code> if left and right are equal, <code>false</code> otherwise. | ||
*/ | ||
VelocityVectorProperty.prototype.equals = function(other) { | ||
return this === other ||// | ||
(other instanceof VelocityVectorProperty && | ||
Property.equals(this._position, other._position)); | ||
}; | ||
|
||
return VelocityVectorProperty; | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This example is now incorrect. I would recommend updating it to illustrate orienting a billboard along it's velocity vector.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The comment is still incorrect. Change it to something like
//Create an entity with a billboard rotated to match its velocity