|
44 | 44 | # It sums up common mass, inertia tensor and center of mass. |
45 | 45 | # The results are stored twice in actual root of super object: |
46 | 46 | # massProperties: container for actual values |
47 | | -function addMassPropertiesOfAllSuperObjChildsToRootSuperObj!(rootSuperObj::Object3D, actualMassSuperObject::Vector{Object3D{F}}) where F <: Modia3D.VarFloatType |
| 47 | +function addMassPropertiesOfAllSuperObjChildsToRootSuperObj!(rootSuperObj::Object3D{F}, actualMassSuperObject::Vector{Object3D{F}}) where F <: Modia3D.VarFloatType |
48 | 48 | if length(actualMassSuperObject) > 0 |
49 | 49 | for i=1:length(actualMassSuperObject) |
50 | 50 | obj = actualMassSuperObject[i] |
|
75 | 75 | # function computeInertiaTensorForTwoBodies!(massPropParent, massPropObj, obj; add=true) |
76 | 76 | function addOrSubtractMassPropertiesOfChildToRoot!(obj_root::Object3D{F}, obj_child::Object3D{F}; add=true)::Nothing where F <: Modia3D.VarFloatType |
77 | 77 | solid::Shapes.Solid{F} = obj_child.feature |
78 | | - massProperties_child = solid.massProperties |
| 78 | + massProperties_child::Shapes.MassProperties{F} = solid.massProperties |
79 | 79 |
|
80 | | - R_child::SMatrix{3,3,F,9}= obj_child.R_rel |
81 | | - r_child::SVector{3,F} = obj_child.r_rel |
82 | | - m_child::F = massProperties_child.m |
83 | | - rCM_child::SVector{3,F} = massProperties_child.rCM |
84 | | - I_child::SMatrix{3,3,F,9}= massProperties_child.I |
| 80 | + R_child = obj_child.R_rel |
| 81 | + r_child = obj_child.r_rel |
| 82 | + m_child::F = massProperties_child.m |
| 83 | + rCM_child::SVector{3,F} = massProperties_child.rCM |
| 84 | + I_child::SMatrix{3,3,F,9} = massProperties_child.I |
85 | 85 |
|
86 | | - m_root::F = obj_root.m |
87 | | - rCM_root::SVector{3,F} = obj_root.r_CM |
88 | | - I_root::SMatrix{3,3,F,9}= obj_root.I_CM |
| 86 | + m_root = obj_root.m |
| 87 | + rCM_root = obj_root.r_CM |
| 88 | + I_root = obj_root.I_CM |
89 | 89 |
|
90 | 90 | # transform childs center of mass to parents coordinate system |
91 | | - rCM_child_new::SVector{3,F} = SVector{3,F}(r_child + R_child' * rCM_child) |
| 91 | + rCM_child_new = r_child + R_child' * rCM_child |
92 | 92 |
|
93 | 93 | # I_child_steiner: I_child needs to be transformed to parents coordinate system |
94 | 94 | # I_root_steiner: I_root needs to be transformed to parents coordinate system |
95 | 95 | # (no need of rotation matrices) |
96 | | - I_child_steiner::SMatrix{3,3,F,9} = SMatrix{3,3,F,9}(Modia3D.NullRotation(F) * I_child * Modia3D.NullRotation(F)' + |
97 | | - m_child * Modia3D.skew(rCM_child_new)' * Modia3D.skew(rCM_child_new) ) |
98 | | - I_root_steiner::SMatrix{3,3,F,9} = SMatrix{3,3,F,9}(I_root + |
99 | | - m_root * Modia3D.skew(rCM_root)' * Modia3D.skew(rCM_root) ) |
| 96 | + I_child_steiner = Modia3D.NullRotation(F) * I_child * Modia3D.NullRotation(F)' + |
| 97 | + m_child * Modia3D.skew(rCM_child_new)' * Modia3D.skew(rCM_child_new) |
| 98 | + I_root_steiner = I_root + |
| 99 | + m_root * Modia3D.skew(rCM_root)' * Modia3D.skew(rCM_root) |
100 | 100 |
|
101 | 101 | if add |
102 | 102 | # ----------- adding mass properties (parent + child) ---------------------- |
103 | 103 | # common mass (parent + child) |
104 | | - m = F(m_root + m_child) |
| 104 | + m = m_root + m_child |
105 | 105 |
|
106 | 106 | # common center of mass (parent + child) |
107 | 107 | @assert(m > 0.0) |
108 | | - rCM::SVector{3,F} = SVector{3,F}((m_root * rCM_root + m_child * rCM_child_new)/m) |
| 108 | + rCM = (m_root * rCM_root + m_child * rCM_child_new)/m |
109 | 109 |
|
110 | 110 | # I: substract new common mass multiplied with skew matrices of |
111 | 111 | # center of mass from the sum of I_root_steiner and I_child_steiner |
112 | | - I::SMatrix{3,3,F,9} = SMatrix{3,3,F,9}(I_root_steiner + I_child_steiner - m * Modia3D.skew(rCM)' * Modia3D.skew(rCM) ) |
| 112 | + I =I_root_steiner + I_child_steiner - m * Modia3D.skew(rCM)' * Modia3D.skew(rCM) |
113 | 113 |
|
114 | 114 | # Assign to obj_root |
115 | 115 | obj_root.m = m |
|
0 commit comments