如何在Wolfram Mathematica中创建带有相机跟随物体的2D(3D)动画?

4
我有一个沿着轨迹移动的图形对象,如何让相机跟随该对象移动?
2个回答

12
让我们画一颗行星和它的卫星,用摄像机从面向地球的方向跟随月球。例如:
a = {-3.5, 3.5}; 
Animate[
 Show[
      Graphics3D[
           Sphere[3 {Cos@t, Sin@t, 0}, .5],  
                 ViewPoint -> 3.5 {Cos@t, Sin@t, 0},     
                 SphericalRegion -> True, 
                 PlotRange -> {a, a, a}, Axes -> False, Boxed -> False],
      myEarth], 
{t, 0, 2 Pi}]  

myEarth 是另一个3D图形(供参考)。

输入图像描述

静态竖向视图:

a = {-3.5, 3.5}; 
Animate[
 Show[
      Graphics3D[
           Sphere[3 {Cos@t, Sin@t, 0}, .5],  
                 ViewPoint -> 3.5 {0,0,1},     
                 SphericalRegion -> True, 
                 PlotRange -> {a, a, a}, Axes -> False, Boxed -> False],
      myEarth], 
{t, 0, 2 Pi}]  

输入图像描述

技巧是使用SphericalRegion -> True,否则图像透视在帧之间会“移动”。

编辑

使用两个静态对象:

输入图像描述


+1. 在问题标题中,OP提到了“2D”和“相机”,这让我困惑是否需要一个Graphics或者Graphics3D的解决方案。您可以考虑添加您答案的Graphics等效项来覆盖所有可能性,例如:Graphics[..., PlotRange -> {a, a} + f[t], ImagePadding -> None, ...] - WReach
1
ViewCenter和ViewVertical也是在这种情况下可能有用的选项。 - Sjoerd C. de Vries
@WReach 我猜“camera”和“2D”是互斥的。由于“camera”很难拼错,所以在我看来,2D应该是3D。遗憾的是,提问者没有包含代码片段以更好地理解需求。如果您认为值得的话,可以自由地添加另一个关于2D情况的回答。 - Dr. belisarius
非常感谢你的出色回答!它非常有帮助。但是我问的是2D动画相关问题。 - littleGirl_dev
这里是Simon的迷幻(也称为醉酒)图标 :D - Dr. belisarius

5

既然问题涉及到2D,那么这里介绍如何在2D图形中模拟相机。

首先,我们需要获取stackoverflow的favicon.ico:

so = First@Import["http://sstatic.net/stackoverflow/img/favicon.ico"]

把这个放在一些重叠的圆圈的顶部,并通过调整PlotRange使“相机”跟随图标移动。
Manipulate[Graphics[{
   Table[Circle[{j, 0}, i], {i, 0, 1, .1}, {j, {-.5, .5}}],
   Inset[so, pos, {0, 0}, .2]},
  PlotRange -> {{-.5, .5}, {-.5, .5}} + pos],
 {{pos, {0, 0}, ""}, {-1.4, -1}, {1.4, 1}, ControlPlacement -> Left}]

manipulate

为了展示它是如何工作的(而不是将上述内容放入Mathematica中),我们需要做一个动画。 最初我选择了一个变量步长的随机游走drunk = Accumulate[RandomReal[{-.1, .1}, {200, 2}]],但这太不可预测了!因此,我们将使图标跟随ABC标志。

drunk = Table[{1.5 Sin[t], Cos[3 t]}, {t, 0, 2 Pi, .1}];
Animate[Graphics[{
   Table[Circle[{j, 0}, i], {i, 0, 1, .1}, {j, {-.5, .5}}],
   Inset[so, drunk[[pos]], {0, 0}, .2]},
  PlotRange -> {{-.5, .5}, {-.5, .5}} + drunk[[pos]]],
 {pos, 1, Length[drunk], 1}]

animated


看了@belisarius美丽答案的评论,我发现我的解决方案正是@WReach建议的... 我认为这是使用2D图形唯一明智的方法。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接