制作电影:摄像机和摄像机的位置多个场景

时间:2013-12-10 08:36:06

标签: matlab movie

这是一个代表我需要做的代码的示例代码:

ang=0:0.01:2*pi; 
r = 1;
xp=r*cos(ang);
yp=r*sin(ang);

frequency  = 1/0.016;         % real frequency
datalength = length(ang);     % n° of points
scale      = 10;              % resampling
nFrames    = floor(datalength/scale);

% figure
figure()
set(gcf, 'Color','white')
hold on 
axis equal

set(gca, 'nextplot','replacechildren', 'Visible','off'); % ?

% preallocate
mov(1:nFrames) = struct('cdata',[], 'colormap',[]);

% create movie
for k = 1:nFrames
    axes(gca); cla;
    hold on 

    plot3(xp,yp,zeros(size(xp)));
    plot3(1,0,0,'kx');

    % Update Target
    for j = 1:scale
        id = (k-1)*scale + j;
        CurTar = ang(id);
        PsiTar = CurTar + pi*0.5;
    end    

    % Plot obj
    plot3(2*xp(id),2*yp(id),0,'k.','LineWidth',4)

    % Plot Target
    plot3(xp(id),yp(id),0,'r.','LineWidth',3)

    a = -PsiTar - 0.75*pi;
    % Set Camera
    xc = xp(id) - sin(a);
    yc = yp(id) - cos(a);
    zc = 0.5;

    campos([xc,yc,zc])
    camtarget([xp(id),yp(id),0])

    mov(k) = getframe(gcf);
end

close(gcf)

movie2avi(mov, 'mymovie', 'fps', round(frequency/scale));

我有以下问题/疑问:

  • 我想绘制一次圆圈,而不是每个循环。我试图将它放在for循环之前,但是在每次迭代时都没有维护,除非我注释掉axes(gca); cla;行,但是这有一个明显的另一个缺点:一切都得到维护,而不是只有圆圈。

  • 我希望从多个角度看到相同的场景。我知道怎么做子图,我会知道如何多次绘制相同的东西并简单地设置相机,有没有一种方法可以绘制一次并有多个投影?

  • 我的相机位置有问题。您看到我在sincos的定义中有xcyc。在这个例子中一切都很好,但我的完整脚本中的相同代码导致错误:

    ??? Error using ==> set
    Value must be a 3 element numeric vector
    
    Error in ==> campos at 50
    set(ax,'cameraposition',val);
    

    我怎么能摆脱它?我已经打印屏幕上显示所有值,它们是数字的,我不知道会发生什么。

修改

其他问题

如果我绘制以下内容

for k = 1:nFrames
    axes(gca); cla;
    hold on 

    plot3(zeros(length(ang)),ang,zeros(length(ang)),'b')

    % Update Target
    for j = 1:scale
        id = (k-1)*scale + j;
    end    

    % Plot obj
    plot3(0,2*yp(id),0,'k.','LineWidth',4)

    if k==1
        view(0,0)
        camzoom(50)
    end
    camtarget([0,yp(id),0])

end

close(gcf)

您可以看到相机未与y轴对齐,否则您将看不到蓝线。这是为什么?怎么可能避免呢?

0 个答案:

没有答案