diff --git a/doc/XMLreference.rst b/doc/XMLreference.rst index a903b526..5d290e6b 100644 --- a/doc/XMLreference.rst +++ b/doc/XMLreference.rst @@ -3632,6 +3632,13 @@ saving the XML: These attributes are directly passed through to the automatically-generated :ref:`flex` object and have the same meaning. +.. _body-flexcomp-origin: + +:at:`origin`: :at-val:`real(3), "0 0 0"` + The origin of the flexcomp. Used for generating a volumetric mesh from an OBJ surface mesh. Each surface triangle is + connected to the origin to create a tetrahedron, so the resulting volumetric mesh is guaranteed to be well-formed + only for convex shapes. + .. _flexcomp-contact: :el-prefix:`flexcomp/` |-| **contact** (*) diff --git a/doc/XMLschema.rst b/doc/XMLschema.rst index caf07b20..2d1bc9bd 100644 --- a/doc/XMLschema.rst +++ b/doc/XMLschema.rst @@ -445,6 +445,8 @@ | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | | | | | :ref:`axisangle` | :ref:`xyaxes` | :ref:`zaxis` | :ref:`euler` | | | | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | +| | | | :ref:`origin` | | | | | +| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ | +------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | |_2| flexcomp |br| |_2| |L| | | .. table:: | | :ref:`edge | ? | :class: mjcf-attributes | diff --git a/model/flex/asset/cap.obj b/model/flex/asset/cap.obj new file mode 100644 index 00000000..05cce780 --- /dev/null +++ b/model/flex/asset/cap.obj @@ -0,0 +1,617 @@ +#### +# +# OBJ File Generated by Meshlab +# +#### +# Object cap.obj +# +# Vertices: 217 +# Faces: 384 +# +#### +v -0.00000000 0.00000000 0.07411810 +v 0.09659259 0.00000000 -0.00000001 +v 0.04829629 0.08365163 0.00000001 +v -0.04829629 0.08365163 0.00000001 +v -0.09659259 0.00000000 -0.00000001 +v -0.04829629 -0.08365163 0.00000001 +v 0.04829629 -0.08365163 0.00000001 +v 0.05341240 -0.00000000 0.05865872 +v 0.08365164 0.04829629 -0.00000001 +v 0.02670619 0.04625649 0.05865872 +v 0.00000000 0.09659259 -0.00000001 +v -0.02670619 0.04625649 0.05865872 +v -0.08365164 0.04829629 -0.00000001 +v -0.05341240 0.00000000 0.05865872 +v -0.08365164 -0.04829629 -0.00000001 +v -0.02670619 -0.04625649 0.05865872 +v 0.00000000 -0.09659259 -0.00000001 +v 0.02670619 -0.04625649 0.05865872 +v 0.08365164 -0.04829629 -0.00000001 +v 0.06724097 0.02381060 0.04420168 +v 0.05424107 0.04632709 0.04420168 +v 0.04028573 0.02325897 0.06263974 +v 0.01299990 0.07013769 0.04420167 +v -0.01299990 0.07013769 0.04420168 +v -0.00000000 0.04651795 0.06263975 +v -0.05424108 0.04632709 0.04420166 +v -0.06724098 0.02381060 0.04420166 +v -0.04028573 0.02325897 0.06263974 +v -0.06724097 -0.02381060 0.04420168 +v -0.05424107 -0.04632709 0.04420168 +v -0.04028573 -0.02325897 0.06263974 +v -0.01299990 -0.07013769 0.04420167 +v 0.01299990 -0.07013769 0.04420168 +v 0.00000000 -0.04651795 0.06263975 +v 0.05424108 -0.04632709 0.04420166 +v 0.06724098 -0.02381060 0.04420166 +v 0.04028573 -0.02325897 0.06263974 +v 0.02678733 -0.00000000 0.07046351 +v 0.01339367 0.02319851 0.07046351 +v 0.07868688 -0.00000000 0.03583015 +v 0.09330128 0.02500000 -0.00000001 +v 0.06830128 0.06830128 -0.00000004 +v 0.03934343 0.06814483 0.03583015 +v -0.01339367 0.02319851 0.07046351 +v 0.02500000 0.09330128 -0.00000001 +v -0.02500000 0.09330128 -0.00000001 +v -0.03934344 0.06814483 0.03583015 +v -0.02678734 0.00000000 0.07046351 +v -0.06830128 0.06830128 -0.00000004 +v -0.09330128 0.02500000 -0.00000001 +v -0.07868689 0.00000000 0.03583013 +v -0.01339367 -0.02319851 0.07046351 +v -0.09330128 -0.02500000 -0.00000001 +v -0.06830128 -0.06830128 -0.00000004 +v -0.03934343 -0.06814483 0.03583015 +v 0.01339367 -0.02319851 0.07046351 +v -0.02500000 -0.09330128 -0.00000001 +v 0.02500000 -0.09330128 -0.00000001 +v 0.03934344 -0.06814483 0.03583015 +v 0.06830128 -0.06830128 -0.00000004 +v 0.09330128 -0.02500000 -0.00000001 +v 0.06102579 0.03523326 0.04507211 +v 0.04719808 0.03485627 0.05509577 +v 0.05378547 0.02344661 0.05509576 +v -0.00000000 0.07046651 0.04507211 +v -0.00658737 0.05830287 0.05509577 +v 0.00658736 0.05830287 0.05509577 +v -0.06102579 0.03523326 0.04507211 +v -0.05378547 0.02344662 0.05509576 +v -0.04719809 0.03485627 0.05509576 +v -0.06102579 -0.03523326 0.04507211 +v -0.04719808 -0.03485627 0.05509577 +v -0.05378547 -0.02344661 0.05509576 +v 0.00000000 -0.07046651 0.04507211 +v 0.00658737 -0.05830287 0.05509577 +v -0.00658736 -0.05830287 0.05509577 +v 0.06102579 -0.03523326 0.04507211 +v 0.05378547 -0.02344662 0.05509576 +v 0.04719809 -0.03485627 0.05509576 +v 0.03349884 0.01162469 0.06762048 +v 0.02681670 0.02319850 0.06762048 +v 0.02009635 0.01160263 0.07138842 +v 0.08512369 0.01233582 0.02512579 +v 0.08049080 0.02435185 0.02823111 +v 0.07300231 0.01205527 0.04138871 +v 0.06133472 0.05753115 0.02823112 +v 0.05324498 0.06755137 0.02512579 +v 0.04694132 0.05719421 0.04138872 +v 0.00668214 0.03482319 0.06762048 +v -0.00668214 0.03482319 0.06762048 +v -0.00000000 0.02320527 0.07138842 +v 0.03187871 0.07988720 0.02512577 +v 0.01915608 0.08188300 0.02823112 +v 0.02606098 0.06924948 0.04138871 +v -0.01915608 0.08188300 0.02823112 +v -0.03187871 0.07988719 0.02512579 +v -0.02606099 0.06924949 0.04138871 +v -0.02681670 0.02319850 0.06762048 +v -0.03349884 0.01162470 0.06762048 +v -0.02009636 0.01160263 0.07138842 +v -0.05324498 0.06755137 0.02512577 +v -0.06133472 0.05753115 0.02823112 +v -0.04694132 0.05719422 0.04138871 +v -0.08049081 0.02435185 0.02823111 +v -0.08512370 0.01233582 0.02512577 +v -0.07300231 0.01205527 0.04138870 +v -0.03349884 -0.01162469 0.06762048 +v -0.02681670 -0.02319850 0.06762048 +v -0.02009635 -0.01160263 0.07138842 +v -0.08512370 -0.01233582 0.02512577 +v -0.08049080 -0.02435185 0.02823111 +v -0.07300231 -0.01205527 0.04138871 +v -0.06133472 -0.05753115 0.02823112 +v -0.05324498 -0.06755137 0.02512579 +v -0.04694132 -0.05719421 0.04138872 +v -0.00668214 -0.03482319 0.06762048 +v 0.00668214 -0.03482319 0.06762048 +v 0.00000000 -0.02320527 0.07138842 +v -0.03187871 -0.07988720 0.02512577 +v -0.01915608 -0.08188300 0.02823112 +v -0.02606098 -0.06924948 0.04138871 +v 0.01915608 -0.08188300 0.02823112 +v 0.03187871 -0.07988719 0.02512579 +v 0.02606099 -0.06924949 0.04138871 +v 0.02681670 -0.02319850 0.06762048 +v 0.03349884 -0.01162470 0.06762048 +v 0.02009636 -0.01160263 0.07138842 +v 0.05324498 -0.06755137 0.02512577 +v 0.06133472 -0.05753115 0.02823112 +v 0.04694132 -0.05719422 0.04138871 +v 0.08049081 -0.02435185 0.02823111 +v 0.08512369 -0.01233582 0.02512579 +v 0.07300231 -0.01205527 0.04138871 +v 0.06011157 0.01183397 0.05315326 +v 0.04687075 0.01169339 0.06167607 +v 0.07504904 0.03594581 0.02957566 +v 0.06865450 0.04702147 0.02957566 +v 0.04030430 0.04614115 0.05315326 +v 0.03356215 0.03474456 0.06167607 +v 0.01980726 0.05797512 0.05315328 +v 0.01330860 0.04643795 0.06167607 +v 0.00639453 0.08296728 0.02957566 +v -0.00639453 0.08296728 0.02957566 +v -0.01980726 0.05797513 0.05315326 +v -0.01330860 0.04643795 0.06167607 +v -0.04030430 0.04614115 0.05315326 +v -0.03356215 0.03474456 0.06167607 +v -0.06865451 0.04702147 0.02957564 +v -0.07504904 0.03594581 0.02957565 +v -0.06011157 0.01183397 0.05315326 +v -0.04687076 0.01169339 0.06167606 +v -0.06011157 -0.01183397 0.05315326 +v -0.04687075 -0.01169339 0.06167607 +v -0.07504904 -0.03594581 0.02957566 +v -0.06865450 -0.04702147 0.02957566 +v -0.04030430 -0.04614115 0.05315326 +v -0.03356215 -0.03474456 0.06167607 +v -0.01980726 -0.05797512 0.05315328 +v -0.01330860 -0.04643795 0.06167607 +v -0.00639453 -0.08296728 0.02957566 +v 0.00639453 -0.08296728 0.02957566 +v 0.01980726 -0.05797513 0.05315326 +v 0.01330860 -0.04643795 0.06167607 +v 0.04030430 -0.04614115 0.05315326 +v 0.03356215 -0.03474456 0.06167607 +v 0.06865451 -0.04702147 0.02957564 +v 0.07504904 -0.03594581 0.02957565 +v 0.06011157 -0.01183397 0.05315326 +v 0.04687075 -0.01169339 0.06167607 +v 0.01339461 -0.00000000 0.07321696 +v 0.00669730 0.01160007 0.07321696 +v 0.04015301 -0.00000000 0.06570269 +v 0.02007650 0.03477353 0.06570269 +v 0.06638318 -0.00000000 0.04890629 +v 0.08950821 -0.00000000 0.01870825 +v 0.09576622 0.01260786 -0.00000001 +v 0.08923991 0.03696438 -0.00000001 +v 0.03319159 0.05748951 0.04890630 +v 0.07663205 0.05880184 -0.00000001 +v 0.05880184 0.07663205 -0.00000001 +v 0.04475410 0.07751638 0.01870825 +v -0.00669731 0.01160007 0.07321696 +v -0.02007651 0.03477353 0.06570269 +v 0.03696438 0.08923991 -0.00000001 +v 0.01260786 0.09576622 -0.00000001 +v -0.03319159 0.05748951 0.04890630 +v -0.01260786 0.09576622 -0.00000001 +v -0.03696438 0.08923991 -0.00000001 +v -0.04475411 0.07751638 0.01870823 +v -0.01339461 0.00000000 0.07321696 +v -0.04015301 0.00000000 0.06570269 +v -0.05880184 0.07663205 -0.00000001 +v -0.07663205 0.05880184 -0.00000001 +v -0.06638319 0.00000000 0.04890629 +v -0.08923991 0.03696438 -0.00000001 +v -0.09576622 0.01260786 -0.00000001 +v -0.08950821 0.00000000 0.01870823 +v -0.00669730 -0.01160007 0.07321696 +v -0.02007650 -0.03477353 0.06570269 +v -0.09576622 -0.01260786 -0.00000001 +v -0.08923991 -0.03696438 -0.00000001 +v -0.03319159 -0.05748951 0.04890630 +v -0.07663205 -0.05880184 -0.00000001 +v -0.05880184 -0.07663205 -0.00000001 +v -0.04475410 -0.07751638 0.01870825 +v 0.00669731 -0.01160007 0.07321696 +v 0.02007651 -0.03477353 0.06570269 +v -0.03696438 -0.08923991 -0.00000001 +v -0.01260786 -0.09576622 -0.00000001 +v 0.03319159 -0.05748951 0.04890630 +v 0.01260786 -0.09576622 -0.00000001 +v 0.03696438 -0.08923991 -0.00000001 +v 0.04475411 -0.07751638 0.01870823 +v 0.05880184 -0.07663205 -0.00000001 +v 0.07663205 -0.05880184 -0.00000001 +v 0.08923991 -0.03696438 -0.00000001 +v 0.09576622 -0.01260786 -0.00000001 +# 217 vertices, 0 vertices normals + +f 62 63 64 +f 65 66 67 +f 68 69 70 +f 71 72 73 +f 74 75 76 +f 77 78 79 +f 80 81 82 +f 83 84 85 +f 86 87 88 +f 89 90 91 +f 92 93 94 +f 95 96 97 +f 98 99 100 +f 101 102 103 +f 104 105 106 +f 107 108 109 +f 110 111 112 +f 113 114 115 +f 116 117 118 +f 119 120 121 +f 122 123 124 +f 125 126 127 +f 128 129 130 +f 131 132 133 +f 134 64 135 +f 136 137 62 +f 63 138 139 +f 140 67 141 +f 142 143 65 +f 66 144 145 +f 146 70 147 +f 148 149 68 +f 69 150 151 +f 152 73 153 +f 154 155 71 +f 72 156 157 +f 158 76 159 +f 160 161 74 +f 75 162 163 +f 164 79 165 +f 166 167 77 +f 78 168 169 +f 170 82 171 +f 172 135 80 +f 81 139 173 +f 174 85 134 +f 175 176 83 +f 84 177 136 +f 138 88 178 +f 137 179 86 +f 87 180 181 +f 171 91 182 +f 173 141 89 +f 90 145 183 +f 178 94 140 +f 181 184 92 +f 93 185 142 +f 144 97 186 +f 143 187 95 +f 96 188 189 +f 182 100 190 +f 183 147 98 +f 99 151 191 +f 186 103 146 +f 189 192 101 +f 102 193 148 +f 150 106 194 +f 149 195 104 +f 105 196 197 +f 190 109 198 +f 191 153 107 +f 108 157 199 +f 194 112 152 +f 197 200 110 +f 111 201 154 +f 156 115 202 +f 155 203 113 +f 114 204 205 +f 198 118 206 +f 199 159 116 +f 117 163 207 +f 202 121 158 +f 205 208 119 +f 120 209 160 +f 162 124 210 +f 161 211 122 +f 123 212 213 +f 206 127 170 +f 207 165 125 +f 126 169 172 +f 210 130 164 +f 213 214 128 +f 129 215 166 +f 168 133 174 +f 167 216 131 +f 132 217 175 +f 20 62 64 +f 62 21 63 +f 64 63 22 +f 23 65 67 +f 65 24 66 +f 67 66 25 +f 26 68 70 +f 68 27 69 +f 70 69 28 +f 29 71 73 +f 71 30 72 +f 73 72 31 +f 32 74 76 +f 74 33 75 +f 76 75 34 +f 35 77 79 +f 77 36 78 +f 79 78 37 +f 38 80 82 +f 80 22 81 +f 82 81 39 +f 40 83 85 +f 83 41 84 +f 85 84 20 +f 21 86 88 +f 86 42 87 +f 88 87 43 +f 39 89 91 +f 89 25 90 +f 91 90 44 +f 43 92 94 +f 92 45 93 +f 94 93 23 +f 24 95 97 +f 95 46 96 +f 97 96 47 +f 44 98 100 +f 98 28 99 +f 100 99 48 +f 47 101 103 +f 101 49 102 +f 103 102 26 +f 27 104 106 +f 104 50 105 +f 106 105 51 +f 48 107 109 +f 107 31 108 +f 109 108 52 +f 51 110 112 +f 110 53 111 +f 112 111 29 +f 30 113 115 +f 113 54 114 +f 115 114 55 +f 52 116 118 +f 116 34 117 +f 118 117 56 +f 55 119 121 +f 119 57 120 +f 121 120 32 +f 33 122 124 +f 122 58 123 +f 124 123 59 +f 56 125 127 +f 125 37 126 +f 127 126 38 +f 59 128 130 +f 128 60 129 +f 130 129 35 +f 36 131 133 +f 131 61 132 +f 133 132 40 +f 8 134 135 +f 134 20 64 +f 135 64 22 +f 20 136 62 +f 136 9 137 +f 62 137 21 +f 22 63 139 +f 63 21 138 +f 139 138 10 +f 10 140 141 +f 140 23 67 +f 141 67 25 +f 23 142 65 +f 142 11 143 +f 65 143 24 +f 25 66 145 +f 66 24 144 +f 145 144 12 +f 12 146 147 +f 146 26 70 +f 147 70 28 +f 26 148 68 +f 148 13 149 +f 68 149 27 +f 28 69 151 +f 69 27 150 +f 151 150 14 +f 14 152 153 +f 152 29 73 +f 153 73 31 +f 29 154 71 +f 154 15 155 +f 71 155 30 +f 31 72 157 +f 72 30 156 +f 157 156 16 +f 16 158 159 +f 158 32 76 +f 159 76 34 +f 32 160 74 +f 160 17 161 +f 74 161 33 +f 34 75 163 +f 75 33 162 +f 163 162 18 +f 18 164 165 +f 164 35 79 +f 165 79 37 +f 35 166 77 +f 166 19 167 +f 77 167 36 +f 37 78 169 +f 78 36 168 +f 169 168 8 +f 1 170 171 +f 170 38 82 +f 171 82 39 +f 38 172 80 +f 172 8 135 +f 80 135 22 +f 39 81 173 +f 81 22 139 +f 173 139 10 +f 8 174 134 +f 174 40 85 +f 134 85 20 +f 40 175 83 +f 175 2 176 +f 83 176 41 +f 20 84 136 +f 84 41 177 +f 136 177 9 +f 10 138 178 +f 138 21 88 +f 178 88 43 +f 21 137 86 +f 137 9 179 +f 86 179 42 +f 43 87 181 +f 87 42 180 +f 181 180 3 +f 1 171 182 +f 171 39 91 +f 182 91 44 +f 39 173 89 +f 173 10 141 +f 89 141 25 +f 44 90 183 +f 90 25 145 +f 183 145 12 +f 10 178 140 +f 178 43 94 +f 140 94 23 +f 43 181 92 +f 181 3 184 +f 92 184 45 +f 23 93 142 +f 93 45 185 +f 142 185 11 +f 12 144 186 +f 144 24 97 +f 186 97 47 +f 24 143 95 +f 143 11 187 +f 95 187 46 +f 47 96 189 +f 96 46 188 +f 189 188 4 +f 1 182 190 +f 182 44 100 +f 190 100 48 +f 44 183 98 +f 183 12 147 +f 98 147 28 +f 48 99 191 +f 99 28 151 +f 191 151 14 +f 12 186 146 +f 186 47 103 +f 146 103 26 +f 47 189 101 +f 189 4 192 +f 101 192 49 +f 26 102 148 +f 102 49 193 +f 148 193 13 +f 14 150 194 +f 150 27 106 +f 194 106 51 +f 27 149 104 +f 149 13 195 +f 104 195 50 +f 51 105 197 +f 105 50 196 +f 197 196 5 +f 1 190 198 +f 190 48 109 +f 198 109 52 +f 48 191 107 +f 191 14 153 +f 107 153 31 +f 52 108 199 +f 108 31 157 +f 199 157 16 +f 14 194 152 +f 194 51 112 +f 152 112 29 +f 51 197 110 +f 197 5 200 +f 110 200 53 +f 29 111 154 +f 111 53 201 +f 154 201 15 +f 16 156 202 +f 156 30 115 +f 202 115 55 +f 30 155 113 +f 155 15 203 +f 113 203 54 +f 55 114 205 +f 114 54 204 +f 205 204 6 +f 1 198 206 +f 198 52 118 +f 206 118 56 +f 52 199 116 +f 199 16 159 +f 116 159 34 +f 56 117 207 +f 117 34 163 +f 207 163 18 +f 16 202 158 +f 202 55 121 +f 158 121 32 +f 55 205 119 +f 205 6 208 +f 119 208 57 +f 32 120 160 +f 120 57 209 +f 160 209 17 +f 18 162 210 +f 162 33 124 +f 210 124 59 +f 33 161 122 +f 161 17 211 +f 122 211 58 +f 59 123 213 +f 123 58 212 +f 213 212 7 +f 1 206 170 +f 206 56 127 +f 170 127 38 +f 56 207 125 +f 207 18 165 +f 125 165 37 +f 38 126 172 +f 126 37 169 +f 172 169 8 +f 18 210 164 +f 210 59 130 +f 164 130 35 +f 59 213 128 +f 213 7 214 +f 128 214 60 +f 35 129 166 +f 129 60 215 +f 166 215 19 +f 8 168 174 +f 168 36 133 +f 174 133 40 +f 36 167 131 +f 167 19 216 +f 131 216 61 +f 40 132 175 +f 132 61 217 +f 175 217 2 +# 384 faces, 0 coords texture + +# End of File diff --git a/model/flex/gripper.xml b/model/flex/gripper.xml new file mode 100644 index 00000000..b364913a --- /dev/null +++ b/model/flex/gripper.xml @@ -0,0 +1,66 @@ + + + + + + diff --git a/src/user/user_flexcomp.cc b/src/user/user_flexcomp.cc index 8ff486ef..7b1b0116 100644 --- a/src/user/user_flexcomp.cc +++ b/src/user/user_flexcomp.cc @@ -940,8 +940,8 @@ bool mjCFlexcomp::MakeMesh(mjCModel* model, char* error, int error_sz) { } // check dim - if (def.spec.flex->dim != 2) { - return comperr(error, "Flex dim must be 2 in for mesh", error_sz); + if (def.spec.flex->dim < 2) { + return comperr(error, "Flex dim must be at least 2 for mesh", error_sz); } // load resource @@ -990,15 +990,42 @@ bool mjCFlexcomp::MakeMesh(mjCModel* model, char* error, int error_sz) { mesh.RemoveRepeated(); } - // copy faces - element = mesh.Face(); - // copy vertices, convert from float to double point = vector (mesh.nvert()*3); for (int i=0; i < mesh.nvert()*3; i++) { point[i] = (double) mesh.Vert(i); } + // copy faces or create 3D mesh + if (def.spec.flex->dim == 2) { + element = mesh.Face(); + } else { + point.insert(point.begin() + 0, origin[0]); + point.insert(point.begin() + 1, origin[1]); + point.insert(point.begin() + 2, origin[2]); + for (int i=0; i < mesh.Face().size(); i+=3) { + // only add tetrahedra with positive volume + int tet[3] = {mesh.Face()[i+0]+1, + mesh.Face()[i+1]+1, + mesh.Face()[i+2]+1}; + double edge1[3], edge2[3], edge3[3]; + for (int i=0; i < 3; i++) { + edge1[i] = point[3*tet[0]+i] - origin[i]; + edge2[i] = point[3*tet[1]+i] - origin[i]; + edge3[i] = point[3*tet[2]+i] - origin[i]; + } + double normal[3]; + mjuu_crossvec(normal, edge1, edge2); + if (mjuu_dot3(normal, edge3) < mjMINVAL) { + continue; + } + element.push_back(0); + element.push_back(tet[0]); + element.push_back(tet[1]); + element.push_back(tet[2]); + } + } + return true; } diff --git a/src/user/user_flexcomp.h b/src/user/user_flexcomp.h index 6621c650..bb951685 100644 --- a/src/user/user_flexcomp.h +++ b/src/user/user_flexcomp.h @@ -68,6 +68,7 @@ class mjCFlexcomp { int count[3]; // grid count in each dimension double spacing[3]; // spacing between grid elements double scale[3]; // scaling for mesh and direct + double origin[3]; // origin for generating a 3D mesh from a convex 2D mesh double mass; // total mass of auto-generated bodies double inertiabox; // size of inertia box for each body bool equality; // create edge equality constraint diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 70d3342b..f07fa341 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -311,10 +311,10 @@ const char* MJCF[nMJCF][mjXATTRNUM] = { {"config", "*", "2", "key", "value"}, {">"}, {">"}, - {"flexcomp", "*", "24", "name", "type", "group", "dim", + {"flexcomp", "*", "25", "name", "type", "group", "dim", "count", "spacing", "radius", "rigid", "mass", "inertiabox", "scale", "file", "point", "element", "texcoord", "material", "rgba", - "flatskin", "pos", "quat", "axisangle", "xyaxes", "zaxis", "euler"}, + "flatskin", "pos", "quat", "axisangle", "xyaxes", "zaxis", "euler", "origin"}, {"<"}, {"edge", "?", "5", "equality", "solref", "solimp", "stiffness", "damping"}, {"elasticity", "?", "4", "young", "poisson", "damping", "thickness"}, @@ -2643,6 +2643,10 @@ void mjXReader::OneFlexcomp(XMLElement* elem, mjsBody* body, const mjVFS* vfs) { ReadAttrInt(elem, "dim", &dflex.dim); ReadAttr(elem, "radius", 1, &dflex.radius, text); ReadAttrInt(elem, "group", &dflex.group); + if (!ReadAttr(elem, "origin", 3, fcomp.origin, text) && + fcomp.type == mjFCOMPTYPE_MESH && dflex.dim == 3) { + throw mjXError(elem, "origin must be specified for mesh flexcomps if dim=3"); + } // pose ReadAttr(elem, "pos", 3, fcomp.pos, text); diff --git a/test/fixture.cc b/test/fixture.cc index e6cef02f..545691b4 100644 --- a/test/fixture.cc +++ b/test/fixture.cc @@ -231,21 +231,22 @@ mjtNum CompareModel(const mjModel* m1, const mjModel* m2, #undef X if (maxdif > 0) return maxdif; - // compare arrays, apart from bvh-related ones, as those are sensitive to - // numerical differences when meshes are perfectly symmetric. -#define X(type, name, nr, nc) \ - if (strncmp(#name, "bvh_", 4)) { \ - for (int r = 0; r < m1->nr; r++) { \ - for (int c = 0; c < nc; c++) { \ - dif = Compare(m1->name[r * nc + c], m2->name[r * nc + c]); \ - if (dif > maxdif) { \ - maxdif = dif; \ - field = #name; \ - field += " row: " + std::to_string(r); \ - field += " col: " + std::to_string(c); \ - } \ - } \ - } \ + // compare arrays, apart from bvh-related ones (which includes flex_vert0), as + // those are sensitive to numerical differences when meshes are perfectly + // symmetric. +#define X(type, name, nr, nc) \ + if (strncmp(#name, "bvh_", 4) && strncmp(#name, "flex_vert0", 4)) { \ + for (int r = 0; r < m1->nr; r++) { \ + for (int c = 0; c < nc; c++) { \ + dif = Compare(m1->name[r * nc + c], m2->name[r * nc + c]); \ + if (dif > maxdif) { \ + maxdif = dif; \ + field = #name; \ + field += " row: " + std::to_string(r); \ + field += " col: " + std::to_string(c); \ + } \ + } \ + } \ } // NOLINT MJMODEL_POINTERS #undef X