因此,我有一个显示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