changing color of structure which defined as object
8 views (last 30 days)
Show older comments
CUBE = platform(sc);
CUBE.Dimensions = struct('Length',5,'Width',5,'Height',5,'OriginOffset',[0 0 0]);
I created an object called CUBE, with the specified dimensions, and it is plotted while it is rotating, i need to change the color of its faces to recognize the rotation.
thanks
1 Comment
Walter Roberson
on 23 Mar 2021
This appears to refer to Sensor Fusion
Are you using plotPlatform() ? I have not yet found a plotPlatform() approach to plot faces, only markers.
Accepted Answer
Greg Dionne
on 24 Mar 2021
Edited: Greg Dionne
on 24 Mar 2021
The orientationPlotter is intended for plotting the orientation of (possibly multiple) objects using the RED, GREEN, BLUE labeling convention for the orientation of the body's x-, y-, and z-axes, respectively. For a quick example of plotting just one orientation centered at the origin, try running:
% Example: Animate a smoothly interpolated rotation from
% from -30 degrees yaw, 20 degrees pitch, 10 degrees roll
% to 60 degrees yaw, 10 degrees pitch and 5 degrees roll.
% -------
% create the endpoints of the rotation.
e = deg2rad([-30 20 10; 60 10 5]);
% convert endpoints to a quaternion.
q = quaternion(e, 'euler', 'ZYX', 'frame');
% upsample with 100 points via spherical linear interpolation
qs = slerp(q(1), q(2), linspace(0,1,100)');
% create a theater plot
tp = theaterPlot('XLimit',[-2 2],'YLimit',[-2 2],'ZLimit',[-2 2]);
% add an orientation plotter to the theater plot
op = orientationPlotter(tp,'DisplayName','body axis');
% animate the changes in rotation
for i=1:numel(qs)
plotOrientation(op, qs(i));
drawnow;
end
You can place the origin of the body axes (denoted by the black dot) via the optional third argument to the plotOrientation method. That may be easier to see the orientations when multiple objects are plotted (since they may only occupy a few pixels each when you are looking at several objects that are very far apart from eachother.
The plotters should work just fine with other typical handle graphics commands should you need finer granularity of control. You can obtain the axes that an existing theaterPlot uses via its "Parent" property. Otherwise just create an axes as you normally would (via axes). I would use a combination of hgtransform, makehgtform, and patch to achieve your desired effect. If you want to see all of these operating simultaneously you can do something like:
sc = trackingScenario;
cube = platform(sc);
cube.Dimensions = struct('Length',5,'Width',5,'Height',5,'OriginOffset',[0 0 0]);
% create a theater plot
tp = theaterPlot('XLimit',[-10 10],'YLimit',[-10 10],'ZLimit',[-10 10]);
% add an orientation plotter to the theater plot
op = orientationPlotter(tp,'DisplayName','body axis');
% find the coordinates of each face
L = cube.Dimensions.Length;
W = cube.Dimensions.Width;
H = cube.Dimensions.Height;
offset = cube.Dimensions.OriginOffset;
% vertices ordered counterclockwise observed from the outside
% forward, right, down, backward, left, up
f = [ 1 1 1; 1 -1 1; 1 -1 -1; 1 1 -1] .* [L W H]/2 - offset;
r = [ 1 1 1; 1 1 -1;-1 1 -1;-1 1 1] .* [L W H]/2 - offset;
d = [ 1 1 1;-1 1 1;-1 -1 1; 1 -1 1] .* [L W H]/2 - offset;
b = [-1 1 1;-1 1 -1;-1 -1 -1;-1 -1 1] .* [L W H]/2 - offset;
l = [-1 -1 1;-1 -1 -1; 1 -1 -1; 1 -1 1] .* [L W H]/2 - offset;
u = [ 1 1 -1; 1 -1 -1;-1 -1 -1;-1 1 -1] .* [L W H]/2 - offset;
% create a transform object and make the patches
hTransform = hgtransform(tp.Parent);
patch(hTransform, f(:,1), f(:,2), f(:,3), 'red', 'FaceAlpha',.6);
patch(hTransform, l(:,1), l(:,2), l(:,3), 'yellow', 'FaceAlpha',.6);
patch(hTransform, u(:,1), u(:,2), u(:,3), 'cyan', 'FaceAlpha',.6);
patch(hTransform, b(:,1), b(:,2), b(:,3), 'magenta','FaceAlpha',.6);
patch(hTransform, r(:,1), r(:,2), r(:,3), 'green', 'FaceAlpha',.6);
patch(hTransform, d(:,1), d(:,2), d(:,3), 'blue', 'FaceAlpha',.6);
% create the endpoints of the rotation.
e = deg2rad([-30 20 10; 60 10 5]);
% convert endpoints to a quaternion.
q = quaternion(e, 'euler', 'ZYX', 'frame');
% upsample with 100 points via spherical linear interpolation
qs = slerp(q(1), q(2), linspace(0,1,100)');
% animate the changes in rotation
for i=1:numel(qs)
position = [0 0 0];
plotOrientation(op, qs(i), position);
% hgtransform uses 'point' convention
M = eye(4);
M(1:3,1:3) = rotmat(qs(i),'point');
hTransform.Matrix = makehgtform('translate',position)*M;
drawnow;
end
You can experiment with different values for "position".
Hope this helps!
More Answers (0)
See Also
Categories
Find more on Graphics Performance in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!