MATLAB:使用鼠标旋转GUI中的3D对象

时间:2019-10-02 13:47:03

标签: matlab 3d camera rotation lighting

因此,我有一个显示3D对象的GUI,我想添加一个按钮(“ rotatebtn ”),以便用户单击此按钮时,他们能够通过单击并在周围拖动鼠标,可以向任意方向旋转对象。

我了解rotate3D,但是该功能的问题在于它仅会改变方位角和仰角,因此您无法真正在所有方向上自由旋转对象。

cameratoolbar中的“轨道”模式可以完美地做到这一点,但是我希望照明在用户移动相机时也能跟随相机,因此灯光始终处于“前灯”模式。我不知道如何在cameratoolbar中将其添加到轨道模式,所以我决定自己实现。

在这里出现问题。我的代码如下。我的目标是捕获鼠标指针在x和y方向上的移动,并将其转换为相机的旋转度。我以为camorbit会围绕目标水平和垂直旋转摄像机,但是显然它会沿图形的X和Y方向旋转,这不一定与摄像机视图中的水平和垂直方向相同。我不知道如何将这些方向转换为另一个方向。

我将非常感谢您提供有关如何进行此工作的帮助。

function rotatebtn_Callback(hObject, eventdata, handles)
   set(gcf,'WindowButtonDownFcn', @buttondownfcn);  

function buttondownfcn(hObject,~)
   handles = guidata(hObject);
   locst = get (handles.axes1, 'CurrentPoint'); %starting point of the move
   campos = get(handles.axes1,'CameraPosition'); %camera position
   camtar = get(handles.axes1,'CameraTarget'); %target position
   r=sqrt(sum((campos-camtar).^2)); % distance between the camera and target
   set(gcf,'windowbuttonmotionfcn',{@rotationcallback,locst,r});

function rotationcallback(hObject,~,locst,r)
   handles = guidata(hObject);
   locend = get (handles.axes1, 'CurrentPoint'); % get mouse location
   dtheta = -(locend(1) - locst(1))*180/(pi*r);           % calculate horizontal rotation
   dy = -(locend(2) - locst(2))*180/(pi*r);         % calculate vertical rotation
   camorbit(dtheta,dphi,'camera') %rotate camera
   handles.light = camlight(handles.light,'headlight'); %change light 

0 个答案:

没有答案