in tools/Adept/utils_vxl.h [134:211]
void read_hand_model(const string& path, HandModelVXL *pmodel)
{
const char DELIMITER = ':';
auto& model = *pmodel;
std::ifstream bones_in(path + "bones.txt");
string s;
while (bones_in.good())
{
getline(bones_in, s, DELIMITER);
if (s.empty())
continue;
model.bone_names.push_back(s);
getline(bones_in, s, DELIMITER);
model.parents.push_back(std::stoi(s));
double tmp[16];
for (int i = 0; i < 16; i++)
{
getline(bones_in, s, DELIMITER);
tmp[i] = std::stod(s);
}
model.base_relatives.emplace_back();
model.base_relatives.back().set(tmp);
for (int i = 0; i < 15; i++)
{
getline(bones_in, s, DELIMITER);
tmp[i] = std::stod(s);
}
getline(bones_in, s, '\n');
tmp[15] = std::stod(s);
model.inverse_base_absolutes.emplace_back();
model.inverse_base_absolutes.back().set(tmp);
}
bones_in.close();
int n_bones = (int)model.bone_names.size();
std::ifstream vert_in(path + "vertices.txt");
int n_vertices = 0;
while (vert_in.good())
{
getline(vert_in, s);
if (!s.empty())
n_vertices++;
}
vert_in.close();
model.base_positions.set_size(n_vertices, 4);
model.base_positions.set_column(3, 1.);
model.weights.set_size(n_bones, n_vertices);
model.weights.fill(0.);
vert_in = std::ifstream(path + "vertices.txt");
for (int i_vert = 0; i_vert < n_vertices; i_vert++)
{
for (int j = 0; j < 3; j++)
{
getline(vert_in, s, DELIMITER);
model.base_positions(i_vert, j) = std::stod(s);
}
for (int j = 0; j < 3 + 2; j++)
{
getline(vert_in, s, DELIMITER); // skip
}
getline(vert_in, s, DELIMITER);
int n = std::stoi(s);
for (int j = 0; j < n; j++)
{
getline(vert_in, s, DELIMITER);
int i_bone = std::stoi(s);
if (j == n - 1)
getline(vert_in, s, '\n');
else
getline(vert_in, s, DELIMITER);
model.weights(i_bone, i_vert) = std::stod(s);
}
}
vert_in.close();
model.is_mirrored = false;
}