![渐近线:在动画中改变 POV 时保持窗口大小](https://linux22.com/image/305307/%E6%B8%90%E8%BF%91%E7%BA%BF%EF%BC%9A%E5%9C%A8%E5%8A%A8%E7%94%BB%E4%B8%AD%E6%94%B9%E5%8F%98%20POV%20%E6%97%B6%E4%BF%9D%E6%8C%81%E7%AA%97%E5%8F%A3%E5%A4%A7%E5%B0%8F.png)
在我发现的每个 Asymptote 动画示例中(参见例如这里或者这里),动画过程中视点是恒定的。我想制作一个由旋转视点组成的动画,其中绘制的对象是恒定的。
以下代码有效,但如您所见,结果gif
不稳定。我该如何避免这种情况?
size(10cm,10cm);
import graph3;
import grid3;
//import animation;
import animate;
settings.render=1;
animation A;
A.global=false;
real xmin=-2, xmax=2;
real ymin=-2, ymax=1.5;
real zmin=-2.5, zmax=2.5;
limits((xmin,ymin,zmin),(xmax,ymax,zmax));
unitsize(3cm,3cm,2cm);
viewportmargin=(2,2);
////// PLANES ///////
pen bg=gray(0.9)+opacity(0.2);
draw(surface((xmax,ymin,zmin)--(xmax,ymin,zmax)--(xmin,ymin,zmax)--(xmin,ymin,zmin)--cycle),bg);
draw(surface((xmin,ymax,zmin)--(xmin,ymax,zmax)--(xmin,ymin,zmax)--(xmin,ymin,zmin)--cycle),bg);
draw(surface((xmax,ymax,zmin)--(xmax,ymin,zmin)--(xmin,ymin,zmin)--(xmin,ymax,zmin)--cycle),bg);
xaxis3(Label("$x$",MidPoint,align=Y-Z),Bounds(Both,Min),InTicks(Step=1),p=black);
yaxis3(Label("$y$",MidPoint,align=X-Z),Bounds(Both,Min),InTicks(Step=.5),p=black);
zaxis3(Label("$z$",MidPoint,align=X-Y),Bounds(Both,Min),InTicks(Step=2),p=black);
for(real i;i<6.28;i=i+0.05) {
currentprojection=perspective(camera=(2*cos(i),2*sin(i),2.5));
A.add();
save();
}
A.movie(loops=3,delay=50);
编辑我按照 Harish Kumar 的建议添加了一个边界框;效果更好但仍然不够完美。
代码(仅末尾更改):
for(real i;i<6.28;i=i+.1) {
currentprojection=perspective(camera=(2*cos(i),2*sin(i),2.5));
picture pic;
add(pic,bbox(20mm));
A.add(pic);
save();
}
答案1
最好插入一个球体,它的投影不依赖于相机(在本例中)。请查看代码
size(10cm,10cm);
import graph3;
import grid3;
//import animation;
import animate;
settings.render=1;
animation A;
A.global=false;
real xmin=-2, xmax=2;
real ymin=-2, ymax=1.5;
real zmin=-2.5, zmax=2.5;
limits((xmin,ymin,zmin),(xmax,ymax,zmax));
unitsize(3cm,3cm,2cm);
viewportmargin=(2,2);
////// PLANES ///////
pen bg=gray(0.9)+opacity(0.2);
draw(surface((xmax,ymin,zmin)--(xmax,ymin,zmax)--(xmin,ymin,zmax)--(xmin,ymin,zmin)--cycle),bg);
draw(surface((xmin,ymax,zmin)--(xmin,ymax,zmax)--(xmin,ymin,zmax)--(xmin,ymin,zmin)--cycle),bg);
draw(surface((xmax,ymax,zmin)--(xmax,ymin,zmin)--(xmin,ymin,zmin)--(xmin,ymax,zmin)--cycle),bg);
xaxis3(Label("$x$",MidPoint,align=Y-Z),Bounds(Both,Min),InTicks(Step=1),p=black);
yaxis3(Label("$y$",MidPoint,align=X-Z),Bounds(Both,Min),InTicks(Step=.5),p=black);
zaxis3(Label("$z$",MidPoint,align=X-Y),Bounds(Both,Min),InTicks(Step=2),p=black);
draw(scale(4,4,5)*unitsphere,invisible);
for(real i;i<6.28;i=i+0.05) {
currentprojection=perspective(camera=(2*cos(i),2*sin(i),2.5));
A.add();
save();
}
A.movie(loops=3,delay=50);
你获得此动画
奥格