Code covered by the BSD License  

Highlights from
Get Rotation Matrix from 2 Orthogonal Planes

image thumbnail
from Get Rotation Matrix from 2 Orthogonal Planes by Gemma Parra
Computes a 3x3 rotation matrix from two orthogonal planes in a 3D point cloud.

callbackClickARectangleLowerRight(src, eventData, pointCloud)
function callbackClickARectangleLowerRight(src, eventData, pointCloud)

% CALLBACKCLICKARECTANGLELOWERRIGTH mouse click callback function for
% GETRMATRIX
%
%   The transformation between the viewing frame and the point cloud frame
%   is calculated using the camera viewing direction and the 'up' vector.
%   Then, the point cloud is transformed into the viewing frame. Finally,
%   the z coordinate in this frame is ignored and the x and y coordinates
%   of all the points are compared with the mouse click location and the 
%   closest point is selected.
%   SELECTEDPOINT cointains the points within the plane formed by 
%   UPPERLEFTINDEX and LOWERRIGHTINDEX.
%
%   by Gemma Parra using the functions developed by Babak Taati File ID:
%   #7594
%   June 5, 2012  


global UpperLeftIndex
global LowerRightIndex
global selectedPoint

point = get(gca, 'CurrentPoint'); % mouse click position
camPos = get(gca, 'CameraPosition'); % camera position
camTgt = get(gca, 'CameraTarget'); % where the camera is pointing to

camDir = camPos - camTgt; % camera direction
camUpVect = get(gca, 'CameraUpVector'); % camera 'up' vector

% build an orthonormal frame based on the viewing direction and the 
% up vector (the "view frame")
zAxis = camDir/norm(camDir);    
upAxis = camUpVect/norm(camUpVect); 
xAxis = cross(upAxis, zAxis);
yAxis = cross(zAxis, xAxis);

rot = [xAxis; yAxis; zAxis]; % view rotation 

% the point cloud represented in the view frame
rotatedPointCloud = rot * pointCloud; 

% the clicked point represented in the view frame
rotatedPointFront = rot * point' ;

% find the nearest neighbour to the clicked point 
pointCloudIndex = dsearchn(rotatedPointCloud(1:2,:)', ... 
    rotatedPointFront(1:2));

h = findobj(gca,'Tag','pt'); % try to find the old point
selectedPoint = pointCloud(:, pointCloudIndex); 

if isempty(h) % if it's the first click (i.e. no previous point to delete)
    
    % highlight the selected point
    h = plot3(selectedPoint(1,:), selectedPoint(2,:), ...
        selectedPoint(3,:), 'g.', 'MarkerSize', 20); 
    set(h,'Tag','pt'); % set its Tag property for later use     
    
else % if it is not the first click

    delete(h); % delete the previously selected point
    
    % highlight the newly selected point
    h = plot3(selectedPoint(1,:), selectedPoint(2,:), ...
        selectedPoint(3,:), 'g.', 'MarkerSize', 20);  
    set(h,'Tag','pt');  % set its Tag property for later use
   
   
end

LowerRightIndex = pointCloudIndex;

pointsWithinRectangleIndex =    rotatedPointCloud(1,:) > rotatedPointCloud(1, UpperLeftIndex) & ...
                                rotatedPointCloud(1,:) < rotatedPointCloud(1, LowerRightIndex) & ...
                                rotatedPointCloud(2,:) < rotatedPointCloud(2, UpperLeftIndex) & ...
                                rotatedPointCloud(2,:) > rotatedPointCloud(2, LowerRightIndex);

selectedPoint = pointCloud(:, pointsWithinRectangleIndex); 

hold on
plot3(selectedPoint(1,:), selectedPoint(2,:), selectedPoint(3,:), 'm.', 'MarkerSize', 20);        

Contact us