www.gusucode.com > sl3ddemos工具箱matlab源码程序 > sl3ddemos/vrheat.m
%% Heat Transfer Visualization % This example illustrates the use of the Simulink(R) 3D Animation(TM) % with the MATLAB(R) interface for manipulating complex objects. % % In this example, matrix-type data is transferred between MATLAB and % a virtual reality world. Using this feature, you can achieve massive % color changes or morphing. This is useful for visualizing various % physical processes. % % We use precalculated data of time-based temperature distributions in an % L-shaped metal block and send that data to the virtual world. This forms % an animation with relatively large changes. % Copyright 1998-2012 HUMUSOFT s.r.o. and The MathWorks, Inc. %% Load the Precalculated Data load('vrheat.mat'); %% Reshaping the Object for VRML % The geometry of the L-shaped block is stored in the 'lblock' structure. % For visualization purposes, the block is subdivided into triangular % facets. Surface facet vertex coordinates are stored in the % 'lblock.mesh.p' field and triangle edges are described by indices into % the vertex array. vert = lblock.mesh.p'; %% % A set of facets in VRML is defined as a single vector of vertex indices % where facets are separated by -1, so we need to transform the vertex % array appropriately. Indexes in VRML are zero-based, so 1 is deducted % from all index values stored originally in the 1-based index array % lblock.mesh.e. facets = lblock.mesh.e(1:3,:)-1; facets(4,:) = -1; f = facets; f = f(:); facets = facets'; %% Prepare the Colormap % Now we'll prepare a colormap that represents various levels of % temperature. The MATLAB built-in 'jet' colormap is designed for these % purposes. cmap = jet(192); %% Apply the Colormap % The 'lblock.sol.u' field contains a matrix describing the temperatures of % vertices as time passes. We have 41 precalculated phases (1 is % initial) for 262 vertices. We need to scale the temperature values so % that they map into the colormap. u = lblock.sol.u; ucolor = (u-repmat(min(u),size(u,1),1)) .* (size(cmap,1)-1); urange = max(u) - min(u); urange(urange == 0) = 1; ucolor = round(ucolor./repmat(urange,size(u,1),1)); %% % We will calculate the first animation frame so we have something to begin % with. uslice=ucolor(:,1); colind=zeros(size(facets)); colind(:,1:3)=uslice(facets(:,1:3)+1); colind(:,4)=-1; ci = colind'; ci = ci(:); %% % The data is ready so we can load the world. world = vrworld('vrheat.wrl'); open(world); %% % Let's start the viewer. A cube should appear in the viewer window. fig = view(world, '-internal'); vrdrawnow; %% % Now we'll prepare the L-shaped block. The VRML world that we loaded % contains a basic cubic form that we can reshape into anything we want % by setting its 'point' and 'coordIndex' fields, which represent % the vertex coordinates and indices into the vertex array. % We will also set the colors by setting the 'color' and 'colorIndex' % fields. % % We first set the colors, the color indices, the vertices, % and then the vertex indices. The order is not mandatory but it is % generally better this way because we can be sure there is no temporary % state when there are more vertices than colors, or more indices than % values, which would cause some vertices to have undefined color or some % indices referring to nonexisting (yet) values. world.IFS_Colormap.color = cmap; world.IFS.colorIndex = ci; world.IFS_Coords.point = vert; world.IFS.coordIndex = f; %% Working with VRML Text Objects % The textual comment can also be set to something sensible. world.TEXT.string = {'Time = 0'}; vrdrawnow; %% Animate the Scene % Now we can start the animation. Watch it in the viewer. % You can move around the object, or try to set other rendering modes. % E.g., a wireframe mode which shows how the L-block is subdivided. for i = 1:size(u,2) pause(0.2); uslice = ucolor(:,i); colind = zeros(size(facets)); colind(:,1:3) = uslice(facets(:,1:3)+1); colind(:,4) = -1; ci=colind'; ci=ci(:); world.IFS.colorIndex = ci; world.TEXT.string = {sprintf('Time = %g', lblock.sol.tlist(i))}; vrdrawnow; end %% Preserve the Virtual World Object in the MATLAB(R) Workspace % After you are done with a VRWORLD object, it is necessary to close and % delete it. This is accomplished by using the CLOSE and DELETE commands. % % close(world); % delete(world); % % However, we will not do it here. Instead, we leave the world open so % that you can play with it further. We will clear only the used global variables. clear ans ci cm cmap colind f facets i lblock nh u ucolor; clear urange uslice v vert; displayEndOfDemoMessage(mfilename)