我正在尝试在 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
,,,。showtarget
center
autoadjust
和
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 而不出现“摄像头关闭太快”的错误消息。
奥格