void testApp::updateModel() { updatePoseFromGui(); Pose pose = bindPose; for(Pose::iterator i = pose.begin(); i != pose.end(); i++) { string name = i->first; float x = gui.exists(name + ".x") ? gui.get(name + ".x").getValue() : 0; float y = gui.exists(name + ".y") ? gui.get(name + ".y").getValue() : 0; float z = gui.exists(name + ".z") ? gui.get(name + ".z").getValue() : 0; aiMatrix4x4& bone = i->second; aiMatrix4x4 cur; ofMatrix4x4 mat; ofQuaternion quat(x, ofVec3f(1, 0, 0), y, ofVec3f(0, 1, 0), z, ofVec3f(0, 0, 1)); quat.get(mat); cur = toAi(mat); bone *= cur; } model.setPose(pose); }
/** トラック間のモーションブレンドをした値を適用 * * @param pose モーションを適用するPose * @author SAM (T&GG, Org.)<*****@*****.**> * @date 2004/10/05 0:18:09 * Copyright (C) 2001,2002,2003,2004 SAM (T&GG, Org.). All rights reserved. */ void MotionMixer::apply(Pose &pose) const { for(Pose::StanceIndex::iterator i = pose.begin(); i != pose.end(); ++i) { float weight_sum = 0; bool ok = false; for(MotionTrackVector::const_iterator j = tracks_.begin(); j != tracks_.end(); ++j) { if(j->setWork(i->second, i->first.c_str())) { weight_sum += j->weight(); ok = true; } } if(ok) { bool first = true; for(MotionTrackVector::const_iterator j = tracks_.begin(); j != tracks_.end(); ++j) { if(j->work().type != CoordUnion::TYPE_NONE) { if(first) { i->second = j->work().stance()*(j->weight()/weight_sum); first = false; } else i->second += j->work().stance()*(j->weight()/weight_sum); } } } } }