Skip to content

相机

相机是 VN 的关键元素,通过将相机放入场景中,我们得以确立玩家的观察视角(Viewport)与视锥体范围,从而决定了哪些场景内容会被投影为最终画面。

即使不进行任何注册,ShxNovel 也会自动生成一个默认的正交相机,被命名为 main。在默认情况下,这个相机已经被添加到 main 场景中。

在脚本中,可以使用 camera 函数来使用在 World 中注册的相机。

const view = camera("co_main");
camera("co_main");
  • 这里的 co 前缀表明这是一个正交相机(Orthographic);
  • 类似地 cp 前缀表明这是一个透视相机(Perspective);
  • main 则是在 World 中定义的名称。
const view = camera("co_main");
  • camera 函数将返回一个场景句柄,在这个示例中,我们将它赋值给 view 变量。

instant 是立即发生的动效(不会产生动画)。

view.instant(p => {});

animate 是一个动效,它会产生动画。

view.animate(p => {
p.duration(1000);
p.ease("none");
});
  • 特有的 duration 指令,用于设置动效的时长;
  • 特有的 ease 指令,用于设置动效的缓动函数
  • 此外还有 通用指令 可以使用。

这里的通用指令,指的是 instantanimate 通用的指令。

下面的代码仅以 animate 为例, 在其他动效内的用法完全一致。

应用位置变换。未被修改的属性将保持原值。

view.animate(p => {
p.x(100);
p.y(100);
p.z(0);
p.pos(100, 100);
p.pos(100, 100, 0);
});

应用旋转变换。使用欧拉角(Euler Angles)控制对象的姿态。未被修改的属性将保持原值。

  • x (俯仰/Pitch): 效果形如点头。物体会绕着横向轴旋转。
  • y (偏航/Yaw): 效果形如摇头。物体会绕着纵向轴旋转。
  • z (翻滚/Roll): 效果形如侧翻。物体会绕着视线方向旋转。
// 单位为角度
view.animate(p => {
p.rotate({ x: 0, y: 0, z: 60 });
});

zoom 用于缩放相机视口,类似于相机的数码变焦,仅放大画面,不改变透视关系。

view.animate(p => {
p.zoom(0.5);
p.zoom(1.5);
});
view.animate(p => {
p.timelabel("enter"); // 设置时间轴标签
});

关于 timelabel,请参阅 动效时间轴