示例#1
0
bool LeoModel::loadConstraintSetsFromFile (const char* filename, bool verbose) {
	// initialize Constraint Sets
	LuaTable lua_table = LuaTable::fromFile (filename);

	vector<LuaKey> constraint_set_keys = lua_table["constraint_sets"].keys();
	vector<string> constraint_set_names;
	for (size_t i = 0; i < constraint_set_keys.size(); i++) {
		if (constraint_set_keys[i].type == LuaKey::String) {
			constraint_set_names.push_back (constraint_set_keys[i].string_value);
		}
		else {
			cerr << "Found invalid constraint set name, string expected!" <<  endl;
			abort();
		}
	}

	for (size_t si = 0; si < constraint_set_names.size(); si++) {
		string set_name_str = constraint_set_names[si];

		if (verbose) {
			cout << "ConstraintSet '" << set_name_str << endl;
		}

		unsigned int constraint_count =
			lua_table["constraint_sets"][constraint_set_names[si].c_str()].length();

		ConstraintSet cs;
		ConstraintSetInfo csi;
		csi.name = set_name_str;
		csi.constraints.resize (constraint_count);

		for (int ci = 0; ci < constraint_count; ci++) {
			ConstraintInfo constraint_info =
			lua_table["constraint_sets"][set_name_str.c_str()][ci + 1];
			string point_name = constraint_info.point_name.c_str();
			constraint_info.point_id = ci;

			if (verbose) {
				cout << "  Adding Constraint point: " << points[point_name].name << endl;
				cout << "    body id = " << points[point_name].body_id << endl;
				cout << "    normal =  [" << constraint_info.normal.transpose() << "]" << endl;
			}
			cs.AddConstraint (
				points[point_name].body_id,
				points[point_name].point_local,
				constraint_info.normal
			);
			csi.constraints[ci] = constraint_info;
		}

		// save constraint set infos
		constraintSetInfos[set_name_str] = csi;

		// assign constraint set
		constraints[set_name_str] = cs;
		// TODO check which solver works better
		constraints[set_name_str].linear_solver = LinearSolverHouseholderQR;
		// constraintSets[set_name].linear_solver = LinearSolverPartialPivLU;
		constraints[set_name_str].Bind (model);
	}

	// check whether we missed some sets
	if (constraints.size() != constraint_set_names.size()) {
		cerr << "Error: not all constraint sets have been loaded!" << endl;
		abort();
	}

	return true;
}