bool AssociativeArray::getRotation(const string& key, Quatf& val) const { Value* v = getValue(key); if (v == NULL || v->getType() != Value::ArrayType) return false; Array* arr = v->getArray(); if (arr->size() != 4) return false; Value* w = (*arr)[0]; Value* x = (*arr)[1]; Value* y = (*arr)[2]; Value* z = (*arr)[3]; if (w->getType() != Value::NumberType || x->getType() != Value::NumberType || y->getType() != Value::NumberType || z->getType() != Value::NumberType) return false; Vec3f axis((float) x->getNumber(), (float) y->getNumber(), (float) z->getNumber()); axis.normalize(); float angle = degToRad((float) w->getNumber()); val.setAxisAngle(axis, angle); return true; }
void CommandRotate::process(ExecutionEnvironment& env, double, double dt) { float v = spin.length(); if (v != 0.0f) { Quatf q; q.setAxisAngle(spin / v, (float) (v * dt)); env.getSimulation()->rotate(q); } }