%% ME 6175
%% Rigid-Body Transformation and Parametric Modeling example -- Windmill
%%
% Primitive shapes: square, cube, cone.
cube = [-0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5;
0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1;
-0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5;
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
square = [-0.5, -0.5, 0.5, 0.5, -0.5;
-0.5, 0.5, 0.5, -0.5, -0.5;
0, 0, 0, 0, 0;
1, 1, 1, 1, 1];
%% Cone
nsegs = 20;
cone = circle (1.0, 0.0, 0.0, nsegs);
cone(1,nsegs+2) = 0.0; cone(1,nsegs+6) = 0.0;
cone(2,nsegs+2) = 0.0; cone(2,nsegs+6) = 0.0;
cone(3,nsegs+2) = 1.0; cone(3,nsegs+6) = 1.0;
cone(4,nsegs+2) = 1.0; cone(4,nsegs+6) = 1.0;
cone(1,nsegs+3) = -1.0; cone(1,nsegs+7) = 0.0;
cone(2,nsegs+3) = 0.0; cone(2,nsegs+7) = 1.0;
cone(3,nsegs+3) = 0.0; cone(3,nsegs+7) = 0.0;
cone(4,nsegs+3) = 1.0; cone(4,nsegs+7) = 1.0;
cone(1,nsegs+4) = 0.0;
cone(2,nsegs+4) = 0.0;
cone(3,nsegs+4) = 1.0;
cone(4,nsegs+4) = 1.0;
cone(1,nsegs+5) = 0.0;
cone(2,nsegs+5) = -1.0;
cone(3,nsegs+5) = 0.0;
cone(4,nsegs+5) = 1.0;
% Top-Level Parameters
BaseRadius = 10.0;
BaseHeight = 6.0;
HouseWidth = 17.0;
HouseHeight = 22.0;
HouseDepth = 12.0;
BladeLength = 11.0;
BladeWidth = 0.95;
ShaftHeightFactor = 0.75;
% House rotation, propeller rotation.
house_rot = 0.0;
prop_rot = 30.0;
% Define viewing angles.
vroll = degtor (0.0);
vpitch = degtor (0.0);
vyaw = degtor (-90.0);
g = rot3Dz (vroll) * rot3Dy (vpitch) * rot3Dx (vyaw);
% Base of windmill
bscale = scale3D (BaseRadius, BaseRadius, BaseHeight);
base = g * bscale * cone;
% House of windmill
hscale = scale3D (HouseWidth, HouseHeight, HouseDepth);
hrot = rot3Dz (degtor (house_rot));
horient = rot3Dx (degtor (90.0));
htrans = trans3D (0.0, 0.0, BaseHeight);
house_orient = g * htrans * hrot;
house = house_orient * horient * hscale * cube;
% Blades of propeller.
shaft_axis = trans3D (0.0, -0.5*HouseDepth-1.0, ShaftHeightFactor*HouseHeight);
blade_scale = scale3D (BladeLength, BladeWidth, 0.0);
prop_mat = rot3Dy (degtor (prop_rot));
blade_orientx = rot3Dx (degtor (90.0));
blade_trans = trans3D (0.5*BladeLength, 0.0, 0.0);
blade_xform = house_orient * shaft_axis * prop_mat * blade_orientx;
blade_pts = blade_scale * square;
blade1 = blade_xform * blade_trans * blade_pts;
blade_fan = rot3Dz (degtor (90.0));
blade2 = blade_xform * blade_fan * blade_trans * blade_pts;
blade_fan = rot3Dz (degtor (180.0));
blade3 = blade_xform * blade_fan * blade_trans * blade_pts;
blade_fan = rot3Dz (degtor (270.0));
blade4 = blade_xform * blade_fan * blade_trans * blade_pts;
% Plot Windmill.
axis ('square');
plot (base (1,:), base (2,:));
hold;
plot (house (1,:), house (2,:));
plot (blade1 (1,:), blade1 (2,:));
plot (blade2 (1,:), blade2 (2,:));
plot (blade3 (1,:), blade3 (2,:));
plot (blade4 (1,:), blade4 (2,:));
hold;