generateTransform function
dynamic
generateTransform(
- Map transformData
)
Implementation
generateTransform( Map transformData ) {
var lTranslationM = new Matrix4();
var lPreRotationM = new Matrix4();
var lRotationM = new Matrix4();
var lPostRotationM = new Matrix4();
var lScalingM = new Matrix4();
var lScalingPivotM = new Matrix4();
var lScalingOffsetM = new Matrix4();
var lRotationOffsetM = new Matrix4();
var lRotationPivotM = new Matrix4();
var lParentGX = new Matrix4();
var lParentLX = new Matrix4();
var lGlobalT = new Matrix4();
var inheritType = ( transformData["inheritType"] != null ) ? transformData["inheritType"] : 0;
if ( transformData["translation"] != null ) lTranslationM.setPosition( tempVec.fromArray( transformData["translation"] ) );
if ( transformData["preRotation"] != null ) {
List<double> array = List<double>.from(transformData["preRotation"].map( (e) => MathUtils.degToRad(e).toDouble() ).toList());
array.add( THREE.Euler.RotationOrders.indexOf( transformData["eulerOrder"] ).toDouble() );
lPreRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );
}
if ( transformData["rotation"] != null ) {
List<double> array = List<double>.from( transformData["rotation"].map( (e) => MathUtils.degToRad(e).toDouble() ).toList() );
array.add( THREE.Euler.RotationOrders.indexOf( transformData["eulerOrder"] ).toDouble() );
lRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );
}
if ( transformData["postRotation"] != null ) {
List<double> array = List<double>.from( transformData["postRotation"].map( (e) => MathUtils.degToRad ).toList() );
array.add( THREE.Euler.RotationOrders.indexOf( transformData["eulerOrder"] ).toDouble() );
lPostRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );
lPostRotationM.invert();
}
if ( transformData["scale"] != null ) lScalingM.scale( tempVec.fromArray( transformData["scale"] ) );
// Pivots and offsets
if ( transformData["scalingOffset"] != null ) lScalingOffsetM.setPosition( tempVec.fromArray( transformData["scalingOffset"] ) );
if ( transformData["scalingPivot"] != null ) lScalingPivotM.setPosition( tempVec.fromArray( transformData["scalingPivot"] ) );
if ( transformData["rotationOffset"] != null ) lRotationOffsetM.setPosition( tempVec.fromArray( transformData["rotationOffset"] ) );
if ( transformData["rotationPivot"] != null ) lRotationPivotM.setPosition( tempVec.fromArray( transformData["rotationPivot"] ) );
// parent transform
if ( transformData["parentMatrixWorld"] != null ) {
lParentLX.copy( transformData["parentMatrix"] );
lParentGX.copy( transformData["parentMatrixWorld"] );
}
var lLRM = lPreRotationM.clone().multiply( lRotationM ).multiply( lPostRotationM );
// Global Rotation
var lParentGRM = new Matrix4();
lParentGRM.extractRotation( lParentGX );
// Global Shear*Scaling
var lParentTM = new Matrix4();
lParentTM.copyPosition( lParentGX );
var lParentGRSM = lParentTM.clone().invert().multiply( lParentGX );
var lParentGSM = lParentGRM.clone().invert().multiply( lParentGRSM );
var lLSM = lScalingM;
var lGlobalRS = new Matrix4();
if ( inheritType == 0 ) {
lGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM ).multiply( lLSM );
} else if ( inheritType == 1 ) {
lGlobalRS.copy( lParentGRM ).multiply( lParentGSM ).multiply( lLRM ).multiply( lLSM );
} else {
var lParentLSM = new Matrix4().scale( new Vector3().setFromMatrixScale( lParentLX ) );
var lParentLSM_inv = lParentLSM.clone().invert();
var lParentGSM_noLocal = lParentGSM.clone().multiply( lParentLSM_inv );
lGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM_noLocal ).multiply( lLSM );
}
var lRotationPivotM_inv = lRotationPivotM.clone().invert();
var lScalingPivotM_inv = lScalingPivotM.clone().invert();
// Calculate the local transform matrix
var lTransform = lTranslationM.clone().multiply( lRotationOffsetM ).multiply( lRotationPivotM ).multiply( lPreRotationM ).multiply( lRotationM ).multiply( lPostRotationM ).multiply( lRotationPivotM_inv ).multiply( lScalingOffsetM ).multiply( lScalingPivotM ).multiply( lScalingM ).multiply( lScalingPivotM_inv );
var lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition( lTransform );
var lGlobalTranslation = lParentGX.clone().multiply( lLocalTWithAllPivotAndOffsetInfo );
lGlobalT.copyPosition( lGlobalTranslation );
lTransform = lGlobalT.clone().multiply( lGlobalRS );
// from global to local
lTransform.premultiply( lParentGX.invert() );
return lTransform;
}