diff --git a/reference/bvh-functions.md b/reference/bvh-functions.md new file mode 100644 index 000000000..af181e7b9 --- /dev/null +++ b/reference/bvh-functions.md @@ -0,0 +1,13 @@ +# BVH Functions + +The Biovision Hierarchy animation file format (.bvh) was developed to capture and distribute motion capture data, typically of humans performing actions such as walking, running, etc. +This file format was developed by the Biovision company (now defunct). +There are several freely available human motion capture data resources in BVH format, which can be used for making animations. +This BVH utility is provided to enable reading BVH files and animate human models defined as [Skin](#skin) node in Webots. + +The BVH files define a skeleton in the form of hierarchy of bones, and a time series of joint angles for each joint in the skeleton. Note that this skeleton is not necessarily the same as the skeleton associated with a Webots [Skin](#skin) node, since they come from different sources. +This library provides functions to adapt and re-target BVH motion data to Webots [Skin](#skin). + + +## Sections +- [BVH Utility Functions](bvh.md) diff --git a/reference/bvh.md b/reference/bvh.md new file mode 100644 index 000000000..6e4a783b0 --- /dev/null +++ b/reference/bvh.md @@ -0,0 +1,176 @@ +## BVH Utility Functions + +**Name** + +**wbu\_bvh\_read\_file**, **wbu\_bvh\_cleanup** - *obtaining and releasing a BVH file handle.* + +{[C++](cpp-api.md#cpp_bvh)}, {[Java](java-api.md#java_bvh)}, {[Python](python-api.md#python_bvh)}, {[Matlab](matlab-api.md#matlab_bvh)}, {[ROS](ros-api.md)} + +``` c +#include + +WbBvhDataRef wbu_bvh_read_file(const char *filename); +void wbu_bvh_cleanup(WbBvhDataRef motion); +``` + +**Description** + +The function `wbu_bvh_read_file` parses the hierarchical skeleton data and motion data in the specified BVH file. +The `filename` can be specified either with an absolute path or a path relative to the controller directory. +The function returns a `WbBvhDataRef` object, which is a reference to the data read from the BVH file. +This object is null if there is an error in reading the BVH file, for example when the file is corrupt or the path is incorrect. + +The `wbu_bvh_cleanup` function frees all the memory associated with the `WbBvhDataRef` object. +After this function is called the corresponding `WbBvhDataRef` object can no longer be used. + + > **note** [C++, Java, Python]: + In object-oriented languages there is no `wbu_bvh_cleanup()` function because it is automatically called by the destructor. + +--- + +**Name** + +**wbu\_bvh\_get\_joint\_count**, **wbu\_bvh\_get\_joint\_name**, **wbu\_bvh\_get\_frame\_count**, **wbu\_bvh\_set\_scale** - *query number of joints, joint names, and number of frames in the BVH file, and set scale for translation data.* + +{[C++](cpp-api.md#cpp_bvh)}, {[Java](java-api.md#java_bvh)}, {[Python](python-api.md#python_bvh)}, {[Matlab](matlab-api.md#matlab_bvh)} + +``` c +#include + +int wbu_bvh_get_joint_count(WbBvhDataRef ref); +const char* wbu_bvh_get_joint_name(WbBvhDataRef ref, int joint_index); +int wbu_bvh_get_frame_count(WbBvhDataRef ref); +void wbu_bvh_set_scale(WbBvhDataRef ref, double scale); +``` + +**Description** + +The function `wbu_bvh_get_joint_count` returns the number of joints defined in the loaded BVH file. + + +The function `wbu_bvh_get_joint_name` returns the name of the joint indexed by the number `joint_index` in the loaded BVH file. + +The function `wbu_bvh_get_frame_count` returns the number of frames of motion data in the loaded BVH file. Each frame corresponds to one entry of time-series data. + + +The function `wbu_bvh_set_scale()` sets the scale factor, which is used to scale the translation data form the BVH animation file. The scale factor is 1.0 by default. Note that this value does not affect the rotation data. + +--- + +**Name** + +**wbu\_bvh\_step**, **wbu\_bvh\_goto\_frame**, **wbu\_bvh\_reset** - +*read next frame, read a specific frame, or jump to first frame.* + +{[C++](cpp-api.md#cpp_bvh)}, {[Java](java-api.md#java_bvh)}, {[Python](python-api.md#python_bvh)}, {[Matlab](matlab-api.md#matlab_bvh)} + +``` c +#include + +bool wbu_bvh_step(WbBvhDataRef ref); +bool wbu_bvh_goto_frame(WbBvhDataRef ref, int frame_number); +bool wbu_bvh_reset(WbBvhDataRef ref); +``` + +**Description** + +The function `wbu_bvh_step` reads the joint angles and translation data in the next frame. +This function is typically called at the beginning of the main loop. +If the current frame is the last frame in the BVH file, calling this function reads the first frame again. +Returns true on success. + +The function `wbu_bvh_goto_frame` reads a specific frame, whose index is the argument `frame_number`. Returns true on success. +Note that if the argument `frame_number` is greater than the number of frames in the file, it leads to an error, and the function returns false. + + +The function `wbu_bvh_reset` jumps to the first frame. +Returns true on success. + +``` c +void main() { + WbBvhDataRef ref = wbu_bvh_read_file(filename); + do { + wbu_bvh_step(ref); + + // Read the joint angles and do something + } while (condition); +} + +``` + +--- + +**Name** + +**wbu\_bvh\_get\_joint\_rotation**, **wbu\_bvh\_get\_root\_translation** - +*get the joint rotation for a specific joint and the BVH object translation.* + +{[C++](cpp-api.md#cpp_bvh)}, {[Java](java-api.md#java_bvh)}, {[Python](python-api.md#python_bvh)}, {[Matlab](matlab-api.md#matlab_bvh)} + +``` c +#include + +double *wbu_bvh_get_joint_rotation(WbBvhDataRef ref, int joint_index); +double *wbu_bvh_get_root_translation(WbBvhDataRef ref); +``` + +**Description** + +The function `wbu_bvh_get_joint_rotation` returns the rotation of the joint specified by `joint_index`. +The rotation is returned as an array of double. +The function `wbu_bvh_get_root_translation` returns the translation of the BVH object. +The translation is returned as an array of double. +This is typically used to set the translation of the [Skin](#skin) node that is being animated by this BVH file. +The values can wither be used directly, or scaled using the `wbu_bvh_set_scale` function. + +``` c +void main() { + WbBvhDataRef ref = wbu_bvh_read_file(filename); + int i = 0; + do { + wbu_bvh_step(ref); + for(i=0; i < joint_count; ++i){ + double *rotation = wbu_bvh_get_joint_rotation(ref, i); + double axis_x = rotation[0]; + double axis_y = rotation[1]; + double axis_z = rotation[2]; + double angle = rotation[3]; + // Do something with the joint angles + } + double *position = wbu_bvh_get_root_translation(ref); + double x = position[0]; + double y = position[1]; + double z = position[2]; + // Do something with the translation + } while (condition); +} +``` + +--- + +**Name** + +**wbu\_bvh\_adapt\_skeleton** - +*adapt the skeleton specified in the BVH file to be able to re-target the BVH motion data for animating of a [Skin](#skin) node.* + +{[C++](cpp-api.md#cpp_bvh)}, {[Java](java-api.md#java_bvh)}, {[Python](python-api.md#python_bvh)}, {[Matlab](matlab-api.md#matlab_bvh)} + +``` c +#include + +void wbu_bvh_adapt_skeleton(WbBvhDataRef ref, int num_joints, const char** joint_name_list); +``` + +**Description** + +The `wbu_bvh_adapt_skeleton` adapts the skeleton defined in the BVH file to be able to re-target the BVH motion data to the [Skin](#skin) Node. +This is necessary because the skeleton of the [Skin](#skin) node will generally be different from the skeleton defined in the BVH file. +The difference can be in the joint hierarchy and in the number of joints. +Therefore, firstly, the extra joints in the BVH file must be removed. +Further, since the joint rotations are specified as relative to parent joints, they must be recomputed in case a joint is removed. +This computation is done by this function. + +The arguments to this function are the number of bones and the list of bones names in the [Skin](#skin) node. +They can be obtained by calling the functions `wb_skin_get_bone_count` and `wb_skin_get_bone_name`. +Note that if the nomenclature of the joints in the [Skin](#skin) node is different from that of the BVH file, the names have to be manually translated. +Please refer to the advanced sample project in "WEBOTS\_HOME/projects/humans/skin_animation/" directory for an example of how this is done. diff --git a/reference/cpp-api.md b/reference/cpp-api.md index 27716207a..c67e32ef4 100644 --- a/reference/cpp-api.md +++ b/reference/cpp-api.md @@ -468,7 +468,7 @@ The following tables describe the C++ classes and their methods. | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | #include `<`webots/Node.hpp`>` | | class Node { | -|    enum { NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM }; | +|    enum { NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SKIN, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM }; | |    virtual void [remove](supervisor.md#wb_supervisor_node_remove)(); | |    int [getId](supervisor.md#wb_supervisor_node_get_from_def)() const; | |    int [getType](supervisor.md#wb_supervisor_node_get_type)() const; | @@ -613,8 +613,9 @@ The following tables describe the C++ classes and their methods. |    [PositionSensor](#cpp_position_sensor) *[getPositionSensor](robot.md#wb_robot_get_device)(const std::string &name); | |    [RangeFinder](#cpp_range_finder) *[getRangeFinder](robot.md#wb_robot_get_device)(const std::string &name); | |    [Receiver](#cpp_receiver) *[getReceiver](robot.md#wb_robot_get_device)(const std::string &name); | -|    [Speaker](#cpp_speaker) *[getSpeaker](robot.md#wb_robot_get_device)(const std::string &name); | |    [Servo](#cpp_servo) *[getServo](robot.md#wb_robot_get_device)(const std::string &name); | +|    [Skin](#cpp_skin) *[getSkin](robot.md#wb_robot_get_device)(const std::string &name); | +|    [Speaker](#cpp_speaker) *[getSpeaker](robot.md#wb_robot_get_device)(const std::string &name); | |    [TouchSensor](#cpp_touch_sensor) *[getTouchSensor](robot.md#wb_robot_get_device)(const std::string &name); | |    int [getNumberOfDevices](robot.md#wb_robot_get_device_by_index)(); | |    [Device](#cpp_device) *[getDeviceByIndex](robot.md#wb_robot_get_device_by_index)(int index); | @@ -669,6 +670,23 @@ The following tables describe the C++ classes and their methods. %end + +%api "cpp_skin" + +| | +| ------------------------------------------------------------------------------------------------------------------------------- | +| #include `<`webots/Skin.hpp`>` | +| class [Skin](skin.md) : public [Device](#cpp_device) { | +|    int [getBoneCount](skin.md#wb_skin_get_bone_count)() const; | +|    const std::string &[getBoneName](skin.md#wb_skin_get_bone_name)(int index) const; | +|    const double *[getBoneOrientation](skin.md#wb_skin_set_bone_orientation)(int index, bool absolute); | +|    const double *[getBonePosition](skin.md#wb_skin_set_bone_position)(int index, bool absolute); | +|    void [setBoneOrientation](skin.md#wb_skin_set_bone_orientation)(int index, const double *rotation, bool absolute); | +|    void [setBonePosition](skin.md#wb_skin_set_bone_position)(int index, const double *position, bool absolute); | +| }; | + +%end + %api "cpp_speaker" | | diff --git a/reference/images/node_hierarchy.png b/reference/images/node_hierarchy.png index c68466cd9..cb6312d35 100644 Binary files a/reference/images/node_hierarchy.png and b/reference/images/node_hierarchy.png differ diff --git a/reference/java-api.md b/reference/java-api.md index 395de12a5..13ca6049a 100644 --- a/reference/java-api.md +++ b/reference/java-api.md @@ -485,7 +485,7 @@ The following tables describe the Java classes and their methods. | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | import com.cyberbotics.webots.controller.Node; | | public class Node { | -|    public final static int NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM; | +|    public final static int NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SKIN, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM; | |    public void [remove](supervisor.md#wb_supervisor_node_remove)(); | |    public int [getId](supervisor.md#wb_supervisor_node_get_from_def)(); | |    public int [getType](supervisor.md#wb_supervisor_node_get_type)(); | @@ -643,6 +643,7 @@ The following tables describe the Java classes and their methods. |    public [RangeFinder](#java_range_finder) [getRangeFinder](robot.md#wb_robot_get_device)(String name); | |    public [Receiver](#java_receiver) [getReceiver](robot.md#wb_robot_get_device)(String name); | |    public [Servo](#java_servo) [getServo](robot.md#wb_robot_get_device)(String name); | +|    public [Skin](#java_skin) [getSkin](robot.md#wb_robot_get_device)(String name); | |    public [Speaker](#java_speaker) [getSpeaker](robot.md#wb_robot_get_device)(String name); | |    public [TouchSensor](#java_touch_sensor) [getTouchSensor](robot.md#wb_robot_get_device)(String name); | |    public int [getNumberOfDevices](robot.md#wb_robot_get_device_by_index)(); | @@ -697,6 +698,23 @@ The following tables describe the Java classes and their methods. %end + +%api "java_skin" + +| | +| ------------------------------------------------------------------------------------------------------------------------------------ | +| #include `<`webots/Skin.hpp`>` | +| class [Skin](skin.md) : public [Device](#java_device) { | +|    public int [getBonetCount](skin.md#wb_skin_get_bone_count)(); | +|    public String [getBoneName](skin.md#wb_skin_get_bone_name)(int index); | +|    public double[] [getBoneOrientation](skin.md#wb_skin_get_bone_orientation)(int index, boolean absolute); | +|    public double[] [getBonePosition](skin.md#wb_skin_get_bone_position)(int index, boolean absolute); | +|    public void [setBoneOrientation](skin.md#wb_skin_set_bone_orientation)(int index, double[] rotation, boolean absolute); | +|    public void [setBonePosition](skin.md#wb_skin_set_bone_position)(int index, double[] position, boolean absolute); | +| } | + +%end + %api "java_speaker" | | @@ -707,7 +725,7 @@ The following tables describe the Java classes and their methods. |    public static void [playSound](speaker.md#wb_speaker_play_sound)(Speaker left, Speaker right, String sound, double volume, double pitch, double balance, bool loop); | |    public void [stop](speaker.md#wb_speaker_stop)(const std::string &sound); | |    public void [setLanguage](speaker.md#wb_speaker_set_language)(const std::string &language); | -|    public std::string [getLanguage](speaker.md#wb_speaker_set_language)(); | +|    public String [getLanguage](speaker.md#wb_speaker_set_language)(); | |    public void [speak](speaker.md#wb_speaker_set_language)(const std::string &text, double volume); | | }; | diff --git a/reference/matlab-api.md b/reference/matlab-api.md index 0b7e3c29f..c23ad5db1 100644 --- a/reference/matlab-api.md +++ b/reference/matlab-api.md @@ -351,7 +351,7 @@ The following tables describe the Matlab functions. | Node: | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| WB\_NODE\_NO\_NODE, WB\_NODE\_ACCELEROMETER, WB\_NODE\_APPEARANCE, WB\_NODE\_BACKGROUND, WB\_NODE\_BALL\_JOINT, WB\_NODE\_BALL\_JOINT\_PARAMETERS, WB\_NODE\_BOX, WB\_NODE\_BRAKE, WB\_NODE\_CAMERA, WB\_NODE\_CAPSULE, WB\_NODE\_CHARGER, WB\_NODE\_COLOR, WB\_NODE\_COMPASS, WB\_NODE\_CONE, WB\_NODE\_CONNECTOR, WB\_NODE\_CONTACT\_PROPERTIES, WB\_NODE\_COORDINATE, WB\_NODE\_CYLINDER, WB\_NODE\_DAMPING, WB\_NODE\_DIFFERENTIAL\_WHEELS, WB\_NODE\_DIRECTIONAL\_LIGHT, WB\_NODE\_DISPLAY, WB\_NODE\_DISTANCE\_SENSOR, WB\_NODE\_ELEVATION\_GRID, WB\_NODE\_EMITTER, WB\_NODE\_EXTRUSION, WB\_NODE\_FLUID, WB\_NODE\_FOCUS, WB\_NODE\_FOG, WB\_NODE\_GPS, WB\_NODE\_GROUP, WB\_NODE\_GYRO, WB\_NODE\_HINGE\_2\_JOINT, WB\_NODE\_HINGE\_2\_JOINT\_PARAMETERS, WB\_NODE\_HINGE\_JOINT, WB\_NODE\_HINGE\_JOINT\_PARAMETERS, WB\_NODE\_IMAGE\_TEXTURE, WB\_NODE\_IMMERSION\_PROPERTIES, WB\_NODE\_INDEXED\_FACE\_SET, WB\_NODE\_INDEXED\_LINE\_SET, WB\_NODE\_INERTIAL\_UNIT, WB\_NODE\_JOINT\_PARAMETERS, WB\_NODE\_LED, WB\_NODE\_LIDAR, WB\_NODE\_LIGHT\_SENSOR, WB\_NODE\_LINEAR\_MOTOR, WB\_NODE\_LENS\_DISTORTION, WB\_NODE\_MATERIAL, WB\_NODE\_MICROPHONE, WB\_NODE\_PEN, WB\_NODE\_PHYSICS, WB\_NODE\_PLANE, WB\_NODE\_POINT\_LIGHT, WB\_NODE\_POSITION\_SENSOR, WB\_NODE\_PROPELLER, WB\_NODE\_RADAR, WB\_NODE\_RADIO, WB\_NODE\_RANGE\_FINDER, WB\_NODE\_RECEIVER, WB\_NODE\_ROBOT, WB\_NODE\_ROTATIONAL\_MOTOR, WB\_NODE\_SERVO, WB\_NODE\_SHAPE, WB\_NODE\_SLIDER\_JOINT, WB\_NODE\_SLOT, WB\_NODE\_SOLID, WB\_NODE\_SOLID\_REFERENCE, WB\_NODE\_SPEAKER, WB\_NODE\_SPHERE, WB\_NODE\_SPOT\_LIGHT, WB\_NODE\_SUPERVISOR, WB\_NODE\_SWITCH, WB\_NODE\_TEXTURE\_COORDINATE, WB\_NODE\_TEXTURE\_TRANSFORM, WB\_NODE\_TOUCH\_SENSOR, WB\_NODE\_TRACK, WB\_NODE\_TRACK\_WHEEL, WB\_NODE\_TRANSFORM, WB\_NODE\_VIEWPOINT, WB\_NODE\_WORLD\_INFO, WB\_NODE\_ZOOM | +| WB\_NODE\_NO\_NODE, WB\_NODE\_ACCELEROMETER, WB\_NODE\_APPEARANCE, WB\_NODE\_BACKGROUND, WB\_NODE\_BALL\_JOINT, WB\_NODE\_BALL\_JOINT\_PARAMETERS, WB\_NODE\_BOX, WB\_NODE\_BRAKE, WB\_NODE\_CAMERA, WB\_NODE\_CAPSULE, WB\_NODE\_CHARGER, WB\_NODE\_COLOR, WB\_NODE\_COMPASS, WB\_NODE\_CONE, WB\_NODE\_CONNECTOR, WB\_NODE\_CONTACT\_PROPERTIES, WB\_NODE\_COORDINATE, WB\_NODE\_CYLINDER, WB\_NODE\_DAMPING, WB\_NODE\_DIFFERENTIAL\_WHEELS, WB\_NODE\_DIRECTIONAL\_LIGHT, WB\_NODE\_DISPLAY, WB\_NODE\_DISTANCE\_SENSOR, WB\_NODE\_ELEVATION\_GRID, WB\_NODE\_EMITTER, WB\_NODE\_EXTRUSION, WB\_NODE\_FLUID, WB\_NODE\_FOCUS, WB\_NODE\_FOG, WB\_NODE\_GPS, WB\_NODE\_GROUP, WB\_NODE\_GYRO, WB\_NODE\_HINGE\_2\_JOINT, WB\_NODE\_HINGE\_2\_JOINT\_PARAMETERS, WB\_NODE\_HINGE\_JOINT, WB\_NODE\_HINGE\_JOINT\_PARAMETERS, WB\_NODE\_IMAGE\_TEXTURE, WB\_NODE\_IMMERSION\_PROPERTIES, WB\_NODE\_INDEXED\_FACE\_SET, WB\_NODE\_INDEXED\_LINE\_SET, WB\_NODE\_INERTIAL\_UNIT, WB\_NODE\_JOINT\_PARAMETERS, WB\_NODE\_LED, WB\_NODE\_LIDAR, WB\_NODE\_LIGHT\_SENSOR, WB\_NODE\_LINEAR\_MOTOR, WB\_NODE\_LENS\_DISTORTION, WB\_NODE\_MATERIAL, WB\_NODE\_MICROPHONE, WB\_NODE\_PEN, WB\_NODE\_PHYSICS, WB\_NODE\_PLANE, WB\_NODE\_POINT\_LIGHT, WB\_NODE\_POSITION\_SENSOR, WB\_NODE\_PROPELLER, WB\_NODE\_RADAR, WB\_NODE\_RADIO, WB\_NODE\_RANGE\_FINDER, WB\_NODE\_RECEIVER, WB\_NODE\_ROBOT, WB\_NODE\_ROTATIONAL\_MOTOR, WB\_NODE\_SERVO, WB\_NODE\_SHAPE, WB\_NODE\_SKIN, WB\_NODE\_SLIDER\_JOINT, WB\_NODE\_SLOT, WB\_NODE\_SOLID, WB\_NODE\_SOLID\_REFERENCE, WB\_NODE\_SPEAKER, WB\_NODE\_SPHERE, WB\_NODE\_SPOT\_LIGHT, WB\_NODE\_SUPERVISOR, WB\_NODE\_SWITCH, WB\_NODE\_TEXTURE\_COORDINATE, WB\_NODE\_TEXTURE\_TRANSFORM, WB\_NODE\_TOUCH\_SENSOR, WB\_NODE\_TRACK, WB\_NODE\_TRACK\_WHEEL, WB\_NODE\_TRANSFORM, WB\_NODE\_VIEWPOINT, WB\_NODE\_WORLD\_INFO, WB\_NODE\_ZOOM | %end @@ -487,6 +487,19 @@ The following tables describe the Matlab functions. %end +%api "matlab_skin" + +| % [Skin](skin.md) : | +| ------------------------------------------------------------------------------------------------------------| +| count = [wb\_skin\_get\_bone\_count](skin.md#wb_skin_get_bone_count)(tag) | +| name = [wb\_skin\_get\_bone\_name](skin.md#wb_skin_get_bone_name)(tag, index) | +| orientation =[wb\_skin\_get\_bone\_orientation](skin.md#wb_skin_get_bone_orientation)(tag, index, absolute) | +| position = [wb\_skin\_get\_bone\_position](skin.md#wb_skin_get_bone_position)(tag, index, absolute) | +| [wb\_skin\_set\_bone\_orientation](skin.md#wb_skin_set_bone_orientation)(tag, index, values, absolute) | +| [wb\_skin\_set\_bone\_position](skin.md#wb_skin_set_bone_position)(tag, index, values, absolute) | + +%end + %api "matlab_speaker" | % [Speaker](speaker.md) : | diff --git a/reference/menu.md b/reference/menu.md index 003ec84ce..12e317d6c 100644 --- a/reference/menu.md +++ b/reference/menu.md @@ -75,6 +75,7 @@ - [Servo](servo.md) - [ShaderPart](shaderpart.md) - [Shape](shape.md) + - [Skin](skin.md) - [SliderJoint](sliderjoint.md) - [Slot](slot.md) - [Solid](solid.md) diff --git a/reference/nodes-and-api-functions.md b/reference/nodes-and-api-functions.md index 520aeb1f0..3d20bdefb 100644 --- a/reference/nodes-and-api-functions.md +++ b/reference/nodes-and-api-functions.md @@ -69,6 +69,7 @@ - [Servo](servo.md) - [ShaderPart](shaderpart.md) - [Shape](shape.md) +- [Skin](skin.md) - [SliderJoint](sliderjoint.md) - [Slot](slot.md) - [Solid](solid.md) diff --git a/reference/python-api.md b/reference/python-api.md index 81b1031c4..62ca7e172 100644 --- a/reference/python-api.md +++ b/reference/python-api.md @@ -463,7 +463,7 @@ The following tables describe the Python classes and their methods. | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | from controller import Node | | class Node : | -|    NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM | +|    NO\_NODE, ACCELEROMETER, APPEARANCE, BACKGROUND, BALL\_JOINT, BALL\_JOINT\_PARAMETERS, BOX, BRAKE, CAMERA, CAPSULE, CHARGER, COLOR, COMPASS, CONE, CONNECTOR, CONTACT\_PROPERTIES, COORDINATE, CYLINDER, DAMPING, DIFFERENTIAL\_WHEELS, DIRECTIONAL\_LIGHT, DISPLAY, DISTANCE\_SENSOR, ELEVATION\_GRID, EMITTER, EXTRUSION, FOCUS, FLUID, FOG, GPS, GROUP, GYRO, HINGE\_2\_JOINT, HINGE\_2\_JOINT\_PARAMETERS, HINGE\_JOINT, HINGE\_JOINT\_PARAMETERS, IMAGE\_TEXTURE, IMMERSION\_PROPERTIES, INDEXED\_FACE\_SET, INDEXED\_LINE\_SET, INERTIAL\_UNIT, JOINT\_PARAMETERS, LED, LENS\_DISTORTION, LIDAR, LIGHT\_SENSOR, LINEAR\_MOTOR, MATERIAL, MICROPHONE, PEN, PHYSICS, PLANE, POINT\_LIGHT, POSITION\_SENSOR, PROPELLER, RADAR, RADIO, RANGE\_FINDER, RECEIVER, ROBOT, ROTATIONAL\_MOTOR, SERVO, SHAPE, SKIN, SLIDER\_JOINT, SLOT, SOLID, SOLID\_REFERENCE, SPEAKER, SPHERE, SPOT\_LIGHT, SUPERVISOR, SWITCH, TEXTURE\_COORDINATE, TEXTURE\_TRANSFORM, TOUCH\_SENSOR, TRACK, TRACK\_WHEEL, TRANSFORM, VIEWPOINT, WORLD\_INFO, ZOOM | |    def [remove](supervisor.md#wb_supervisor_node_remove)(self) | |    def [getType](supervisor.md#wb_supervisor_node_get_type)(self) | |    def [getId](supervisor.md#wb_supervisor_node_get_from_def)(self) | @@ -616,6 +616,7 @@ The following tables describe the Python classes and their methods. |    def [getRangeFinder](robot.md#wb_robot_get_device)(self, name) | |    def [getReceiver](robot.md#wb_robot_get_device)(self, name) | |    def [getServo](robot.md#wb_robot_get_device)(self, name) | +|    def [getSkin](robot.md#wb_robot_get_device)(self, name) | |    def [getSpeaker](robot.md#wb_robot_get_device)(self, name) | |    def [getTouchSensor](robot.md#wb_robot_get_device)(self, name) | |    def [getNumberOfDevices](robot.md#wb_robot_get_device_by_index)(self) | @@ -668,6 +669,22 @@ The following tables describe the Python classes and their methods. %end + +%api "python_skin" + +| | +| ----------------------------------------------------------------------------------------------------------- | +| #include `<`webots/Skin.hpp`>` | +| class [Skin](skin.md) : public [Device](#python_device) { | +|    def [getBoneCount](skin.md#wb_skin_get_bone_count)(self) | +|    def [getBoneName](skin.md#wb_skin_get_bone_name)(self, index) | +|    def [getBoneOrientation](skin.md#wb_skin_get_bone_orientation)(self, index, absolute) | +|    def [getBonePosition](skin.md#wb_skin_get_bone_position)(self, index, absolute) | +|    def [setBoneOrientation](skin.md#wb_skin_set_bone_orientation)(self, index, rotation, absolute) | +|    def [setBonePosition](skin.md#wb_skin_set_bone_position)(self, index, position, absolute) | + +%end + %api "python_speaker" | | diff --git a/reference/ros-api.md b/reference/ros-api.md index f42c19a81..e2cd9e963 100644 --- a/reference/ros-api.md +++ b/reference/ros-api.md @@ -313,6 +313,17 @@ for more information about the value of `robot_unique_name`). | [/robot/set\_mode](robot.md#wb_robot_get_mode) | service | webots\_ros::robot\_set\_mode | char[] arg
int32 mode
---
int8 success | | /robot/get\_device\_list | service | webots\_ros::robot\_get\_device\_list | uint8 ask
---
string[] list | +### Skin + +| name | service/topic | data type | data type definition | +| ---------------------------------------------------------------------------------- | ------------- | ----------------------------- | - ----------------------------------------- | +| [/`<`device\_name`>`/get\_bone\_count](skin.md#wb_skin_get_bone_count) | service | webots\_ros::skin\_get\_bone\_count | uint8 ask
---
int32 count
| +| [/`<`device\_name`>`/get\_bone\_name](skin.md#wb_skin_get_bone_name) | service | webots\_ros::skin\_get\_bone\_name | int32 index
---
string name
| +| [/`<`device\_name`>`/get\_bone\_orientation](skin.md#wb_skin_get_bone_orientation) | service | webots\_ros::skin\_get\_bone\_orientation | int32 index
bool absolute
---
geometry_msgs/Quaternion orientation
| +| [/`<`device\_name`>`/get\_bone\_position](skin.md#wb_skin_get_bone_position) | service | webots\_ros::skin\_get\_bone\_position | int32 index
bool absolute
---
geometry_msgs/Vector3 position
| +| [/`<`device\_name`>`/set\_bone\_orientation](skin.md#wb_skin_set_bone_orientation) | service | webots\_ros::skin\_set\_bone\_orientation | int32 index
geometry_msgs/Quaternion orientation
bool absolute
---
int32 success
| +| [/`<`device\_name`>`/set\_bone\_position](skin.md#wb_skin_set_bone_position) | service | webots\_ros::skin\_set\_bone\_position | int32 index
geometry_msgs/Vector3 position
bool absolute
---
int32 success
| + ### Speaker | name | service/topic | data type | data type definition | diff --git a/reference/skin.md b/reference/skin.md new file mode 100644 index 000000000..fd4d29924 --- /dev/null +++ b/reference/skin.md @@ -0,0 +1,134 @@ +## Skin + +Derived from [Device](device.md). + +``` +Skin { + SFVec3f translation 0 0 0 + SFRotation rotation 0 1 0 0 + SFVec3f scale 1 1 1 + SFString name "skin" + SFString model "" + MFNode appearance [] + MFNode bones [] + SFBool castShadows TRUE +} +``` + +### Description + +The [Skin](#skin) node can be used to simulate soft mesh animation for example of a human or an animal. +The skin mesh is imported from a mesh file specified by the `model` name (either Ogre or FBX format), +but in order to be animated it has to be attached to a skeleton so that the rotation of the skeleton joints results in appropriate deformation of the skin mesh. + +This node provides two alternative ways to define a skeleton. +The first method consists in providing the skeleton in the mesh file (in the case of Ogre, it stands in a separate skeleton file that must have the same name as the Ogre mesh file). +The second method consists in listing the [Solid](#solid.md) nodes corresponding to the mesh bones using the `bones` field. +If in the first case the resulting object animation will be purely graphical, when linking the [Skin](#skin) to an existing Webots skeleton made of [Solid](#solid.md) and [Joint](#joint.md) nodes it is possible to animate an dynamic object. + +The XML files containing the skin mesh and skeleton can be generated using a 3D modeling software and then exporting them to Ogre format. +For example, the [Blender2OGRE](https://bitbucket.org/iboshkov/blender2ogre) plugin can be used to export the mesh and skeleton from [Blender](https://www.blender.org/) 3D modeling tool. +Then the exported ".mesh.xml" and ".skeleton.xml" XML file have to be converted to the corresponding ".mesh" and ".skeleton" binary files using the converter "$(WEBOTS\_HOME)/bin/ogre/OgreXMLConverter" in order to use it in Webots. + +Other tools can be used for generating the characters to animate, for example human characters in the provided samples are generated using [MakeHuman](http://www.makehuman.org/). + +#### Physically driven skin animation + +If you want that the skin is animated based on the movements of a dynamic object then you have to specify skeleton by listing the [Solid](#solid.md) nodes corresponding to the skeleton bones in the `bones` field. +Each listed [Solid](#solid.md) bone have to be a child node of a [Joint](#joint.md). +Moreover the mesh bone structure and the [Solid](#solid.md)/[Joint](#joint.md) have to match. +In particular, this means that the number of mesh bones have to match with the number of joints and +that the [Solid](#solid.md) node names must be the same as the bone names specified in the mesh file. + +#### Pure graphical skin animation + +For a purely graphical skin animation the `bones` field doesn't have to be specified. +In this case the skeleton needed to animate the skin is loaded either from the file named ".skeleton", where corresponds to the `model` field value, and located in the same folder as the mesh file, or from the mesh FBX file, depending on what is provided. + +### Field Summary + +- The `translation` field defines the translation from the parent coordinate system to the children's coordinate system. + +- The `rotation` field defines an arbitrary rotation of the children's coordinate system with respect to the parent coordinate system. +Please refer to [Transform](#transform.md) `rotation` field description for more information. + +- The `scale` field specifies a possibly non-uniform scale of the mesh. Only positive values are permitted; non-positive values scale are automatically reset to 1. + +- `name`: name of the skin device and used by wb_robot_get_device(). + +- `model`: name of the model to be imported. +For example, when using Ogre format, if the model name is "test_model", it import the binary mesh files "test_model.mesh" and "test_model.skeleton" placed in the "skins/test_model/" subdirectory, inside the current project directory. +The materials used by the imported mesh have to be defined in the `appearance` field. + +- `appearance`: list of [Appearance](#appearance.md) nodes defining the materials used by the mesh defined in the `model` field. +In order to be correctly used, the `name` field of the child [Appearance](#appearance.md) node has to match the material name used in the mesh definition. +If multiple [Appearance](#appearance.md) nodes have the same `name` field value, the first one is used. + +- The `bones` fields contains a list of [SolidReference](#solidreference.md) nodes that provide the information to attach a Webots skeleton made of [Solid](#solid.md) and [Joint](#joint.md) nodes. +In order to setup correctly the skeleton, the solids have to have the same names as specified in the skeleton. + +- The `castShadows` field allows the user to turn on (TRUE) or off (FALSE) shadows casted by this shape. Note that if the mesh triangle count is very big, the casted shadows will be automatically disabled. + +### Skin Functions + +**Name** + +**wb\_skin\_get\_bone\_count**, **wb\_skin\_get\_bone\_name** - *get the number and the names of bones in the skeleton of loaded skin model.* + +{[C++](cpp-api.md#cpp_skin)}, {[Java](java-api.md#java_skin)}, {[Python](python-api.md#python_skin)}, {[Matlab](matlab-api.md#matlab_skin)}, {[ROS](ros-api.md)} + +``` c +#include + +int wb_skin_get_bone_count(WbDeviceTag tag); +const char *wb_skin_get_bone_name(WbDeviceTag tag, int index); +``` + +**Description** + +The function `wb_skin_get_bone_count` returns the total number of bones in the skeleton loaded by the [Skin](#skin) node. +The function `wb_skin_get_bone_name` returns the name of the bone at the specified index. +The bones are indexed starting from 0. + +This two functions are available both if using a Webots skeleton or if the the skeleton is loaded from an Ogre XML file. +But if a Webots skeleton is used, then the bone count will correspond to the valid nodes specified in the `bones` field and the bone names will correspond to the referenced [Solid](#solid.md) names. + +--- + +**Name** + +**wb\_skin\_get\_bone\_orientation**, **wb\_skin\_get\_bone\_position, + wb\_skin\_set\_bone\_orientation**, **wb\_skin\_set\_bone\_position** - *get or set the bone orientation and position.* + +{[C++](cpp-api.md#cpp_skin)}, {[Java](java-api.md#java_skin)}, {[Python](python-api.md#python_skin)}, {[Matlab](matlab-api.md#matlab_skin)}, {[ROS](ros-api.md)} + +``` c +#include + +void wb_skin_get_bone_orientation(WbDeviceTag tag, int index, bool absolute); +void wb_skin_get_bone_position(WbDeviceTag tag, int index, bool absolute); +void wb_skin_set_bone_orientation(WbDeviceTag tag, int index, const double rotation[4], bool absolute); +void wb_skin_set_bone_position(WbDeviceTag tag, int index, const double position[3], bool absolute); +``` + +**Description** + +These functions set or return the skin's internal skeleton bone position and orientation. +Each bone is identified using an index value between 0 and the bones count returned by `wb_skin_get_bone_count`. +If the `absolute` argument is FALSE the orientation and position values are relative to the parent bone coordinate system. +Otherwise, if `absolute` is TRUE the orientation and position values are relative to the [Skin](#skin.md) node's coordinate system. + +`wb_skin_set_bone_orientation` function sets the rotation of the skeleton bone to the specified axis-angle rotation value. +The rotation is specified as a double array, similar to `wb_supervisor_field_set_sf_rotation` [Supervisor](#supervisor.md) node. + +`wb_skin_get_bone_orientation` function returns the axis-angle rotation of the skeleton bone +using the same format as in `wb_skin_set_bone_orientation`. + +`wb_skin_set_bone_position` function sets the position of the skeleton bone. + +`wb_skin_get_bone_position` function returns the position of the skeleton bone + +> **note**: +The setter functions `wb_skin_set_bone_orientation` and `wb_skin_set_bone_position` are only available +if the `bones` field is not specified, i.e. if the object is purely graphical and the skin is not already +animated using the [Joint](#joint.md) nodes rotation. diff --git a/src/dia/node_hierarchy.dia b/src/dia/node_hierarchy.dia index baa75f32f..4e65efa1e 100644 --- a/src/dia/node_hierarchy.dia +++ b/src/dia/node_hierarchy.dia @@ -831,13 +831,13 @@ - + - + - + @@ -863,7 +863,7 @@ - + @@ -876,13 +876,13 @@ - + - + - + @@ -908,7 +908,7 @@ - + @@ -921,13 +921,13 @@ - + - + - + @@ -953,7 +953,7 @@ - + @@ -966,13 +966,13 @@ - + - + - + @@ -998,7 +998,7 @@ - + @@ -1011,13 +1011,13 @@ - + - + - + @@ -1043,7 +1043,7 @@ - + @@ -1056,13 +1056,13 @@ - + - + - + @@ -1088,7 +1088,7 @@ - + @@ -1101,13 +1101,13 @@ - + - + - + @@ -1133,7 +1133,7 @@ - + @@ -1146,13 +1146,13 @@ - + - + - + @@ -1178,7 +1178,7 @@ - + @@ -1191,13 +1191,13 @@ - + - + - + @@ -1223,7 +1223,7 @@ - + @@ -1236,13 +1236,13 @@ - + - + - + @@ -1268,7 +1268,7 @@ - + @@ -1281,13 +1281,13 @@ - + - + - + @@ -1313,7 +1313,7 @@ - + @@ -1326,13 +1326,13 @@ - + - + - + @@ -1358,7 +1358,7 @@ - + @@ -1371,13 +1371,13 @@ - + - + - + @@ -1403,7 +1403,7 @@ - + @@ -1416,13 +1416,13 @@ - + - + - + @@ -1448,7 +1448,7 @@ - + @@ -1808,7 +1808,7 @@ - + @@ -2015,7 +2015,7 @@ - + @@ -2049,7 +2049,7 @@ functions from# - + @@ -2084,7 +2084,7 @@ Shape node# - + @@ -2119,7 +2119,7 @@ in a Solid node # - + @@ -2150,13 +2150,13 @@ instantiated# - + - + - + @@ -2182,7 +2182,7 @@ instantiated# - + @@ -2195,13 +2195,13 @@ instantiated# - + - + - + @@ -2227,7 +2227,7 @@ instantiated# - + @@ -2808,13 +2808,13 @@ instantiated# - + - + - + @@ -2840,7 +2840,7 @@ instantiated# - + @@ -3095,13 +3095,13 @@ instantiated# - + - + - + @@ -3127,7 +3127,7 @@ instantiated# - + @@ -3166,16 +3166,16 @@ instantiated# - + - + - - - - + + + + @@ -3192,16 +3192,16 @@ instantiated# - + - + - - - - + + + + @@ -3216,19 +3216,19 @@ instantiated# - + - + - + - - + + @@ -3242,14 +3242,14 @@ instantiated# - + - + - - + + @@ -3272,11 +3272,11 @@ instantiated# - + - + @@ -3299,29 +3299,32 @@ instantiated# - + - + - - + + + + + - + - + - - + + @@ -3335,14 +3338,14 @@ instantiated# - + - + - - + + @@ -3353,14 +3356,14 @@ instantiated# - + - + - - + + @@ -3374,14 +3377,14 @@ instantiated# - + - + - - + + @@ -3392,14 +3395,14 @@ instantiated# - + - + - - + + @@ -3413,14 +3416,14 @@ instantiated# - + - + - - + + @@ -3431,14 +3434,14 @@ instantiated# - + - + - - + + @@ -3452,14 +3455,14 @@ instantiated# - + - + - - + + @@ -3470,14 +3473,14 @@ instantiated# - + - + - - + + @@ -3491,14 +3494,14 @@ instantiated# - + - + - - + + @@ -3509,14 +3512,14 @@ instantiated# - + - + - - + + @@ -3530,14 +3533,14 @@ instantiated# - + - + - - + + @@ -3548,14 +3551,14 @@ instantiated# - + - + - - + + @@ -3569,14 +3572,14 @@ instantiated# - + - + - - + + @@ -3587,14 +3590,14 @@ instantiated# - + - + - - + + @@ -3608,14 +3611,14 @@ instantiated# - + - + - - + + @@ -3626,14 +3629,14 @@ instantiated# - + - + - - + + @@ -3647,14 +3650,14 @@ instantiated# - + - + - - + + @@ -3665,14 +3668,14 @@ instantiated# - + - + - - + + @@ -3686,14 +3689,14 @@ instantiated# - + - + - - + + @@ -3704,14 +3707,14 @@ instantiated# - + - + - - + + @@ -3725,14 +3728,14 @@ instantiated# - + - + - - + + @@ -3743,14 +3746,14 @@ instantiated# - + - + - - + + @@ -3761,13 +3764,13 @@ instantiated# - + - + - + @@ -3793,7 +3796,7 @@ instantiated# - + @@ -3806,13 +3809,13 @@ instantiated# - + - + - + @@ -3844,7 +3847,7 @@ instantiated# - + @@ -3857,13 +3860,13 @@ instantiated# - + - + - + @@ -3889,7 +3892,7 @@ instantiated# - + @@ -3902,13 +3905,13 @@ instantiated# - + - + - + @@ -3934,7 +3937,7 @@ instantiated# - + @@ -3947,14 +3950,14 @@ instantiated# - + - + - - + + @@ -3965,14 +3968,14 @@ instantiated# - + - + - - + + @@ -3986,16 +3989,16 @@ instantiated# - + - + - - - - + + + + @@ -4021,16 +4024,16 @@ instantiated# - + - + - - - - + + + + @@ -4056,16 +4059,16 @@ instantiated# - + - + - - - - + + + + @@ -4091,16 +4094,16 @@ instantiated# - + - + - - - - + + + + @@ -4756,13 +4759,13 @@ instantiated# - + - + - + @@ -4791,7 +4794,7 @@ instantiated# - + @@ -4804,10 +4807,10 @@ instantiated# - + - + @@ -4821,7 +4824,7 @@ instantiated# - + @@ -4840,16 +4843,16 @@ instantiated# - + - + - - - - + + + + @@ -4862,20 +4865,29 @@ instantiated# + + + + + + + + + - + - + - + - + @@ -4901,7 +4913,7 @@ instantiated# - + @@ -4914,10 +4926,10 @@ instantiated# - + - + @@ -4931,7 +4943,7 @@ instantiated# - + @@ -4950,44 +4962,14 @@ instantiated# - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -4999,7 +4981,7 @@ instantiated# - + @@ -5044,7 +5026,7 @@ instantiated# - + @@ -5076,10 +5058,10 @@ instantiated# - + - + @@ -5113,7 +5095,7 @@ instantiated# - + @@ -5158,12 +5140,12 @@ instantiated# - + - + @@ -5191,18 +5173,18 @@ instantiated# - + - + - + - + - + @@ -5228,7 +5210,7 @@ instantiated# - + @@ -5239,16 +5221,16 @@ instantiated# - + - + - + - - + + @@ -5257,33 +5239,33 @@ instantiated# - + - + - + - + - - + + - + - + - + - + @@ -5297,7 +5279,7 @@ instantiated# - + @@ -5311,19 +5293,19 @@ instantiated# - + - + - + - + - - + + @@ -5332,16 +5314,16 @@ instantiated# - + - + - + - - + + @@ -5353,15 +5335,15 @@ instantiated# - + - + - + - + @@ -5387,7 +5369,7 @@ instantiated# - + @@ -5398,12 +5380,12 @@ instantiated# - + - + - + @@ -5417,7 +5399,7 @@ instantiated# - + @@ -5431,15 +5413,15 @@ instantiated# - + - + - + - + @@ -5453,7 +5435,7 @@ instantiated# - + @@ -5467,19 +5449,19 @@ instantiated# - + - + - + - + - - + + @@ -5488,28 +5470,28 @@ instantiated# - + - + - + - + - - + + - + - + @@ -5554,7 +5536,7 @@ instantiated# - + @@ -5575,10 +5557,10 @@ instantiated# - + - + @@ -5623,7 +5605,7 @@ instantiated# - + @@ -5668,15 +5650,15 @@ instantiated# - + - + - + - + @@ -5705,7 +5687,7 @@ instantiated# - + @@ -5716,34 +5698,34 @@ instantiated# - + - + - + - - + + - + - + - + - + - - + + @@ -5752,18 +5734,18 @@ instantiated# - + - + - + - + - + @@ -5789,7 +5771,7 @@ instantiated# - + @@ -5800,34 +5782,34 @@ instantiated# - + - + - + - - + + - + - + - + - + - - + + @@ -5836,18 +5818,18 @@ instantiated# - + - + - + - + - + @@ -5873,7 +5855,7 @@ instantiated# - + @@ -5884,34 +5866,34 @@ instantiated# - + - + - + - - + + - + - + - + - + - - + + @@ -5920,21 +5902,21 @@ instantiated# - + - + - + - + - + - + @@ -5957,7 +5939,7 @@ instantiated# - + @@ -5968,16 +5950,16 @@ instantiated# - + - + - + - - + + @@ -5986,28 +5968,28 @@ instantiated# - + - + - + - + - - + + - + - + @@ -6052,7 +6034,7 @@ instantiated# - + @@ -6097,7 +6079,7 @@ instantiated# - + @@ -6142,7 +6124,7 @@ instantiated# - + @@ -6176,7 +6158,7 @@ instantiated# - + @@ -6187,7 +6169,7 @@ instantiated# - + @@ -6232,5 +6214,110 @@ instantiated# + + + + + + + + + + + + + + + + + + + + + + + + + + #Skin# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +