- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我尝试使用 plot3
围绕我当前的人物旋转相机
while true; camorbit(0.9,-0.1); drawnow; end
然后即使在 8 核 MacPro 上,旋转也会周期性地挂起一段时间 ( example )。
我可以让它平滑吗?
编辑1:
虽然我的原始问题还没有解决方案,但我已经设法使用 getframe
函数制作了一部更好的电影。不过,它不允许记录徒手旋转,并且在 Mac 版 MATLAB2010b 中存在很多错误。
%# fix wrong figure position in MATLAB2010b for Mac - depends on your layout
correctedPosition = get(gcf,'Position') + [21 -125 0 0];
fps = 60; sec = 10;
vidObj = VideoWriter('newfile.avi');
vidObj.Quality = 100;
vidObj.FrameRate = fps;
open(vidObj);
for i=1:fps*sec
camorbit(0.9,-0.1);
writeVideo(vidObj,getframe(gcf, correctedPosition));
end
close(vidObj);
编辑2:
我在 MATLAB Central 创建了一个类似的线程.
编辑3:
可以自己试试downloading one of my figures .
最佳答案
我会说是您绘制的大量点导致了速度下降。一种选择是下采样。您也可以使用较低级别的函数进行绘制(检查 this related post 以比较 plot3/scatter3/line 性能)。
考虑下面针对速度优化的动画:
[X Y Z] = sphere(64);
X = X(:); Y = Y(:); Z = Z(:);
%# set-up figure
hFig = figure('Backingstore','off', 'renderer','zbuffer');
%# use lower-level function LINE
line(0.50*[X,X], 0.50*[Y,Y], 0.50*[Z,Z], 'LineStyle','none', 'Marker','.', 'MarkerSize',1, 'Color','r')
line(0.75*[X,X], 0.75*[Y,Y], 0.75*[Z,Z], 'LineStyle','none', 'Marker','.', 'MarkerSize',1, 'Color','g')
line(1.00*[X,X], 1.00*[Y,Y], 1.00*[Z,Z], 'LineStyle','none', 'Marker','.', 'MarkerSize',1, 'Color','b')
view(3)
%# freeze the aspect ratio to override stretch-to-fill behaviour
axis vis3d
%# fix the axes limits manually
%#set(gca, 'xlim',[-1 1], 'ylim',[-1 1], 'zlim',[-1 1])
axis manual
%# maybe even remove the tick labels
%set(gca, 'xticklabel',[], 'yticklabel',[], 'zticklabel',[])
%# animate (until figure is closed)
while ishandle(hFig); camorbit(0.9,-0.1); drawnow; end
请注意我们如何使用 Z 缓冲区 renderer , 并关闭 Backingstore属性(property)。
如果我理解正确,您尝试做的是录制截屏视频(使用第 3 方应用程序),同时手动旋转图形,但在您的情况下,这些手动旋转是“跳跃的”。另一方面,在 while 循环中使用 CAMORBIT/VIEW 为您的图形设置动画运行顺利...
我提出了一个替代解决方案:首先使用鼠标旋转图形,然后在每个步骤(方位角、仰角)中写入这些 View 配置。然后您可以在录制视频时使用 VIEW 功能重播它们,例如:
v = [...]; %# matrix where each row specify Az/El of view
for i=1:size(v,1)
view( v(i,:) )
drawnow
end
缺点是您必须使用鼠标小步按下/旋转/释放(ROTATE3D 对象不公开鼠标运动事件)
我写了一个简单的函数来帮助你完成这个过程。它加载保存的图形,启用 3d 旋转,并跟踪每一步的中间位置。完成后,按“完成”按钮返回 View 列表...
function v = rotationDemo(figFileName)
views = []; %# list of views (Az,El)
hFig = hgload(figFileName); %# load the saved figure
views(1,:) = get(gca,'View'); %# store initial view
%# add a button, used to terminate the process
hButton = uicontrol('Style','pushbutton', 'Position',[400 1 80 20], ...
'String','Done?', 'Callback',@buttonCallback);
set(hFig, 'Toolbar','figure') %# restore toolbar
%# start 3d rotation, and handle post-callback to record intermediate views
h = rotate3d(hFig); %# get rotation object
set(h, 'ActionPostCallback',@rotateCallback)
set(h, 'Enable','on') %# enable rotation
msgbox('Rotate the view step-by-step', 'rotate3d', 'warn', 'modal')
uiwait(hFig) %# wait for user to click button
delete(hButton) %# delete button on finish
set(h, 'Enable','off') %# disable rotation
v = round(views); %# return the list of views
%# callback functions
function rotateCallback(o,e)
views(end+1,:) = get(e.Axes,'View'); %# add current view to list
end
function buttonCallback(o,e)
uiresume(gcbf) %# uiresume(hFig)
end
end
可以调用上面的函数,然后重放动画:
v = rotationDemo('smooth_rotation.fig');
for i=1:size(v,1)
view(v(i,:))
drawnow
end
我们可以通过简单的插值来平滑过渡:
v = rotationDemo('smooth_rotation.fig');
n = size(v,1);
nn = linspace(1,n,100)'; %'# use 100 steps
vv = round( [interp1(v(:,1),nn) interp1(v(:,2),nn)] );
for i=1:size(vv,1)
view(vv(i,:))
DRAWNOW %# or PAUSE(..) to slow it down
end
作为旁注,我应该提到 ROTATE3D 和 CAMORBIT 有不同的效果。 ROTATE3D改变当前轴的View
属性,而CAMORBIT控制相机属性CameraTarget
/CameraPosition
/CameraUpVector
当前轴。
关于matlab - 如何在 MATLAB 中平滑旋转 3D 图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339194/
我是一名优秀的程序员,十分优秀!