光学式トラッカ,Optitrackの利用.
作業メモ
optitrack APIを利用して,
マーカー1つ1つの3D座標値を得る.
この時Rigidに使われているマーカーは無視する.
取れる値
(a)リジッドに含まれているマーカの3D位置.
(b)マーカーすべてのX, Y, Z座標をそれぞれ単体で.
リジッドに含まれない点を求めたい.
つまり,(a)-(b)を求めたい.
一応書いてみた.
void Tracker::getPositionSingleMarker(std::vector <Vectors>&position) { NPRESULT result = TT_Update(); CheckResult(result); static float x=0, y=0, z=0; Vectors tmpData; //リジッドに含まれているマーカーの位置を取得(a) std::vector <Vectors> rigidVectorData;//1maker of rigid data array for(int rigidID=0; rigidID< TT_TrackableCount(); rigidID++) { if(TT_IsTrackableTracked(rigidID)) { for(int markerID=0; markerID<TT_TrackableMarkerCount(rigidID); markerID++) { TT_TrackableMarker(rigidID,markerID,&x,&y,&z); tmpData.x = 1000*x; tmpData.y = 1000*y; tmpData.z = 1000*z; //tmpData.rigidID = rigidID; //tmpData.markerID = markerID; rigidVectorData.push_back(tmpData); std::cout<<"TMP_rigid X:" <<tmpData.x<<" TMP_rigid Y:"<<tmpData.y<<" TMP_rigid Z:"<<tmpData.z<<std::endl; } } } //リジッド関係なしにマーカ単体のデータを取得(b) std::vector <Vectors> singleMarkerData; for(int markerID=0; markerID<TT_FrameMarkerCount(); markerID++) { tmpData.x = TT_FrameMarkerX(markerID) * 1000; tmpData.y = TT_FrameMarkerY(markerID) * 1000; tmpData.z = TT_FrameMarkerZ(markerID) * 1000; std::cout << "TMP_all X:" << tmpData.x << " TMP_all Y:" << tmpData.y << "TMP_all Z:" << tmpData.z << std::endl; // singleMarkerData.push_back(tmpData); //(b)-(a)をvectors positionにpush_backする std::vector<Vectors>::iterator it; for(it=rigidVectorData.begin(); it!=rigidVectorData.end(); ++it) { Vectors tmp = *it; if(tmp.x == tmpData.x && tmp.y ==tmpData.y && tmp.z == tmpData.z) { std::cout<<"matched"<<std::endl; break; } else { std::cout<<"push data" <<std::endl; position.push_back(tmpData); } } } }
点の取得がずれたり,1点多く取れたり.
なんでかな.