KeyPress function on data rather on figure

Hi,
I am trying to implement a key-press function for basically a fly through scene, i.e. updating the cam target and cam pos through a patched surface.
However, the key-press is acting on the figure itself instead of the plotted data. Is there another way to implement it/what am I doing wrong?
Thanks, Ali
Example code:
patch_fig=figure;
p=patch('Faces',faces,'Vertices',vertices,'FaceColor','red');
set(patch_fig,'KeyPressFcn',{@fh_keypress_handle, patch_fig});
%%function%%
function fh_keypress_handle(H,E,patch_fig)
hAx=gca;
[cPosition, cTarget, cViewAngle, cViewVector, cRightVector, cUpVector] = getcamerageometry(hAx);
current_pos = campos(hAx);
current_camtarget = camtarget(hAx);
switch E.Key
%%Move in x direction
case 'uparrow'
if isempty(E.Modifier)
campos(current_pos + cViewVector);
camtarget([current_camtarget+cViewVector]);
camlight(hlight,'headlight')
case 'downarrow'
if isempty(E.Modifier)
campos(current_pos - cViewVector);
camtarget([current_camtarget-cViewVector]);
end

답변 (2개)

Walter Roberson
Walter Roberson 2017년 2월 7일

0 개 추천

You should probably use a figure WindowKeypressFcn callback instead of a figure KeyPressFcn. The KeyPressFcn has the tendency to give typing focus to the figure.
But first alter all of your cam* calls to pass in the axes. And instead of fetching the axes using gca(), pass it in instead of patch_fig (which is not used in your routine.)

댓글 수: 3

Rheeda
Rheeda 2017년 2월 7일
Thanks Walter. Would I still be able to use the up/down arrow keys for moving the cam pos/cam target?? Also, how do I pass the cam calls in the axes?
Cheers, Rheeda
The axes can go as the first argument to the cam* calls.
I would fix the axes stuff up first before switching to WindowKeyPressFcn; you might not have to switch that.
Hi Walter,
I've update the code to pass in the camera properties in the axes handle, and have changed to WindowPres but the up/down arrows still move the figure itself (KeyPress gives the same response).
Am I still doing something wrong?
Thanks for your help, Rheeda
patch_fig=figure;
p=patch('Faces',faces,'Vertices',vertices,'FaceColor','red');
reducepatch(p,0.7);
Centreofmass=[mean(vertices(:,1)), mean(vertices(:,2)),mean(vertices(:,3))];
hAx=gca;
[cPosition, cTarget, cViewAngle, cViewVector, cRightVector, cUpVector] = getcamerageometry(hAx);
hAx.CameraPosition=[Centreofmass(1), Centreofmass(2),Centreofmass(3)];
hAx.CameraTarget= [cTarget(1) cTarget(2) cTarget(3)];
set(patch_fig,'WindowKeypressFcn',{@fh_keypress_handle_edit, hAx});
function fh_keypress_handle_edit(H,E,hAx)
current_pos = hAx.CameraPosition;
current_camtarget = hAx.CameraTarget;
[cPosition, cTarget, cViewAngle, cViewVector, cRightVector, cUpVector] = getcamerageometry(hAx);
[azimuth,elevation,r] = cart2sph(hAx.CameraTarget(1), hAx.CameraTarget(2), hAx.CameraTarget(3));
switch E.Key
%%Move in x direction
case 'uparrow'
if isempty(E.Modifier)
campos(current_pos + cViewVector);
camtarget([current_camtarget+cViewVector]);
hAx.CameraPosition=current_pos + cViewVector;
hAx.CameraTarget= current_camtarget+cViewVector;
case 'downarrow'
if isempty(E.Modifier)
campos(current_pos - cViewVector);
camtarget([current_camtarget-cViewVector]);
hAx.CameraPosition=current_pos + cViewVector;
hAx.CameraTarget= current_camtarget+cViewVector;
end

댓글을 달려면 로그인하십시오.

Rheeda
Rheeda 2017년 2월 7일
편집: Walter Roberson 2017년 2월 7일

0 개 추천

All I need in my script was:
camproj perspective
camva(50)

카테고리

도움말 센터File Exchange에서 Graphics Performance에 대해 자세히 알아보기

질문:

2017년 2월 7일

편집:

2017년 2월 7일

Community Treasure Hunt

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

Start Hunting!

Translated by