void mexFunction( int nargout, mxArray *output[], int nargin, const mxArray *input[]) { /* check argument */ if (nargin != 4) { mexErrMsgTxt("Three input arguments required."); } if (nargout != 1) { mexErrMsgTxt("Incorrect number of output arguments."); } double *vertexData = (double*)mxGetData(input[0]); unsigned numVertices = static_cast<unsigned> (mxGetN(input[0])); double *faceData = (double*)mxGetData(input[1]); unsigned numFaces = static_cast<unsigned> (mxGetN(input[1])); TriMesh tri_mesh; tri_mesh.InitializeFromMatlab(vertexData, numVertices, faceData, numFaces); double *data = (double*)mxGetData(input[2]); Vector3d origin; origin[0] = data[0]; origin[1] = data[1]; origin[2] = data[2]; double *lookAts = (double*)mxGetData(input[3]); unsigned numRays = static_cast<unsigned> (mxGetN(input[3])); RayMeshIntersection ray_intersect; ray_intersect.Initialize(tri_mesh, 7); output[0] = mxCreateDoubleMatrix(4, numRays, mxREAL); data = mxGetPr(output[0]); for (unsigned rayId = 0; rayId < numRays; ++rayId) { Vector3d direction; direction[0] = lookAts[3*rayId]; direction[1] = lookAts[3*rayId+1]; direction[2] = lookAts[3*rayId+2]; direction = direction - origin; direction = direction/sqrt(direction.getSqrNorm()); Ray3D ray(origin, direction); IntersectingPoint pt; ray_intersect.Compute(ray, tri_mesh, &pt); data[4*rayId] = pt.faceId + 1; data[4*rayId+1] = pt.paraU; data[4*rayId+2] = pt.paraV; data[4*rayId+3] = pt.distance; } }