void OnlineViewerServerImpl::updateLog (BodyItemInfo* info, const LinkPositionSequence& links, int numLinks, double time) { BodyMotionItem* motionItem = info->logItem; if(!motionItem){ motionItem = info->bodyItem->findChildItem<BodyMotionItem>(info->logName); if(!motionItem){ motionItem = new BodyMotionItem(); motionItem->setName(info->logName); info->bodyItem->addChildItem(motionItem); } resetLogItem(info, motionItem); } if(info->needToSelectLogItem){ ItemTreeView::instance()->selectItem(motionItem, true); info->needToSelectLogItem = false; } MultiSE3Seq& seq = *motionItem->motion()->linkPosSeq(); int frame = seq.frameOfTime(time); int lastFrame = std::max(0, std::min(frame, seq.numFrames())); seq.setNumFrames(frame + 1); Body* body = info->bodyItem->body(); for(int i=lastFrame; i <= frame; ++i){ MultiSE3Seq::Frame positions = seq.frame(i); for(int j=0; j < numLinks; ++j){ SE3& se3 = positions[j]; se3.translation() = Eigen::Map<Vector3>(const_cast<double*>(links[j].p)); Matrix3 Rs = body->link(j)->Rs().transpose(); se3.rotation() = Eigen::Map<Matrix3>(const_cast<double*>(links[j].R)).transpose() * Rs; } } }
void BodyMotionGenerationBar::onGenerationButtonClicked() { set<BodyMotionItem*> motionItems; // for avoiding overlap ItemList<Item> selectedItems = ItemTreeView::mainInstance()->selectedItems<Item>(); for(size_t i=0; i < selectedItems.size(); ++i){ PoseSeqItem* poseSeqItem = dynamic_cast<PoseSeqItem*>(selectedItems[i]); if(poseSeqItem){ motionItems.insert(poseSeqItem->bodyMotionItem()); } else { BodyMotionItem* motionItem = dynamic_cast<BodyMotionItem*>(selectedItems[i]); if(motionItem){ motionItems.insert(motionItem); } } } for(set<BodyMotionItem*>::iterator p = motionItems.begin(); p != motionItems.end(); ++p){ BodyMotionItem* motionItem = *p; BodyItem* bodyItem = motionItem->findOwnerItem<BodyItem>(true); if(bodyItem){ PoseProvider* provider = 0; PoseSeqItem* poseSeqItem = dynamic_cast<PoseSeqItem*>(motionItem->parentItem()); if(poseSeqItem){ provider = poseSeqItem->interpolator().get(); } else { bodyMotionPoseProvider->initialize(bodyItem->body(), motionItem->motion()); provider = bodyMotionPoseProvider; if(setup->newBodyItemCheck.isChecked()){ BodyMotionItem* newMotionItem = new BodyMotionItem(); newMotionItem->setName(motionItem->name() + "'"); motionItem->parentItem()->insertChildItem(newMotionItem, motionItem->nextItem()); motionItem = newMotionItem; } } shapeBodyMotion(bodyItem->body(), provider, motionItem, true); } } }