pymomentum-cpu 0.1.77.post30__cp313-cp313-manylinux_2_39_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pymomentum-cpu might be problematic. Click here for more details.
- include/axel/BoundingBox.h +58 -0
- include/axel/Bvh.h +708 -0
- include/axel/BvhBase.h +75 -0
- include/axel/BvhCommon.h +43 -0
- include/axel/BvhEmbree.h +86 -0
- include/axel/BvhFactory.h +34 -0
- include/axel/Checks.h +21 -0
- include/axel/DualContouring.h +79 -0
- include/axel/KdTree.h +199 -0
- include/axel/Log.h +22 -0
- include/axel/MeshToSdf.h +123 -0
- include/axel/Profile.h +64 -0
- include/axel/Ray.h +45 -0
- include/axel/SignedDistanceField.h +248 -0
- include/axel/SimdKdTree.h +515 -0
- include/axel/TriBvh.h +157 -0
- include/axel/TriBvhEmbree.h +57 -0
- include/axel/common/Constants.h +27 -0
- include/axel/common/Types.h +21 -0
- include/axel/common/VectorizationTypes.h +58 -0
- include/axel/math/BoundingBoxUtils.h +54 -0
- include/axel/math/ContinuousCollisionDetection.h +48 -0
- include/axel/math/CoplanarityCheck.h +30 -0
- include/axel/math/EdgeEdgeDistance.h +31 -0
- include/axel/math/MeshHoleFilling.h +117 -0
- include/axel/math/PointTriangleProjection.h +34 -0
- include/axel/math/PointTriangleProjectionDefinitions.h +209 -0
- include/axel/math/RayTriangleIntersection.h +36 -0
- include/momentum/character/blend_shape.h +91 -0
- include/momentum/character/blend_shape_base.h +70 -0
- include/momentum/character/blend_shape_skinning.h +96 -0
- include/momentum/character/character.h +272 -0
- include/momentum/character/character_state.h +108 -0
- include/momentum/character/character_utility.h +128 -0
- include/momentum/character/collision_geometry.h +80 -0
- include/momentum/character/collision_geometry_state.h +130 -0
- include/momentum/character/fwd.h +262 -0
- include/momentum/character/inverse_parameter_transform.h +58 -0
- include/momentum/character/joint.h +82 -0
- include/momentum/character/joint_state.h +241 -0
- include/momentum/character/linear_skinning.h +139 -0
- include/momentum/character/locator.h +82 -0
- include/momentum/character/locator_state.h +43 -0
- include/momentum/character/marker.h +48 -0
- include/momentum/character/mesh_state.h +71 -0
- include/momentum/character/parameter_limits.h +144 -0
- include/momentum/character/parameter_transform.h +250 -0
- include/momentum/character/pose_shape.h +65 -0
- include/momentum/character/skeleton.h +85 -0
- include/momentum/character/skeleton_state.h +181 -0
- include/momentum/character/skeleton_utility.h +38 -0
- include/momentum/character/skin_weights.h +67 -0
- include/momentum/character/skinned_locator.h +80 -0
- include/momentum/character/types.h +202 -0
- include/momentum/character_sequence_solver/fwd.h +200 -0
- include/momentum/character_sequence_solver/model_parameters_sequence_error_function.h +65 -0
- include/momentum/character_sequence_solver/multipose_solver.h +65 -0
- include/momentum/character_sequence_solver/multipose_solver_function.h +82 -0
- include/momentum/character_sequence_solver/sequence_error_function.h +104 -0
- include/momentum/character_sequence_solver/sequence_solver.h +144 -0
- include/momentum/character_sequence_solver/sequence_solver_function.h +134 -0
- include/momentum/character_sequence_solver/state_sequence_error_function.h +109 -0
- include/momentum/character_sequence_solver/vertex_sequence_error_function.h +128 -0
- include/momentum/character_solver/aim_error_function.h +112 -0
- include/momentum/character_solver/collision_error_function.h +92 -0
- include/momentum/character_solver/collision_error_function_stateless.h +75 -0
- include/momentum/character_solver/constraint_error_function-inl.h +324 -0
- include/momentum/character_solver/constraint_error_function.h +248 -0
- include/momentum/character_solver/distance_error_function.h +77 -0
- include/momentum/character_solver/error_function_utils.h +60 -0
- include/momentum/character_solver/fixed_axis_error_function.h +139 -0
- include/momentum/character_solver/fwd.h +924 -0
- include/momentum/character_solver/gauss_newton_solver_qr.h +64 -0
- include/momentum/character_solver/limit_error_function.h +57 -0
- include/momentum/character_solver/model_parameters_error_function.h +64 -0
- include/momentum/character_solver/normal_error_function.h +73 -0
- include/momentum/character_solver/orientation_error_function.h +74 -0
- include/momentum/character_solver/plane_error_function.h +102 -0
- include/momentum/character_solver/point_triangle_vertex_error_function.h +141 -0
- include/momentum/character_solver/pose_prior_error_function.h +80 -0
- include/momentum/character_solver/position_error_function.h +75 -0
- include/momentum/character_solver/projection_error_function.h +93 -0
- include/momentum/character_solver/simd_collision_error_function.h +99 -0
- include/momentum/character_solver/simd_normal_error_function.h +157 -0
- include/momentum/character_solver/simd_plane_error_function.h +164 -0
- include/momentum/character_solver/simd_position_error_function.h +165 -0
- include/momentum/character_solver/skeleton_error_function.h +151 -0
- include/momentum/character_solver/skeleton_solver_function.h +94 -0
- include/momentum/character_solver/skinned_locator_error_function.h +166 -0
- include/momentum/character_solver/skinned_locator_triangle_error_function.h +146 -0
- include/momentum/character_solver/skinning_weight_iterator.h +80 -0
- include/momentum/character_solver/state_error_function.h +94 -0
- include/momentum/character_solver/transform_pose.h +80 -0
- include/momentum/character_solver/trust_region_qr.h +80 -0
- include/momentum/character_solver/vertex_error_function.h +155 -0
- include/momentum/character_solver/vertex_projection_error_function.h +126 -0
- include/momentum/character_solver/vertex_vertex_distance_error_function.h +151 -0
- include/momentum/common/aligned.h +155 -0
- include/momentum/common/checks.h +27 -0
- include/momentum/common/exception.h +70 -0
- include/momentum/common/filesystem.h +20 -0
- include/momentum/common/fwd.h +27 -0
- include/momentum/common/log.h +173 -0
- include/momentum/common/log_channel.h +17 -0
- include/momentum/common/memory.h +71 -0
- include/momentum/common/profile.h +79 -0
- include/momentum/common/progress_bar.h +37 -0
- include/momentum/common/string.h +52 -0
- include/momentum/diff_ik/ceres_utility.h +73 -0
- include/momentum/diff_ik/fully_differentiable_body_ik.h +58 -0
- include/momentum/diff_ik/fully_differentiable_distance_error_function.h +69 -0
- include/momentum/diff_ik/fully_differentiable_motion_error_function.h +46 -0
- include/momentum/diff_ik/fully_differentiable_orientation_error_function.h +114 -0
- include/momentum/diff_ik/fully_differentiable_pose_prior_error_function.h +76 -0
- include/momentum/diff_ik/fully_differentiable_position_error_function.h +138 -0
- include/momentum/diff_ik/fully_differentiable_projection_error_function.h +65 -0
- include/momentum/diff_ik/fully_differentiable_skeleton_error_function.h +160 -0
- include/momentum/diff_ik/fully_differentiable_state_error_function.h +54 -0
- include/momentum/diff_ik/fwd.h +385 -0
- include/momentum/diff_ik/union_error_function.h +67 -0
- include/momentum/gui/rerun/eigen_adapters.h +70 -0
- include/momentum/gui/rerun/logger.h +102 -0
- include/momentum/gui/rerun/logging_redirect.h +27 -0
- include/momentum/io/character_io.h +56 -0
- include/momentum/io/common/gsl_utils.h +50 -0
- include/momentum/io/common/stream_utils.h +65 -0
- include/momentum/io/fbx/fbx_io.h +109 -0
- include/momentum/io/fbx/fbx_memory_stream.h +66 -0
- include/momentum/io/fbx/openfbx_loader.h +49 -0
- include/momentum/io/fbx/polygon_data.h +60 -0
- include/momentum/io/gltf/gltf_builder.h +132 -0
- include/momentum/io/gltf/gltf_file_format.h +19 -0
- include/momentum/io/gltf/gltf_io.h +148 -0
- include/momentum/io/gltf/utils/accessor_utils.h +299 -0
- include/momentum/io/gltf/utils/coordinate_utils.h +60 -0
- include/momentum/io/gltf/utils/json_utils.h +102 -0
- include/momentum/io/legacy_json/legacy_json_io.h +70 -0
- include/momentum/io/marker/c3d_io.h +29 -0
- include/momentum/io/marker/conversions.h +57 -0
- include/momentum/io/marker/coordinate_system.h +30 -0
- include/momentum/io/marker/marker_io.h +54 -0
- include/momentum/io/marker/trc_io.h +27 -0
- include/momentum/io/motion/mmo_io.h +97 -0
- include/momentum/io/shape/blend_shape_io.h +70 -0
- include/momentum/io/shape/pose_shape_io.h +21 -0
- include/momentum/io/skeleton/locator_io.h +41 -0
- include/momentum/io/skeleton/mppca_io.h +26 -0
- include/momentum/io/skeleton/parameter_limits_io.h +25 -0
- include/momentum/io/skeleton/parameter_transform_io.h +41 -0
- include/momentum/io/skeleton/parameters_io.h +20 -0
- include/momentum/io/urdf/urdf_io.h +26 -0
- include/momentum/io/usd/usd_io.h +36 -0
- include/momentum/marker_tracking/app_utils.h +62 -0
- include/momentum/marker_tracking/marker_tracker.h +213 -0
- include/momentum/marker_tracking/process_markers.h +58 -0
- include/momentum/marker_tracking/tracker_utils.h +90 -0
- include/momentum/math/constants.h +82 -0
- include/momentum/math/covariance_matrix.h +84 -0
- include/momentum/math/fmt_eigen.h +23 -0
- include/momentum/math/fwd.h +132 -0
- include/momentum/math/generalized_loss.h +61 -0
- include/momentum/math/intersection.h +32 -0
- include/momentum/math/mesh.h +84 -0
- include/momentum/math/mppca.h +67 -0
- include/momentum/math/online_householder_qr.h +516 -0
- include/momentum/math/random-inl.h +404 -0
- include/momentum/math/random.h +310 -0
- include/momentum/math/simd_generalized_loss.h +40 -0
- include/momentum/math/transform.h +229 -0
- include/momentum/math/types.h +461 -0
- include/momentum/math/utility.h +251 -0
- include/momentum/rasterizer/camera.h +453 -0
- include/momentum/rasterizer/fwd.h +102 -0
- include/momentum/rasterizer/geometry.h +83 -0
- include/momentum/rasterizer/image.h +18 -0
- include/momentum/rasterizer/rasterizer.h +583 -0
- include/momentum/rasterizer/tensor.h +140 -0
- include/momentum/rasterizer/utility.h +268 -0
- include/momentum/simd/simd.h +221 -0
- include/momentum/solver/fwd.h +131 -0
- include/momentum/solver/gauss_newton_solver.h +136 -0
- include/momentum/solver/gradient_descent_solver.h +65 -0
- include/momentum/solver/solver.h +155 -0
- include/momentum/solver/solver_function.h +126 -0
- include/momentum/solver/subset_gauss_newton_solver.h +109 -0
- include/rerun/archetypes/annotation_context.hpp +157 -0
- include/rerun/archetypes/arrows2d.hpp +271 -0
- include/rerun/archetypes/arrows3d.hpp +257 -0
- include/rerun/archetypes/asset3d.hpp +262 -0
- include/rerun/archetypes/asset_video.hpp +275 -0
- include/rerun/archetypes/bar_chart.hpp +261 -0
- include/rerun/archetypes/boxes2d.hpp +293 -0
- include/rerun/archetypes/boxes3d.hpp +369 -0
- include/rerun/archetypes/capsules3d.hpp +333 -0
- include/rerun/archetypes/clear.hpp +180 -0
- include/rerun/archetypes/depth_image.hpp +425 -0
- include/rerun/archetypes/ellipsoids3d.hpp +384 -0
- include/rerun/archetypes/encoded_image.hpp +250 -0
- include/rerun/archetypes/geo_line_strings.hpp +166 -0
- include/rerun/archetypes/geo_points.hpp +177 -0
- include/rerun/archetypes/graph_edges.hpp +152 -0
- include/rerun/archetypes/graph_nodes.hpp +206 -0
- include/rerun/archetypes/image.hpp +434 -0
- include/rerun/archetypes/instance_poses3d.hpp +221 -0
- include/rerun/archetypes/line_strips2d.hpp +289 -0
- include/rerun/archetypes/line_strips3d.hpp +270 -0
- include/rerun/archetypes/mesh3d.hpp +387 -0
- include/rerun/archetypes/pinhole.hpp +385 -0
- include/rerun/archetypes/points2d.hpp +333 -0
- include/rerun/archetypes/points3d.hpp +369 -0
- include/rerun/archetypes/recording_properties.hpp +132 -0
- include/rerun/archetypes/scalar.hpp +170 -0
- include/rerun/archetypes/scalars.hpp +153 -0
- include/rerun/archetypes/segmentation_image.hpp +305 -0
- include/rerun/archetypes/series_line.hpp +274 -0
- include/rerun/archetypes/series_lines.hpp +271 -0
- include/rerun/archetypes/series_point.hpp +265 -0
- include/rerun/archetypes/series_points.hpp +251 -0
- include/rerun/archetypes/tensor.hpp +213 -0
- include/rerun/archetypes/text_document.hpp +200 -0
- include/rerun/archetypes/text_log.hpp +211 -0
- include/rerun/archetypes/transform3d.hpp +925 -0
- include/rerun/archetypes/video_frame_reference.hpp +295 -0
- include/rerun/archetypes/view_coordinates.hpp +393 -0
- include/rerun/archetypes.hpp +43 -0
- include/rerun/arrow_utils.hpp +32 -0
- include/rerun/as_components.hpp +90 -0
- include/rerun/blueprint/archetypes/background.hpp +113 -0
- include/rerun/blueprint/archetypes/container_blueprint.hpp +259 -0
- include/rerun/blueprint/archetypes/dataframe_query.hpp +178 -0
- include/rerun/blueprint/archetypes/entity_behavior.hpp +130 -0
- include/rerun/blueprint/archetypes/force_center.hpp +115 -0
- include/rerun/blueprint/archetypes/force_collision_radius.hpp +141 -0
- include/rerun/blueprint/archetypes/force_link.hpp +136 -0
- include/rerun/blueprint/archetypes/force_many_body.hpp +124 -0
- include/rerun/blueprint/archetypes/force_position.hpp +132 -0
- include/rerun/blueprint/archetypes/line_grid3d.hpp +178 -0
- include/rerun/blueprint/archetypes/map_background.hpp +104 -0
- include/rerun/blueprint/archetypes/map_zoom.hpp +103 -0
- include/rerun/blueprint/archetypes/near_clip_plane.hpp +109 -0
- include/rerun/blueprint/archetypes/panel_blueprint.hpp +95 -0
- include/rerun/blueprint/archetypes/plot_legend.hpp +118 -0
- include/rerun/blueprint/archetypes/scalar_axis.hpp +116 -0
- include/rerun/blueprint/archetypes/tensor_scalar_mapping.hpp +146 -0
- include/rerun/blueprint/archetypes/tensor_slice_selection.hpp +167 -0
- include/rerun/blueprint/archetypes/tensor_view_fit.hpp +95 -0
- include/rerun/blueprint/archetypes/view_blueprint.hpp +170 -0
- include/rerun/blueprint/archetypes/view_contents.hpp +142 -0
- include/rerun/blueprint/archetypes/viewport_blueprint.hpp +200 -0
- include/rerun/blueprint/archetypes/visible_time_ranges.hpp +116 -0
- include/rerun/blueprint/archetypes/visual_bounds2d.hpp +109 -0
- include/rerun/blueprint/archetypes/visualizer_overrides.hpp +113 -0
- include/rerun/blueprint/archetypes.hpp +29 -0
- include/rerun/blueprint/components/active_tab.hpp +82 -0
- include/rerun/blueprint/components/apply_latest_at.hpp +79 -0
- include/rerun/blueprint/components/auto_layout.hpp +77 -0
- include/rerun/blueprint/components/auto_views.hpp +77 -0
- include/rerun/blueprint/components/background_kind.hpp +66 -0
- include/rerun/blueprint/components/column_share.hpp +78 -0
- include/rerun/blueprint/components/component_column_selector.hpp +81 -0
- include/rerun/blueprint/components/container_kind.hpp +65 -0
- include/rerun/blueprint/components/corner2d.hpp +64 -0
- include/rerun/blueprint/components/enabled.hpp +77 -0
- include/rerun/blueprint/components/filter_by_range.hpp +74 -0
- include/rerun/blueprint/components/filter_is_not_null.hpp +77 -0
- include/rerun/blueprint/components/force_distance.hpp +82 -0
- include/rerun/blueprint/components/force_iterations.hpp +82 -0
- include/rerun/blueprint/components/force_strength.hpp +82 -0
- include/rerun/blueprint/components/grid_columns.hpp +78 -0
- include/rerun/blueprint/components/grid_spacing.hpp +78 -0
- include/rerun/blueprint/components/included_content.hpp +86 -0
- include/rerun/blueprint/components/lock_range_during_zoom.hpp +82 -0
- include/rerun/blueprint/components/map_provider.hpp +64 -0
- include/rerun/blueprint/components/near_clip_plane.hpp +82 -0
- include/rerun/blueprint/components/panel_state.hpp +61 -0
- include/rerun/blueprint/components/query_expression.hpp +89 -0
- include/rerun/blueprint/components/root_container.hpp +77 -0
- include/rerun/blueprint/components/row_share.hpp +78 -0
- include/rerun/blueprint/components/selected_columns.hpp +76 -0
- include/rerun/blueprint/components/tensor_dimension_index_slider.hpp +90 -0
- include/rerun/blueprint/components/timeline_name.hpp +76 -0
- include/rerun/blueprint/components/view_class.hpp +76 -0
- include/rerun/blueprint/components/view_fit.hpp +61 -0
- include/rerun/blueprint/components/view_maximized.hpp +79 -0
- include/rerun/blueprint/components/view_origin.hpp +81 -0
- include/rerun/blueprint/components/viewer_recommendation_hash.hpp +82 -0
- include/rerun/blueprint/components/visible_time_range.hpp +77 -0
- include/rerun/blueprint/components/visual_bounds2d.hpp +74 -0
- include/rerun/blueprint/components/visualizer_override.hpp +86 -0
- include/rerun/blueprint/components/zoom_level.hpp +78 -0
- include/rerun/blueprint/components.hpp +41 -0
- include/rerun/blueprint/datatypes/component_column_selector.hpp +61 -0
- include/rerun/blueprint/datatypes/filter_by_range.hpp +59 -0
- include/rerun/blueprint/datatypes/filter_is_not_null.hpp +61 -0
- include/rerun/blueprint/datatypes/selected_columns.hpp +62 -0
- include/rerun/blueprint/datatypes/tensor_dimension_index_slider.hpp +63 -0
- include/rerun/blueprint/datatypes.hpp +9 -0
- include/rerun/c/arrow_c_data_interface.h +111 -0
- include/rerun/c/compiler_utils.h +10 -0
- include/rerun/c/rerun.h +627 -0
- include/rerun/c/sdk_info.h +28 -0
- include/rerun/collection.hpp +496 -0
- include/rerun/collection_adapter.hpp +43 -0
- include/rerun/collection_adapter_builtins.hpp +138 -0
- include/rerun/compiler_utils.hpp +61 -0
- include/rerun/component_batch.hpp +163 -0
- include/rerun/component_column.hpp +111 -0
- include/rerun/component_descriptor.hpp +142 -0
- include/rerun/component_type.hpp +35 -0
- include/rerun/components/aggregation_policy.hpp +76 -0
- include/rerun/components/albedo_factor.hpp +74 -0
- include/rerun/components/annotation_context.hpp +102 -0
- include/rerun/components/axis_length.hpp +74 -0
- include/rerun/components/blob.hpp +73 -0
- include/rerun/components/class_id.hpp +71 -0
- include/rerun/components/clear_is_recursive.hpp +75 -0
- include/rerun/components/color.hpp +99 -0
- include/rerun/components/colormap.hpp +99 -0
- include/rerun/components/depth_meter.hpp +84 -0
- include/rerun/components/draw_order.hpp +79 -0
- include/rerun/components/entity_path.hpp +83 -0
- include/rerun/components/fill_mode.hpp +72 -0
- include/rerun/components/fill_ratio.hpp +79 -0
- include/rerun/components/gamma_correction.hpp +80 -0
- include/rerun/components/geo_line_string.hpp +63 -0
- include/rerun/components/graph_edge.hpp +75 -0
- include/rerun/components/graph_node.hpp +79 -0
- include/rerun/components/graph_type.hpp +57 -0
- include/rerun/components/half_size2d.hpp +91 -0
- include/rerun/components/half_size3d.hpp +95 -0
- include/rerun/components/image_buffer.hpp +86 -0
- include/rerun/components/image_format.hpp +84 -0
- include/rerun/components/image_plane_distance.hpp +77 -0
- include/rerun/components/interactive.hpp +76 -0
- include/rerun/components/keypoint_id.hpp +74 -0
- include/rerun/components/lat_lon.hpp +89 -0
- include/rerun/components/length.hpp +77 -0
- include/rerun/components/line_strip2d.hpp +73 -0
- include/rerun/components/line_strip3d.hpp +73 -0
- include/rerun/components/magnification_filter.hpp +63 -0
- include/rerun/components/marker_shape.hpp +82 -0
- include/rerun/components/marker_size.hpp +74 -0
- include/rerun/components/media_type.hpp +157 -0
- include/rerun/components/name.hpp +83 -0
- include/rerun/components/opacity.hpp +77 -0
- include/rerun/components/pinhole_projection.hpp +94 -0
- include/rerun/components/plane3d.hpp +75 -0
- include/rerun/components/pose_rotation_axis_angle.hpp +73 -0
- include/rerun/components/pose_rotation_quat.hpp +71 -0
- include/rerun/components/pose_scale3d.hpp +102 -0
- include/rerun/components/pose_transform_mat3x3.hpp +87 -0
- include/rerun/components/pose_translation3d.hpp +96 -0
- include/rerun/components/position2d.hpp +86 -0
- include/rerun/components/position3d.hpp +90 -0
- include/rerun/components/radius.hpp +98 -0
- include/rerun/components/range1d.hpp +75 -0
- include/rerun/components/resolution.hpp +88 -0
- include/rerun/components/rotation_axis_angle.hpp +72 -0
- include/rerun/components/rotation_quat.hpp +71 -0
- include/rerun/components/scalar.hpp +76 -0
- include/rerun/components/scale3d.hpp +102 -0
- include/rerun/components/series_visible.hpp +76 -0
- include/rerun/components/show_labels.hpp +79 -0
- include/rerun/components/stroke_width.hpp +74 -0
- include/rerun/components/tensor_data.hpp +94 -0
- include/rerun/components/tensor_dimension_index_selection.hpp +77 -0
- include/rerun/components/tensor_height_dimension.hpp +71 -0
- include/rerun/components/tensor_width_dimension.hpp +71 -0
- include/rerun/components/texcoord2d.hpp +101 -0
- include/rerun/components/text.hpp +83 -0
- include/rerun/components/text_log_level.hpp +110 -0
- include/rerun/components/timestamp.hpp +76 -0
- include/rerun/components/transform_mat3x3.hpp +92 -0
- include/rerun/components/transform_relation.hpp +66 -0
- include/rerun/components/translation3d.hpp +96 -0
- include/rerun/components/triangle_indices.hpp +85 -0
- include/rerun/components/value_range.hpp +78 -0
- include/rerun/components/vector2d.hpp +92 -0
- include/rerun/components/vector3d.hpp +96 -0
- include/rerun/components/video_timestamp.hpp +120 -0
- include/rerun/components/view_coordinates.hpp +346 -0
- include/rerun/components/visible.hpp +74 -0
- include/rerun/components.hpp +77 -0
- include/rerun/config.hpp +52 -0
- include/rerun/datatypes/angle.hpp +76 -0
- include/rerun/datatypes/annotation_info.hpp +76 -0
- include/rerun/datatypes/blob.hpp +67 -0
- include/rerun/datatypes/bool.hpp +57 -0
- include/rerun/datatypes/channel_datatype.hpp +87 -0
- include/rerun/datatypes/class_description.hpp +92 -0
- include/rerun/datatypes/class_description_map_elem.hpp +69 -0
- include/rerun/datatypes/class_id.hpp +62 -0
- include/rerun/datatypes/color_model.hpp +68 -0
- include/rerun/datatypes/dvec2d.hpp +76 -0
- include/rerun/datatypes/entity_path.hpp +60 -0
- include/rerun/datatypes/float32.hpp +62 -0
- include/rerun/datatypes/float64.hpp +62 -0
- include/rerun/datatypes/image_format.hpp +107 -0
- include/rerun/datatypes/keypoint_id.hpp +63 -0
- include/rerun/datatypes/keypoint_pair.hpp +65 -0
- include/rerun/datatypes/mat3x3.hpp +105 -0
- include/rerun/datatypes/mat4x4.hpp +119 -0
- include/rerun/datatypes/pixel_format.hpp +142 -0
- include/rerun/datatypes/plane3d.hpp +60 -0
- include/rerun/datatypes/quaternion.hpp +110 -0
- include/rerun/datatypes/range1d.hpp +59 -0
- include/rerun/datatypes/range2d.hpp +55 -0
- include/rerun/datatypes/rgba32.hpp +94 -0
- include/rerun/datatypes/rotation_axis_angle.hpp +67 -0
- include/rerun/datatypes/tensor_buffer.hpp +529 -0
- include/rerun/datatypes/tensor_data.hpp +100 -0
- include/rerun/datatypes/tensor_dimension_index_selection.hpp +58 -0
- include/rerun/datatypes/tensor_dimension_selection.hpp +56 -0
- include/rerun/datatypes/time_int.hpp +62 -0
- include/rerun/datatypes/time_range.hpp +55 -0
- include/rerun/datatypes/time_range_boundary.hpp +175 -0
- include/rerun/datatypes/uint16.hpp +62 -0
- include/rerun/datatypes/uint32.hpp +62 -0
- include/rerun/datatypes/uint64.hpp +62 -0
- include/rerun/datatypes/utf8.hpp +76 -0
- include/rerun/datatypes/utf8pair.hpp +62 -0
- include/rerun/datatypes/uuid.hpp +60 -0
- include/rerun/datatypes/uvec2d.hpp +76 -0
- include/rerun/datatypes/uvec3d.hpp +80 -0
- include/rerun/datatypes/uvec4d.hpp +59 -0
- include/rerun/datatypes/vec2d.hpp +76 -0
- include/rerun/datatypes/vec3d.hpp +80 -0
- include/rerun/datatypes/vec4d.hpp +84 -0
- include/rerun/datatypes/video_timestamp.hpp +67 -0
- include/rerun/datatypes/view_coordinates.hpp +87 -0
- include/rerun/datatypes/visible_time_range.hpp +57 -0
- include/rerun/datatypes.hpp +51 -0
- include/rerun/demo_utils.hpp +75 -0
- include/rerun/entity_path.hpp +20 -0
- include/rerun/error.hpp +180 -0
- include/rerun/half.hpp +10 -0
- include/rerun/image_utils.hpp +187 -0
- include/rerun/indicator_component.hpp +59 -0
- include/rerun/loggable.hpp +54 -0
- include/rerun/recording_stream.hpp +960 -0
- include/rerun/rerun_sdk_export.hpp +25 -0
- include/rerun/result.hpp +86 -0
- include/rerun/rotation3d.hpp +33 -0
- include/rerun/sdk_info.hpp +20 -0
- include/rerun/spawn.hpp +21 -0
- include/rerun/spawn_options.hpp +57 -0
- include/rerun/string_utils.hpp +16 -0
- include/rerun/third_party/cxxopts.hpp +2198 -0
- include/rerun/time_column.hpp +288 -0
- include/rerun/timeline.hpp +38 -0
- include/rerun/type_traits.hpp +40 -0
- include/rerun.hpp +86 -0
- lib/cmake/rerun_sdk/rerun_sdkConfig.cmake +70 -0
- lib/cmake/rerun_sdk/rerun_sdkConfigVersion.cmake +83 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets-release.cmake +19 -0
- lib/cmake/rerun_sdk/rerun_sdkTargets.cmake +108 -0
- lib/libarrow.a +0 -0
- lib/libarrow_bundled_dependencies.a +0 -0
- lib/librerun_c__linux_x64.a +0 -0
- lib/librerun_sdk.a +0 -0
- lib64/cmake/axel/axel-config.cmake +45 -0
- lib64/cmake/axel/axelTargets-release.cmake +19 -0
- lib64/cmake/axel/axelTargets.cmake +108 -0
- lib64/cmake/momentum/Findre2.cmake +52 -0
- lib64/cmake/momentum/momentum-config.cmake +67 -0
- lib64/cmake/momentum/momentumTargets-release.cmake +259 -0
- lib64/cmake/momentum/momentumTargets.cmake +377 -0
- lib64/libaxel.a +0 -0
- lib64/libmomentum_app_utils.a +0 -0
- lib64/libmomentum_character.a +0 -0
- lib64/libmomentum_character_sequence_solver.a +0 -0
- lib64/libmomentum_character_solver.a +0 -0
- lib64/libmomentum_common.a +0 -0
- lib64/libmomentum_diff_ik.a +0 -0
- lib64/libmomentum_io.a +0 -0
- lib64/libmomentum_io_common.a +0 -0
- lib64/libmomentum_io_fbx.a +0 -0
- lib64/libmomentum_io_gltf.a +0 -0
- lib64/libmomentum_io_legacy_json.a +0 -0
- lib64/libmomentum_io_marker.a +0 -0
- lib64/libmomentum_io_motion.a +0 -0
- lib64/libmomentum_io_shape.a +0 -0
- lib64/libmomentum_io_skeleton.a +0 -0
- lib64/libmomentum_io_urdf.a +0 -0
- lib64/libmomentum_marker_tracker.a +0 -0
- lib64/libmomentum_math.a +0 -0
- lib64/libmomentum_online_qr.a +0 -0
- lib64/libmomentum_process_markers.a +0 -0
- lib64/libmomentum_rerun.a +0 -0
- lib64/libmomentum_simd_constraints.a +0 -0
- lib64/libmomentum_simd_generalized_loss.a +0 -0
- lib64/libmomentum_skeleton.a +0 -0
- lib64/libmomentum_solver.a +0 -0
- pymomentum/axel.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/backend/__init__.py +16 -0
- pymomentum/backend/skel_state_backend.py +614 -0
- pymomentum/backend/trs_backend.py +871 -0
- pymomentum/backend/utils.py +224 -0
- pymomentum/geometry.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/marker_tracking.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/quaternion.py +740 -0
- pymomentum/skel_state.py +514 -0
- pymomentum/solver.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/solver2.cpython-313-x86_64-linux-gnu.so +0 -0
- pymomentum/torch/character.py +809 -0
- pymomentum/torch/parameter_limits.py +494 -0
- pymomentum/torch/utility.py +20 -0
- pymomentum/trs.py +535 -0
- pymomentum_cpu-0.1.77.post30.dist-info/METADATA +208 -0
- pymomentum_cpu-0.1.77.post30.dist-info/RECORD +555 -0
- pymomentum_cpu-0.1.77.post30.dist-info/WHEEL +5 -0
- pymomentum_cpu-0.1.77.post30.dist-info/licenses/LICENSE +21 -0
- pymomentum_cpu.libs/libabsl_base-86f3b38c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_city-31b65ca2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_debugging_internal-38680253.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_decode_rust_punycode-750652c3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_internal-9a0351a3.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_demangle_rust-71629506.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_examine_stack-57661ecd.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hash-8c523b7e.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_hashtablez_sampler-b5c3e343.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_int128-295bfed5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_kernel_timeout_internal-29296ac1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_globals-6cfa8af5.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_format-a5c79460.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_globals-481e9a7c.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_log_sink_set-ac08f942.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_message-7dfe150a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_nullguard-883adc72.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_proto-a5da8c75.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_internal_structured_proto-e601fd9b.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_log_sink-894261b2.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_low_level_hash-a3284638.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_malloc_internal-814569de.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_hash_set-922d64ad.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_raw_logging_internal-477f78ec.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_spinlock_wait-8b85a473.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_stacktrace-7369e71d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_str_format_internal-98de729d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strerror-39a52998.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings-a57d5127.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_strings_internal-ed8c7c0d.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_symbolize-eba17dd1.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_synchronization-2f8cf326.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time-066c0dde.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_time_zone-72867365.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_tracing_internal-021e37ee.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libabsl_utf8_for_code_point-de2a4d4a.so.2505.0.0 +0 -0
- pymomentum_cpu.libs/libconsole_bridge-f26e11cc.so.1.0 +0 -0
- pymomentum_cpu.libs/libdeflate-577b71e3.so.0 +0 -0
- pymomentum_cpu.libs/libdispenso-67ac1721.so.1.4.0 +0 -0
- pymomentum_cpu.libs/libezc3d-4a95ab2c.so +0 -0
- pymomentum_cpu.libs/libre2-985fb83c.so.11 +0 -0
- pymomentum_cpu.libs/libtinyxml2-8d10763c.so.11.0.0 +0 -0
- pymomentum_cpu.libs/liburdfdom_model-7b26ae88.so.4.0 +0 -0
pymomentum/skel_state.py
ADDED
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
#
|
|
3
|
+
# This source code is licensed under the MIT license found in the
|
|
4
|
+
# LICENSE file in the root directory of this source tree.
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Skeleton State Utilities
|
|
8
|
+
========================
|
|
9
|
+
|
|
10
|
+
This module provides utilities for working with skeleton states in PyMomentum.
|
|
11
|
+
|
|
12
|
+
A skeleton state is a compact 8-dimensional representation of a 3D transformation
|
|
13
|
+
that encodes translation, rotation, and uniform scale. The 8 components are organized as:
|
|
14
|
+
|
|
15
|
+
- **Translation (3 components)**: tx, ty, tz - 3D position offset
|
|
16
|
+
- **Rotation (4 components)**: rx, ry, rz, rw - quaternion rotation (x, y, z, w)
|
|
17
|
+
- **Scale (1 component)**: s - uniform scale factor
|
|
18
|
+
|
|
19
|
+
This representation is generated by forward kinematics functions like
|
|
20
|
+
:func:`pymomentum.geometry.joint_parameters_to_skeleton_state` and represents the
|
|
21
|
+
transformation from a local joint space to the world space.
|
|
22
|
+
|
|
23
|
+
- Creating skeleton states from individual components (:func:`from_translation`,
|
|
24
|
+
:func:`from_quaternion`, :func:`from_scale`)
|
|
25
|
+
- Converting between skeleton states and 4x4 transformation matrices
|
|
26
|
+
(:func:`to_matrix`, :func:`from_matrix`)
|
|
27
|
+
- Performing transformations and operations (:func:`multiply`, :func:`inverse`,
|
|
28
|
+
:func:`transform_points`)
|
|
29
|
+
- Interpolation and blending (:func:`slerp`, :func:`blend`)
|
|
30
|
+
- Validation and manipulation (:func:`check`, :func:`split`)
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
Creating and using a skeleton state::
|
|
34
|
+
|
|
35
|
+
import torch
|
|
36
|
+
from pymomentum import skel_state
|
|
37
|
+
|
|
38
|
+
# Create identity transform
|
|
39
|
+
identity = skel_state.identity()
|
|
40
|
+
|
|
41
|
+
# Create from translation
|
|
42
|
+
translation = torch.tensor([1.0, 2.0, 3.0])
|
|
43
|
+
state = skel_state.from_translation(translation)
|
|
44
|
+
|
|
45
|
+
# Transform points
|
|
46
|
+
points = torch.tensor([[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]])
|
|
47
|
+
transformed = skel_state.transform_points(state, points)
|
|
48
|
+
|
|
49
|
+
Note:
|
|
50
|
+
All functions in this module expect skeleton states to be PyTorch tensors
|
|
51
|
+
with the last dimension having size 8, following the (tx, ty, tz, rx, ry, rz, rw, s)
|
|
52
|
+
format.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
from typing import Sequence
|
|
56
|
+
|
|
57
|
+
import torch
|
|
58
|
+
from pymomentum import quaternion
|
|
59
|
+
|
|
60
|
+
# pyre-strict
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def check(skel_state: torch.Tensor) -> None:
|
|
64
|
+
"""
|
|
65
|
+
Check if the skeleton state has the correct shape.
|
|
66
|
+
|
|
67
|
+
:parameter skel_state: The skeleton state to check.
|
|
68
|
+
:type skel_state: torch.Tensor
|
|
69
|
+
:raises ValueError: If the skeleton state does not have the correct shape.
|
|
70
|
+
"""
|
|
71
|
+
if skel_state.shape[-1] != 8:
|
|
72
|
+
raise ValueError(
|
|
73
|
+
"Expected skeleton state to have last dimension 8 (tx, ty, tz, rx, ry, rz, rw, s)"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def split(skel_state: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
|
|
78
|
+
"""
|
|
79
|
+
Split a skeleton state into translation, rotation, and scale components.
|
|
80
|
+
|
|
81
|
+
:parameter skel_state: The skeleton state to split.
|
|
82
|
+
:type skel_state: torch.Tensor
|
|
83
|
+
:return: A tuple of tensors (translation, rotation, scale).
|
|
84
|
+
:rtype: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
85
|
+
"""
|
|
86
|
+
check(skel_state)
|
|
87
|
+
return skel_state[..., :3], skel_state[..., 3:7], skel_state[..., 7:]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def from_translation(translation: torch.Tensor) -> torch.Tensor:
|
|
91
|
+
"""
|
|
92
|
+
Create a skeleton state from translation.
|
|
93
|
+
|
|
94
|
+
:parameter translation: The translation component.
|
|
95
|
+
:type translation: torch.Tensor
|
|
96
|
+
:return: The skeleton state.
|
|
97
|
+
:rtype: torch.Tensor
|
|
98
|
+
"""
|
|
99
|
+
return torch.cat(
|
|
100
|
+
(
|
|
101
|
+
translation,
|
|
102
|
+
quaternion.identity(
|
|
103
|
+
size=translation.shape[:-1],
|
|
104
|
+
device=translation.device,
|
|
105
|
+
dtype=translation.dtype,
|
|
106
|
+
),
|
|
107
|
+
torch.ones(
|
|
108
|
+
*translation.shape[:-1],
|
|
109
|
+
1,
|
|
110
|
+
dtype=translation.dtype,
|
|
111
|
+
device=translation.device,
|
|
112
|
+
),
|
|
113
|
+
),
|
|
114
|
+
-1,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def from_quaternion(rotation: torch.Tensor) -> torch.Tensor:
|
|
119
|
+
"""
|
|
120
|
+
Create a skeleton state from rotation.
|
|
121
|
+
|
|
122
|
+
:parameter rotation: The rotation component.
|
|
123
|
+
:type rotation: torch.Tensor
|
|
124
|
+
:return: The skeleton state.
|
|
125
|
+
:rtype: torch.Tensor
|
|
126
|
+
"""
|
|
127
|
+
return torch.cat(
|
|
128
|
+
(
|
|
129
|
+
torch.zeros(
|
|
130
|
+
*rotation.shape[:-1],
|
|
131
|
+
3,
|
|
132
|
+
dtype=rotation.dtype,
|
|
133
|
+
device=rotation.device,
|
|
134
|
+
),
|
|
135
|
+
rotation,
|
|
136
|
+
torch.ones(
|
|
137
|
+
*rotation.shape[:-1], 1, dtype=rotation.dtype, device=rotation.device
|
|
138
|
+
),
|
|
139
|
+
),
|
|
140
|
+
-1,
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def from_scale(scale: torch.Tensor) -> torch.Tensor:
|
|
145
|
+
"""
|
|
146
|
+
Create a skeleton state from scale.
|
|
147
|
+
|
|
148
|
+
:parameter scale: The scale component.
|
|
149
|
+
:type scale: torch.Tensor
|
|
150
|
+
:return: The skeleton state.
|
|
151
|
+
:rtype: torch.Tensor
|
|
152
|
+
"""
|
|
153
|
+
return torch.cat(
|
|
154
|
+
(
|
|
155
|
+
torch.zeros(
|
|
156
|
+
*scale.shape[:-1],
|
|
157
|
+
3,
|
|
158
|
+
dtype=scale.dtype,
|
|
159
|
+
device=scale.device,
|
|
160
|
+
),
|
|
161
|
+
quaternion.identity(
|
|
162
|
+
size=scale.shape[:-1],
|
|
163
|
+
device=scale.device,
|
|
164
|
+
dtype=scale.dtype,
|
|
165
|
+
),
|
|
166
|
+
scale,
|
|
167
|
+
),
|
|
168
|
+
-1,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def to_matrix(skeleton_state: torch.Tensor) -> torch.Tensor:
|
|
173
|
+
"""
|
|
174
|
+
Convert skeleton state to a tensor of 4x4 matrices. The matrix represents the transform from a local joint space to the world space.
|
|
175
|
+
|
|
176
|
+
:parameter skeleton_state: The skeleton state to convert.
|
|
177
|
+
:type skeleton_state: torch.Tensor
|
|
178
|
+
:return: A tensor containing 4x4 matrix transforms.
|
|
179
|
+
:rtype: torch.Tensor
|
|
180
|
+
"""
|
|
181
|
+
check(skeleton_state)
|
|
182
|
+
t, q, s = split(skeleton_state)
|
|
183
|
+
|
|
184
|
+
# Assuming quaternionToRotationMatrix is implemented elsewhere
|
|
185
|
+
rot_mat = quaternion.to_rotation_matrix(q)
|
|
186
|
+
linear = rot_mat * s.unsqueeze(-2).expand_as(rot_mat)
|
|
187
|
+
affine = torch.cat((linear, t.unsqueeze(-1)), -1)
|
|
188
|
+
|
|
189
|
+
last_row = (
|
|
190
|
+
torch.tensor(
|
|
191
|
+
[0.0, 0.0, 0.0, 1.0],
|
|
192
|
+
device=skeleton_state.device,
|
|
193
|
+
dtype=skeleton_state.dtype,
|
|
194
|
+
)
|
|
195
|
+
.unsqueeze(0)
|
|
196
|
+
.expand(*affine.shape[:-2], 1, 4)
|
|
197
|
+
)
|
|
198
|
+
result = torch.cat((affine, last_row), -2)
|
|
199
|
+
return result
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _normalize_split_skel_state(
|
|
203
|
+
components: tuple[torch.Tensor, torch.Tensor, torch.Tensor],
|
|
204
|
+
) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
|
|
205
|
+
"""
|
|
206
|
+
Normalize the quaternion component of a split skeleton state.
|
|
207
|
+
|
|
208
|
+
:parameter components: Tuple of (translation, rotation, scale) components.
|
|
209
|
+
:type components: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
210
|
+
:return: Tuple of (translation, normalized_rotation, scale) components.
|
|
211
|
+
:rtype: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
212
|
+
"""
|
|
213
|
+
t, q, s = components
|
|
214
|
+
return t, quaternion.normalize(q), s
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def _multiply_split_skel_states(
|
|
218
|
+
skel_state1: tuple[torch.Tensor, torch.Tensor, torch.Tensor],
|
|
219
|
+
skel_state2: tuple[torch.Tensor, torch.Tensor, torch.Tensor],
|
|
220
|
+
) -> torch.Tensor:
|
|
221
|
+
"""
|
|
222
|
+
Helper function to multiply two skeleton states from their split components.
|
|
223
|
+
Assumes quaternions are already normalized.
|
|
224
|
+
|
|
225
|
+
:parameter skel_state1: Tuple of (translation, rotation, scale) for first skeleton state.
|
|
226
|
+
:type skel_state1: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
227
|
+
:parameter skel_state2: Tuple of (translation, rotation, scale) for second skeleton state.
|
|
228
|
+
:type skel_state2: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
229
|
+
:return: The product of the two skeleton states.
|
|
230
|
+
:rtype: torch.Tensor
|
|
231
|
+
"""
|
|
232
|
+
t1, q1, s1 = skel_state1
|
|
233
|
+
t2, q2, s2 = skel_state2
|
|
234
|
+
|
|
235
|
+
t_res = t1 + s1 * quaternion.rotate_vector_assume_normalized(q1, t2)
|
|
236
|
+
s_res = s1 * s2
|
|
237
|
+
q_res = quaternion.multiply_assume_normalized(q1, q2)
|
|
238
|
+
|
|
239
|
+
return torch.cat((t_res, q_res, s_res), -1)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def multiply(s1: torch.Tensor, s2: torch.Tensor) -> torch.Tensor:
|
|
243
|
+
"""
|
|
244
|
+
Multiply two skeleton states.
|
|
245
|
+
|
|
246
|
+
:parameter s1: The first skeleton state.
|
|
247
|
+
:type s1: torch.Tensor
|
|
248
|
+
:parameter s2: The second skeleton state.
|
|
249
|
+
:type s2: torch.Tensor
|
|
250
|
+
:return: The product of the two skeleton states.
|
|
251
|
+
:rtype: torch.Tensor
|
|
252
|
+
"""
|
|
253
|
+
check(s1)
|
|
254
|
+
check(s2)
|
|
255
|
+
while s1.ndim < s2.ndim:
|
|
256
|
+
s1 = s1.unsqueeze(0)
|
|
257
|
+
|
|
258
|
+
return _multiply_split_skel_states(
|
|
259
|
+
_normalize_split_skel_state(split(s1)), _normalize_split_skel_state(split(s2))
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def multiply_assume_normalized(s1: torch.Tensor, s2: torch.Tensor) -> torch.Tensor:
|
|
264
|
+
"""
|
|
265
|
+
Multiply two skeleton states.
|
|
266
|
+
This is an optimized version that assumes both skeleton states are already properly
|
|
267
|
+
formatted and the quaternions are normalized, skipping validation checks.
|
|
268
|
+
|
|
269
|
+
:parameter s1: The first skeleton state.
|
|
270
|
+
:type s1: torch.Tensor
|
|
271
|
+
:parameter s2: The second skeleton state.
|
|
272
|
+
:type s2: torch.Tensor
|
|
273
|
+
:return: The product of the two skeleton states.
|
|
274
|
+
:rtype: torch.Tensor
|
|
275
|
+
"""
|
|
276
|
+
while s1.ndim < s2.ndim:
|
|
277
|
+
s1 = s1.unsqueeze(0)
|
|
278
|
+
|
|
279
|
+
return _multiply_split_skel_states(split(s1), split(s2))
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def inverse(skeleton_states: torch.Tensor) -> torch.Tensor:
|
|
283
|
+
"""
|
|
284
|
+
Compute the inverse of a skeleton state.
|
|
285
|
+
|
|
286
|
+
:parameter skeleton_states: The skeleton state to invert.
|
|
287
|
+
:type skeleton_states: torch.Tensor
|
|
288
|
+
:return: The inverted skeleton state.
|
|
289
|
+
:rtype: torch.Tensor
|
|
290
|
+
"""
|
|
291
|
+
t, q, s = split(skeleton_states)
|
|
292
|
+
q_inv = quaternion.inverse(q)
|
|
293
|
+
s_inv = torch.reciprocal(s)
|
|
294
|
+
|
|
295
|
+
return torch.cat((-s_inv * quaternion.rotate_vector(q_inv, t), q_inv, s_inv), -1)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _transform_points_split_skel_state(
|
|
299
|
+
skel_state: tuple[torch.Tensor, torch.Tensor, torch.Tensor],
|
|
300
|
+
points: torch.Tensor,
|
|
301
|
+
) -> torch.Tensor:
|
|
302
|
+
"""
|
|
303
|
+
Helper function to transform points using skeleton state components.
|
|
304
|
+
Assumes quaternion is already normalized.
|
|
305
|
+
|
|
306
|
+
:parameter skel_state: Tuple of (translation, rotation, scale) components.
|
|
307
|
+
:type skel_state: tuple[torch.Tensor, torch.Tensor, torch.Tensor]
|
|
308
|
+
:parameter points: The points to transform.
|
|
309
|
+
:type points: torch.Tensor
|
|
310
|
+
:return: The transformed points.
|
|
311
|
+
:rtype: torch.Tensor
|
|
312
|
+
"""
|
|
313
|
+
t, q, s = skel_state
|
|
314
|
+
return t + quaternion.rotate_vector(q, s * points)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def transform_points(skel_state: torch.Tensor, points: torch.Tensor) -> torch.Tensor:
|
|
318
|
+
"""
|
|
319
|
+
Transform 3d points by the transform represented by the skeleton state.
|
|
320
|
+
|
|
321
|
+
:parameter skel_state: The skeleton state to use for transformation.
|
|
322
|
+
:type skel_state: torch.Tensor
|
|
323
|
+
:parameter points: The points to transform.
|
|
324
|
+
:type points: torch.Tensor
|
|
325
|
+
:return: The transformed points.
|
|
326
|
+
:rtype: torch.Tensor
|
|
327
|
+
"""
|
|
328
|
+
check(skel_state)
|
|
329
|
+
if points.dim() < 1 or points.shape[-1] != 3:
|
|
330
|
+
raise ValueError("Points tensor should have last dimension 3.")
|
|
331
|
+
|
|
332
|
+
# allow transforming multiple points with a single skel_state.
|
|
333
|
+
while skel_state.ndim < points.ndim:
|
|
334
|
+
skel_state = skel_state.unsqueeze(0)
|
|
335
|
+
|
|
336
|
+
return _transform_points_split_skel_state(
|
|
337
|
+
_normalize_split_skel_state(split(skel_state)), points
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def transform_points_assume_normalized(
|
|
342
|
+
skel_state: torch.Tensor, points: torch.Tensor
|
|
343
|
+
) -> torch.Tensor:
|
|
344
|
+
"""
|
|
345
|
+
Transform 3d points by the transform represented by the skeleton state.
|
|
346
|
+
This is an optimized version that assumes the skeleton state is already properly
|
|
347
|
+
formatted and the quaternion is normalized, skipping validation checks.
|
|
348
|
+
|
|
349
|
+
:parameter skel_state: The skeleton state to use for transformation.
|
|
350
|
+
:type skel_state: torch.Tensor
|
|
351
|
+
:parameter points: The points to transform.
|
|
352
|
+
:type points: torch.Tensor
|
|
353
|
+
:return: The transformed points.
|
|
354
|
+
:rtype: torch.Tensor
|
|
355
|
+
"""
|
|
356
|
+
# when multipying by points, we'll allow a single skel_state to transform multiple points. So we'll allow adding a single extra dimension to the skel_state.
|
|
357
|
+
if skel_state.ndim < points.ndim:
|
|
358
|
+
skel_state = skel_state.unsqueeze(0)
|
|
359
|
+
return _transform_points_split_skel_state(split(skel_state), points)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def identity(
|
|
363
|
+
size: Sequence[int] | None = None, device: torch.device | None = None
|
|
364
|
+
) -> torch.Tensor:
|
|
365
|
+
"""
|
|
366
|
+
Returns a skeleton state representing the identity transform.
|
|
367
|
+
|
|
368
|
+
:parameter sizes: The size of each dimension in the output tensor. Defaults to None, which means the output will be a 1D tensor with 8 elements.
|
|
369
|
+
:type sizes: list[int], optional
|
|
370
|
+
:parameter device: The device on which to create the tensor. Defaults to None, which means the tensor will be created on the default device.
|
|
371
|
+
:type device: torch.device, optional
|
|
372
|
+
:return: The identity skeleton state.
|
|
373
|
+
:rtype: torch.Tensor
|
|
374
|
+
"""
|
|
375
|
+
zeros = (
|
|
376
|
+
torch.zeros(*size, 3, device=device) if size else torch.zeros(3, device=device)
|
|
377
|
+
)
|
|
378
|
+
ones = torch.ones(*size, 1, device=device) if size else torch.ones(1, device=device)
|
|
379
|
+
q_identity = quaternion.identity(size=size, device=device)
|
|
380
|
+
|
|
381
|
+
return torch.cat((zeros, q_identity, ones), -1)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def blend(
|
|
385
|
+
skel_states: torch.Tensor, weights: torch.Tensor | None = None
|
|
386
|
+
) -> torch.Tensor:
|
|
387
|
+
"""
|
|
388
|
+
Blend k skeleton states with the passed-in weights.
|
|
389
|
+
|
|
390
|
+
:parameter skel_states: The skeleton states to blend.
|
|
391
|
+
:type skel_states: torch.Tensor
|
|
392
|
+
:parameter weights: The weights to use, if not provided, weights are assumed to be all 1s
|
|
393
|
+
:return: The blended skeleton state.
|
|
394
|
+
"""
|
|
395
|
+
t, q, s = split(skel_states)
|
|
396
|
+
weights = quaternion.check_and_normalize_weights(q, weights)
|
|
397
|
+
t_blend = (weights.unsqueeze(-1).expand_as(t) * t).sum(-2)
|
|
398
|
+
q_blend = quaternion.blend(q, weights)
|
|
399
|
+
s_blend = (weights.unsqueeze(-1).expand_as(s) * s).sum(-2)
|
|
400
|
+
return torch.cat((t_blend, q_blend, s_blend), -1)
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
def slerp(s0: torch.Tensor, s1: torch.Tensor, t: torch.Tensor) -> torch.Tensor:
|
|
404
|
+
"""
|
|
405
|
+
Spherical linear interpolation between two skeleton states.
|
|
406
|
+
|
|
407
|
+
:parameter s0: The first skeleton state.
|
|
408
|
+
:parameter s1: The second skeleton state.
|
|
409
|
+
:parameter t: The interpolation factor, where 0 <= t <= 1. t=0 corresponds to s0, t=1 corresponds to s1.
|
|
410
|
+
:return: The interpolated skeleton state.
|
|
411
|
+
"""
|
|
412
|
+
check(s0)
|
|
413
|
+
check(s1)
|
|
414
|
+
|
|
415
|
+
if t.ndim < s0.ndim:
|
|
416
|
+
t = t.unsqueeze(0)
|
|
417
|
+
|
|
418
|
+
t0, q0, s0 = split(s0)
|
|
419
|
+
t1, q1, s1 = split(s1)
|
|
420
|
+
|
|
421
|
+
s = (1 - t) * s0 + t * s1
|
|
422
|
+
q = quaternion.slerp(q0, q1, t)
|
|
423
|
+
t = (1 - t) * t0 + t * t1
|
|
424
|
+
return torch.cat((t, q, s), -1)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def from_matrix(matrices: torch.Tensor) -> torch.Tensor:
|
|
428
|
+
"""
|
|
429
|
+
Convert 4x4 matrices to skeleton states. Assumes that the scale is uniform.
|
|
430
|
+
|
|
431
|
+
Args:
|
|
432
|
+
matrices (torch.Tensor): A tensor of 4x4 matrices.
|
|
433
|
+
|
|
434
|
+
Returns:
|
|
435
|
+
torch.Tensor: The corresponding skeleton states.
|
|
436
|
+
"""
|
|
437
|
+
if matrices.dim() < 2 or matrices.shape[-1] != 4 or matrices.shape[-2] != 4:
|
|
438
|
+
raise ValueError("Expected a tensor of 4x4 matrices")
|
|
439
|
+
initial_shape = matrices.shape
|
|
440
|
+
if matrices.dim() == 2:
|
|
441
|
+
matrices = matrices.unsqueeze(0)
|
|
442
|
+
else:
|
|
443
|
+
matrices = matrices.flatten(0, -3)
|
|
444
|
+
linear = matrices[..., :3, :3]
|
|
445
|
+
translations = matrices[..., :3, 3]
|
|
446
|
+
U, S, Vt = torch.linalg.svd(linear)
|
|
447
|
+
scales = S[..., :1]
|
|
448
|
+
rotation_matrices = torch.bmm(U, Vt)
|
|
449
|
+
quaternions = quaternion.from_rotation_matrix(rotation_matrices)
|
|
450
|
+
result = torch.cat((translations, quaternions, scales), -1)
|
|
451
|
+
result_shape = list(initial_shape[:-2]) + [8]
|
|
452
|
+
return result.reshape(result_shape)
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
@torch.jit.script
|
|
456
|
+
def multiply_backprop(
|
|
457
|
+
state1: torch.Tensor, state2: torch.Tensor, grad_state: torch.Tensor
|
|
458
|
+
) -> tuple[torch.Tensor, torch.Tensor]:
|
|
459
|
+
"""
|
|
460
|
+
Backpropagate gradients through skeleton state multiplication.
|
|
461
|
+
|
|
462
|
+
This function computes the gradients with respect to the two input skeleton states
|
|
463
|
+
given the gradient with respect to the output of skeleton state multiplication.
|
|
464
|
+
|
|
465
|
+
The forward formula is (matching the corrected skel_state.multiply):
|
|
466
|
+
- t = t1 + s1 * quaternion.rotate_vector(q1, t2)
|
|
467
|
+
- q = quaternion.multiply(q1, q2)
|
|
468
|
+
- s = s1 * s2
|
|
469
|
+
|
|
470
|
+
:parameter state1: The first skeleton state (parent).
|
|
471
|
+
:type state1: torch.Tensor
|
|
472
|
+
:parameter state2: The second skeleton state (child).
|
|
473
|
+
:type state2: torch.Tensor
|
|
474
|
+
:parameter grad_state: The gradient with respect to the output skeleton state.
|
|
475
|
+
:type grad_state: torch.Tensor
|
|
476
|
+
:return: A tuple of (grad_state1, grad_state2) representing gradients with respect
|
|
477
|
+
to the first and second skeleton states respectively.
|
|
478
|
+
:rtype: tuple[torch.Tensor, torch.Tensor]
|
|
479
|
+
"""
|
|
480
|
+
with torch.no_grad():
|
|
481
|
+
t1, q1, s1 = split(state1)
|
|
482
|
+
t2, q2, s2 = split(state2)
|
|
483
|
+
gt, gq, gs = split(grad_state)
|
|
484
|
+
|
|
485
|
+
# Gradient with respect to s2: gs * s1
|
|
486
|
+
gs2 = gs * s1
|
|
487
|
+
|
|
488
|
+
# Gradient with respect to quaternions from quaternion multiplication
|
|
489
|
+
# Use the "assume normalized" version to avoid norm computation
|
|
490
|
+
gq1_from_gq, gq2 = quaternion.multiply_backprop_assume_normalized(q1, q2, gq)
|
|
491
|
+
|
|
492
|
+
# Gradient with respect to quaternions from translation computation
|
|
493
|
+
# Following the corrected forward: t = t1 + s1 * quaternion.rotate_vector(q1, t2)
|
|
494
|
+
# We need gradients from: quaternion.rotate_vector(q1, t2) with gt scaled by s1
|
|
495
|
+
gq1_from_gt, gt2 = quaternion.rotate_vector_backprop_assume_normalized(
|
|
496
|
+
q1, t2, gt
|
|
497
|
+
)
|
|
498
|
+
gt2 = gt2 * s1.expand_as(t2)
|
|
499
|
+
|
|
500
|
+
# Combine quaternion gradients - add the missing s1 factor!
|
|
501
|
+
gq1 = gq1_from_gq + gq1_from_gt * s1.expand_as(gq1_from_gt)
|
|
502
|
+
|
|
503
|
+
# Gradient with respect to t1: direct passthrough
|
|
504
|
+
gt1 = gt
|
|
505
|
+
|
|
506
|
+
# Gradient with respect to s1: from both scale multiplication and rotation
|
|
507
|
+
# From scale multiplication: gs * s2
|
|
508
|
+
# From rotation: sum over the dot product of rotated vector with gradient
|
|
509
|
+
gs1_from_rotation = (quaternion.rotate_vector(q1, t2) * gt).sum(
|
|
510
|
+
dim=-1, keepdim=True
|
|
511
|
+
)
|
|
512
|
+
gs1 = gs1_from_rotation + gs * s2
|
|
513
|
+
|
|
514
|
+
return torch.cat([gt1, gq1, gs1], dim=-1), torch.cat([gt2, gq2, gs2], dim=-1)
|
|
Binary file
|
|
Binary file
|