changing color of structure which defined as object
8 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
user aluser
le 23 Mar 2021
Commenté : user aluser
le 24 Mar 2021
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 commentaire
Walter Roberson
le 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.
Réponse acceptée
Greg Dionne
le 24 Mar 2021
Modifié(e) : Greg Dionne
le 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!
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Graphics Performance dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!