Rotate 3D-Figures

[EDIT: 20110711 16:20 CDT - reformat - WDR]
Hi,
I have a little problem while programming with Matlab. Our task is to create a GUI which makes it possible to rotate, to move and scaling 3D-Figures.
Moving, picturing the figures and the structure of the GUI is no problem, but I´m not able to program the part of rotating and scaling.
Maybe someone can help me...
Thanks a lot....
Next I will give you the functions I had programed:
GUI:
function varargout = bedieninterface_do(varargin)
% BEDIENINTERFACE_DO M-file for bedieninterface_do.fig
% BEDIENINTERFACE_DO, by itself, creates a new BEDIENINTERFACE_DO or raises the existing
% singleton*.
%
% H = BEDIENINTERFACE_DO returns the handle to a new BEDIENINTERFACE_DO or the handle to
% the existing singleton*.
%
% BEDIENINTERFACE_DO('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in BEDIENINTERFACE_DO.M with the given input arguments.
%
% BEDIENINTERFACE_DO('Property','Value',...) creates a new BEDIENINTERFACE_DO or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before bedieninterface_do_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to bedieninterface_do_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help bedieninterface_do
% Last Modified by GUIDE v2.5 11-Jul-2011 14:11:45
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @bedieninterface_do_OpeningFcn, ...
'gui_OutputFcn', @bedieninterface_do_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before bedieninterface_do is made visible.
function bedieninterface_do_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to bedieninterface_do (see VARARGIN)
global h
h = handles;
% Choose default command line output for bedieninterface_do
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes bedieninterface_do wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = bedieninterface_do_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes during object creation, after setting all properties.
function panel1_CreateFcn(hObject, eventdata, handles)
% hObject handle to panel1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
set (hObject, 'SelectionChangeFcn', @sel_body);
function sel_body(source, eventdata)
global b
rb_Koerper = get(eventdata.NewValue,'Tag')
switch rb_Koerper
case 'rb_q'
b = Quader(5,5,8);
case 'rb_p'
b = Pyramide(5,5,8);
case 'rb_d'
b = Dreieck(5,5,8);
case 'rb_t'
b = Tetraeder(5,5,8);
case 'rb_o'
b = Octaeder(5,5,8);
case 'rb_i'
b = Initiale(5,5,8);
otherwise
disp('Fehler bei Körperauswahl');
end
Zeichnen(b)
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
% get(hObject,'Min') and get(hObject,'Max') to determine range of slider
% --- Executes during object creation, after setting all properties.
function slider1_CreateFcn(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: slider controls usually have a light gray background.
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
addlistener(hObject,'Action', @Schieberegler)
function Schieberegler(hObject, eventdata)
global rb_transfer b R Q
Wert = get(hObject, 'Value');
Wert = Wert - 0.5;
Wert = (Wert)*10;
switch rb_transfer
case 'rb_tx'
R = Translation (b, Wert,0,0);
%Zeichnen (bb, Xo);
case 'rb_ty'
R = Translation (b, 0,Wert,0);
%Zeichnen (bb, Yo);
case 'rb_tz'
R = Translation (b, 0,0,Wert);
%Zeichnen (bb, Zo);
end
Zeichnen(R)
%addlistener(hObject,'Action', @Schieberegler)
% --- Executes during object creation, after setting all properties.
function panel2_CreateFcn(hObject, eventdata, handles)
% hObject handle to panel2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
set (hObject, 'SelectionChangeFcn', @sel_transformation);
function sel_transformation(source, eventdata)
global rb_transfer
rb_transfer = get(eventdata.NewValue,'Tag')
% --- Executes on button press in checkbox1.
function checkbox1_Callback(hObject, eventdata, handles)
% hObject handle to checkbox1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox1
if (get(h.checkbox1,'Value') == get(h.checkbox1,'Max'))
global R Q
Q = R;
Q = Translation (Q, Wert,Wert,Wert);
% switch Q
% case 'rb_tx'
% Q = Translation (Q, Wert,0,0);
% %Zeichnen (bb, Xo);
% case 'rb_ty'
%
% Q = Translation (Q, 0,Wert,0);
% %Zeichnen (bb, Yo);
% case 'rb_tz'
% Q = Translation (Q, 0,0,Wert);
% %Zeichnen (bb, Zo);
% end
% Zeichnen(Q)
else
Q = b;
Zeichnen(R)
% Checkbox is not checked-take approriate action
end
% --- Executes during object creation, after setting all properties.
function rb_q_CreateFcn(hObject, eventdata, handles)
% hObject handle to rb_q (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes during object creation, after setting all properties.
function rb_t_CreateFcn(hObject, eventdata, handles)
% hObject handle to rb_t (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes during object creation, after setting all properties.
function rb_tx_CreateFcn(hObject, eventdata, handles)
% hObject handle to rb_tx (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
Function Dreieck:
function body = Dreieck(x,y,z)
%Punkten 1 2 3 4 5 6
body.p = [0, x, x, 0, x/2, x/2;...
0, 0, y, y, y, 0;...
0, 0, 0, 0, z, z];
%Linien 1 2 3 4 5 6 7 8 9
body.l = [1, 2, 3, 4, 4, 1, 2, 3 6;...
2, 3, 4, 1, 5, 6, 6, 5, 5];
same for the other figures
Function Rotation:
%Drehung
function Gedreht = Rotation(grad, Ax, body)
Gedreht = body;
D = zeros(3);
switch Ax
case 'x'
D(1,1) = 1 ;
D(2,2) = cosd(grad) ;
D(2,3) = -sind(grad) ;
D(3,2) = sind(grad) ;
D(3,3) = cosd(grad) ;
case 'y'
case 'z'
end
Gedreht.p = D*body.p
Function Skalierung:
%Skalierung
function skaliertes = Skalierung(body,f)
skaliertes=body;
skaliertes.p = f*body.p;
Function Translation:
%Verschiebung
function Verschiebtes = Translation(body, dX, dY, dZ)
Verschiebtes = body;
for i=1: size(body.p,2)
Verschiebtes.p (:,i)= body.p (:,i) + [dX; dY;dZ];
end
Function Zeichnen:
function Zeichnen(body)
figure(1)
clf
for Linie = 1: size(body.l,2)
plot3([body.p(1,body.l(1,Linie)), body.p(1,body.l(2,Linie))],...
[body.p(2,body.l(1,Linie)), body.p(2,body.l(2,Linie))],...
[body.p(3,body.l(1,Linie)), body.p(3,body.l(2,Linie))]);
hold on;
end;
%plot ([10 0], [0 0])
%plot ([-10 0], [0 0])
plot3 ([-10 10], [0 0],[0 0], 'r');
plot3 ([0 0], [-10 10], [0 0], 'g');
plot3 ([0 0], [0 0], [-10 10], 'k');

Answers (2)

Jan
Jan on 11 Jul 2011

1 vote

There are some FEX submissions, which use the mouse for 3D naviagtion: FEX: mouse3d, FEX: view3d, FEX: rotate3D. I think the pure mouse navigation is more natural than using a slider.
Your function "Rotation" cannot be called in the code you show.
Your function "Translation" is associated with a slider by way of adding a listener to the slider object. The more common way of doing that is to instead set the function as the Callback property of the slider -- for example,
set(hObject, 'CallBack', @Schieberegler)

1 Comment

Jan
Jan on 11 Jul 2011
@Walter: The callback of sliders is triggered, when the mouse is released - at least under Windows. This is very unconvenient for scrolling or moving. The listener is triggered when the slider is moved, such that a direct feedback of the motion can be seen.

Sign in to comment.

Categories

Find more on Graphics Object Properties in Help Center and File Exchange

Asked:

Max
on 11 Jul 2011

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!