Moderator: ARToolKit developers
- (void)convertPointInViewToRay:(CGPoint)point
{
float m[16], A[16];
float p[4], q[4];
// Find INVERSE(PROJECTION * MODELVIEW).
if (contentRotate90) {
EdenMathRotationMatrix(A, DTOR*90.0f, 0.0f, 0.0f, -1.0f);
EdenMathMultMatrix(m, cameraLens, A);
EdenMathMultMatrix(A, m, cameraPose);
} else {
EdenMathMultMatrix(A, cameraLens, cameraPose);
}
if (EdenMathInvertMatrix4x4(m, A)) {
// Next, normalise point to viewport range [-1.0, 1.0], and with depth -1.0 (i.e. at near clipping plane).
p[0] = (point.x - viewPort[viewPortIndexLeft]) * 2.0f / viewPort[viewPortIndexWidth] - 1.0f; // (winx - viewport[0]) * 2 / viewport[2] - 1.0;
p[1] = (point.y - viewPort[viewPortIndexBottom]) * 2.0f / viewPort[viewPortIndexHeight] - 1.0f; // (winy - viewport[1]) * 2 / viewport[3] - 1.0;
p[2] = -1.0f; // 2 * winz - 1.0;
p[3] = 1.0f;
// Calculate the point's world coordinates.
EdenMathMultMatrix4x4ByVector(q, m, p);
if (q[3] != 0.0f) {
rayPoint1[0] = q[0] / q[3];
rayPoint1[1] = q[1] / q[3];
rayPoint1[2] = q[2] / q[3];
// Next, a second point with depth 1.0 (i.e. at far clipping plane).
p[2] = 1.0f; // 2 * winz - 1.0;
// Calculate the point's world coordinates.
EdenMathMultMatrix4x4ByVector(q, m, p);
if (q[3] != 0.0f) {
rayPoint2[0] = q[0] / q[3];
rayPoint2[1] = q[1] / q[3];
rayPoint2[2] = q[2] / q[3];
rayIsValid = TRUE;
return;
}
}
}
rayIsValid = FALSE;
}
Users browsing this forum: No registered users and 1 guest