光学式トラッカ,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点多く取れたり.
なんでかな.

win7 64bitにrubyをインストール

windows7 (64bit)にruby1.9をインストール.
ruby1.9をここからダウンロード.
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html

任意のフォルダに展開する.
C:\local\ruby など

これだけでは,gemが動かないので,
zlib.dllをダウンロードし,ruby/binに入れる.
(ファイル名がzlib.dllではないので適宜リネーム)
http://www.winimage.com/zLibDll/zlib125dll.zip

あと,
libeay32.dllとssleay32.dllが足りないので,追加.
http://code.google.com/p/openssl-for-windows/downloads/list
よりダウンロード.

以上,ruby1.9が動く.

参考
http://d.hatena.ne.jp/ky2009/20081031/1225449205

追記 2010/11/21
opensslでハマる.