Asymptote 中的相机缩放和图片大小

Asymptote 中的相机缩放和图片大小

我正在尝试在 Asymptote 中制作涉及移动无限表面的 3D 动画。我想设置一个“稳定相机”,这样无论表面实际延伸到屏幕多远,单位球相对于屏幕的大小始终相同。

然而,在投影之后,Asymptote 似乎会自动计算一个边界框,其中包括一切显示的,然后将图片裁剪到该框中。如果更改“缩放”参数(例如将其设置为 10),则会得到一个该大小的 1/10 的边界框;但是,它仍然取决于屏幕外发生的情况。

有没有办法指定具有固定视口的投影?

这是一个最小的工作示例:

unitsize(100);
import three;
import solids;
import animation;

animation A;

int n = 50; //number of steps
int m = 10; //step at which we reach "normal" size
for(int i=0; i<=n; ++i) {
  save();
  surface sphere = (scale3(i/m) * unitsphere);
  draw(sphere, gray+opacity(0.5));
  A.add();
  restore();
}

A.movie(0,n);

当我编译它时,球体首先以看似随机的方式在屏幕上移动(它甚至没有居中!为什么?),然后受到屏幕边界的约束。

我希望球体从中心开始,在第 10 帧时到达屏幕边界(同时在所有侧面),然后继续越过屏幕边界增长(这样最后只有球体的一小部分可见。)

一个可能的解决方法是写

draw(circle(O,100,camera), invisible);

然后设置 zoom=100。但是这看起来不太干净,渲染需要很长时间,并且取决于确保没有物体会超出不可见的圆圈。

答案1

测试和重新测试的时间有点太长了。perspective有一些选项:angle,,,。showtargetcenterautoadjust

currentprojection=perspective(6,6,6,angle=15,autoadjust=false, showtarget=false,center=true);

所有球体/缩放都绘制得很好,但在动画中,在 i=40 处出现错误消息:相机太关闭。

所以我尝试了

currentprojection=perspective(6,6,6,angle=15,showtarget=false,center=true);

看起来没问题。你只需调整角度,在 i=10 时得到你想要的结果。但我不知道是否有可能在 i=10 时达到“命中屏幕边界”并达到 i=50 而不出现“摄像头关闭太快”的错误消息。

奥格

相关内容