Пример #1
0
bool InitRobotState(
    RobotState* out,
    const RobotModel* model,
    bool with_velocities,
    bool with_accelerations)
{
    RobotState robot_state;

    out->model = model;

    int mult = 1;
    if (with_velocities) {
        ++mult;
    }
    if (with_accelerations) {
        ++mult;
    }
    out->values.resize(mult * GetVariableCount(model));
    for (int i = 0; i < GetVariableCount(model); ++i) {
        out->values[i] = GetDefaultPosition(model, GetVariable(model, i));
    }

    double* data = out->values.data();
    out->positions = data;
    data += GetVariableCount(model);
    if (with_velocities) {
        out->velocities = data;
        data += GetVariableCount(model);
    }
    if (with_accelerations) {
        out->accelerations = data;
        data += GetVariableCount(model);
    }

    out->transforms.resize(
            GetLinkCount(model) +
            GetJointCount(model) +
            GetCollisionBodyCount(model) +
            GetVisualBodyCount(model));

    out->link_transforms = out->transforms.data();
    out->joint_transforms = out->link_transforms + GetLinkCount(model);
    out->link_collision_transforms = out->joint_transforms + GetJointCount(model);
    out->link_visual_transforms = out->link_collision_transforms + GetCollisionBodyCount(model);

    out->dirty_links_joint = model->root_joint;
    out->dirty_collisions_joint = model->root_joint;
    out->dirty_visuals_joint = model->root_joint;

    return true;
}
Пример #2
0
bool ezSkeleton::IsCompatibleWith(const ezSkeleton& other) const
{
  if (this == &other)
    return true;

  if (other.GetJointCount() != GetJointCount())
    return false;

  // TODO: This only checks the joint hierarchy, maybe it should check names or hierarchy based on names
  for (ezUInt32 i = 0; i < m_Joints.GetCount(); ++i)
  {
    if (other.m_Joints[i].GetParentIndex() != m_Joints[i].GetParentIndex())
    {
      return false;
    }
  }

  return true;
}