Page 1 of 1

Re: TT_TrackableMarker Question

Posted: Thu Jul 19, 2012 12:16 pm
by NaturalPoint - Mike
TT_MarkerPosition returns the local position of the marker relative to the centroid of the rigid body. If you need the position of an untracked marker, you can use the rigid body centroid position and orientation to transform the value given by TT_MarkerPosition and get the location where the marker would be.

TT_TrackableMarker Question

Posted: Fri Jul 20, 2012 8:24 am
by nuLIMS
I am trying to determine the position of a marker in a rigid body that may or may not be in the camera frame at a certain point of time. I notice that the function TT_TrackableMarker returns constant [x,y,z] for that marker even if the rigid body is moving. Does TT_TrackableMarker return the marker's relative position with respect to the trackable's frame? And if so, what would be the best way of determining where this marker is located in the global space? I can't do a distance from the trackable's location comparison due to the high likelihood of the markers I'm interested in being occluded. Thank you for your help.

Re: TT_TrackableMarker Question

Posted: Thu Dec 06, 2012 12:22 am
by bencrossman
It would be great to get some example code to do this transform.

I'm not sure how to apply the orientation returned by TT_TrackableLocation to the values returned by TT_TrackableMarker.

Cheers

Ideally if you could use XMVECTOR / XMMATRIX but I'm not too fussed.

Re: TT_TrackableMarker Question

Posted: Thu Dec 06, 2012 5:56 pm
by bencrossman
I tried some code like this:
[font:Courier New][size:3pt]float p1[3],p2[3],p3[3],position[3],orientation[4],dummy;
TT_TrackableMarker(0,0,&(p1[0]),&(p1[1]),&(p1[2]));
TT_TrackableMarker(0,0,&(p2[0]),&(p2[1]),&(p2[2]));
TT_TrackableMarker(0,0,&(p3[0]),&(p3[1]),&(p3[2]));
TT_TrackableLocation(0,&(position[0], &(position[1], &(position[2]),&(orientation[0]), &(orientation[1]),&(orientation[2]),&(orientation[3]), &dummy,&dummy,&dummy);

XMMATRIX matrix = XMMatrixRotationQuaternion(XMVectorSet(orientation[0],orientation[1],orientation[2],orientation[3]));
matrix = XMMatrixMultiply(matrix,XMMatrixTranslation(position[0],position[1],position[2]));

XMVECTOR result = XMVector3Transform(XMVectorSet(p1[0],p1[1],p1[2],1),matrix);
p1[0]=XMVectorGetX(result);
p1[1]=XMVectorGetY(result);
p1[2]=XMVectorGetZ(result);

result = XMVector3Transform(XMVectorSet(p2[0],p2[1],p2[2].z,1),matrix);
p2[0]=XMVectorGetX(result);
p2[1]=XMVectorGetY(result);
p2[2]=XMVectorGetZ(result);

result = XMVector3Transform(XMVectorSet(p3[0],p3[1],p3[2].z,1),matrix);
p3[0]=XMVectorGetX(result);
p3[1]=XMVectorGetY(result);
p3[2]=XMVectorGetZ(result);[/size][/font]
The three resulting points do not match the points I get if I just use TT_FrameMarkerX/Y/Z etc...

Re: TT_TrackableMarker Question

Posted: Thu Dec 06, 2012 7:13 pm
by bencrossman
Ah nevermind, just found the function
TT_TrackablePointCloudMarker

which does what I need. Shame it doesnt give you predicted position of any untracked points.

Re: TT_TrackableMarker Question

Posted: Thu Dec 06, 2012 9:20 pm
by bencrossman
Sorry looks like it does untracked points too, just need to add more points to help the trackable

Re: TT_TrackableMarker Question

Posted: Sun Dec 09, 2012 9:19 pm
by bencrossman
I added more points but TT_TrackablePointCloudMarker still returns empty vectors for untracked points so looks like I will need that working code like above

Thanks

Re: TT_TrackableMarker Question

Posted: Sun Dec 09, 2012 11:41 pm
by bencrossman
Ok, gave up on quaternions and used the Euler angles. Looks like the following code does what I want.

Code: Select all

void PointCloudMarker(int RigidIndex, int MarkerIndex, float &x, float &y, float &z)
{
  bool tracked;
  TT_TrackablePointCloudMarker(RigidIndex,MarkerIndex,tracked,x,y,z);
  if (!tracked)
  {
    TT_TrackableMarker(RigidIndex,MarkerIndex,&x,&y,&z);

    float position[3],dummy,yaw, pitch, roll;
    TT_TrackableLocation(0,&(position[0]), &(position[1]), &(position[2]),&dummy,&dummy,&dummy,&dummy, &yaw, &pitch, &roll);
    // The Eulers are applied in the following order: Y, Z, X
    XMMATRIX matrix = XMMatrixRotationAxis(XMVectorSet(0,1,0,0),-yaw*float(M_PI/180));
    matrix = XMMatrixMultiply(matrix,XMMatrixRotationAxis(XMVectorSet(0,0,1,0),-pitch*float(M_PI/180)));
    matrix = XMMatrixMultiply(matrix,XMMatrixRotationAxis(XMVectorSet(1,0,0,0),-roll*float(M_PI/180)));
    matrix = XMMatrixMultiply(matrix,XMMatrixTranslation(position[0],position[1],position[2]));
    XMVECTOR result = XMVector3Transform(XMVectorSet(x,y,z,1),matrix);
    x=XMVectorGetX(result);
    y=XMVectorGetY(result);
    z=XMVectorGetZ(result);
  }
}

Re: TT_TrackableMarker Question

Posted: Mon Dec 10, 2012 10:31 pm
by bencrossman
That should be :

Code: Select all

TT_TrackableLocation(RigidIndex,
not:

Code: Select all

TT_TrackableLocation(0,