世上无难事,只要肯放弃。
支线系列是独立于基础之外的内容,会引用一些外部平台大佬的内容,感觉有困难的同学可以暂时不(fang)看(qi)。
本篇内容将讲解模拟摄像机和3D图层。请善用官方文档的搜索功能,能解决大部分疑问。
先放原链接:
3D camera motion, Action Editor, Transform and Image Viewerlemmasoft.renai.us最后一版代码下载链接如下:
https://lemmasoft.renai.us/forums/download/file.php?id=47508lemmasoft.renai.us第一个问题:为什么是模拟摄像机而不是真正的摄像机?
答:模拟摄像机的活动受限,镜头永远平行于z轴。所以图片的形变都是基于z轴方向与摄像机的距离关系,计算一个缩放大小而已。简单来说,矩形的图片永远是矩形,而不会变成梯形。真正的3D摄像机没有这种限制。有兴趣请搜索“透视原理”,可以了解到两种摄像机的差异。而且Ren'Py也不支持导入3D建模。好像Pygame是支持的,Ren'Py没有加入可能是考虑到VN不需要这么复杂的功能吧。
第二个问题:这套东西用于解决什么问题?
答:Ren'Py在可视化设计方面一直是非常薄弱的。akakyouryuu写的这套弥补了一些短板。顺便一提,作者好像是日本人,代码注释都是日文(akakyouryuu对应的汉字是“赤恐竜”)。使用这套系统就可以类似视频编辑软件一样制作动画效果了。所有功能在readme中有描述,这里简单翻译了下。
`config.developer` 配置项为True时,快捷键shift+P就可以打开Action Editor。
Action Editor的功能如下:
使用条(bar)查看和调整图像的变换特性、镜头坐标、3D图层深度。
使用鼠标直接调整镜头的x和y坐标。
使用鼠标滚轮直接调整镜头的z坐标。
生成的脚本中的值可以直接编辑,并不需要回到原来的地方再调整。
单独时间线实现对关键帧的增、删、改。
设置完动画效果后生成脚本并置入剪贴板,可以直接粘贴到Ren'Py(v6.99以上)脚本中。
尤其是最后一句,肥肠实用。
第三个问题:如何使用模拟摄像机和3D图层等功能?
答:点击开头的第2个链接,下载 camera.zip 文件,把压缩包里的内容解压到自己的目录下。
修改options.rpy文件,添加一句:
define config.developer = True
这样就可以在启动工程后使用shift+P。
提前设置一些图层为3D图层。如果不做设置,则默认“master”为唯一3D图层。
options.rpy文件中修改配置项:
define config.layers = ['master', 'background', 'middle', 'forward', 'transient', 'screens', 'overlay']
使用 register_3d_layer 函数将需要的图层注册为3D图层。如果不注册,则“master”图层自动成为唯一3D图层。在任意脚本中配置:
init python:
register_3d_layer('background', 'middle', 'forward')
注意,background、middle、forward这3个图层只是样例中定义的,并不是强制要求。创作者可以根据自己的需求定义更少或更多图层。
样例代码:
label start:
# 重置镜头和图层位置,并允许保存图层位置。
$ camera_reset()
# 设置图层与镜头之间的实际距离。
$ layer_move("background", 2000)
$ layer_move("middle", 1500)
$ layer_move("forward", 1000)
scene bg onlayer background
# WARNING:无论该图像显示在哪个图层,‘scene’命令都将重置图像的深度值。
# 确认使用‘scene’命令时需要重置图像深度。
$ layer_move("background", 2000)
# 这里的A和B是自定义的可视组件。
show A onlayer middle
show B onlayer forward
with dissolve
"在1秒内将镜头移动到(1800, 0, 0)。"
$ camera_move(1800, 0, 0, 0, 1)
"在5秒内将镜头移动到(0, 0, 1600)。"
$ camera_move(0, 0, 1600, 0, 5)
"立即将镜头移动到(0, 0, 0)。"
$ camera_move(0, 0, 0)
"Rotates the camera 180 degrees in 1 second.""
"在1秒内将镜头旋转180度。"
$ camera_move(0, 0, 0, 180, 1)
'Rotates the camera -180 degrees in 1 second and subsequently moves the camera to (-1800, 0, 500) in 1.5 seconds'
"在1秒内将镜头旋转-180度,然后在1.5秒内将镜头移动到(-1800, 0, 500)。"
$ camera_moves( ( (0, 0, 0, 0, 1, 'linear'), (-1800, 0, 500, 0, 1.5, 'linear') ) )
"将镜头在(-1800, 0, 500)和(0, 0, 0)之间线性平移。从前者移动到后者耗时0.5秒,从后者移动到前者耗时1秒。循环以上动作直到被其他事件打断。"
$ camera_moves( ( (0, 0, 0, 0, .5, 'linear'), (-1800, 0, 500, 0, 1, 'linear') ), loop=True)
新建工程并添加两个可视组件即可看到效果。
camera_move、camera_moves、layer_move、layer_moves和all_moves不能在一次交互中同时执行。
如果某次交互中包含多个镜头运动,只有最后一个能看到效果,其他的都会瞬时完成。
scene和hide语句使用master图层或者指定的图层。如果优先使用3D图层,代码格式如下(原文没有对齐可能会报错,我调整了下):
init -1 python hide:
def hide(name, layer='master'):
for l in _3d_layers:
if renpy.showing(name, l):
renpy.hide(name, l)
break
else:
renpy.hide(name, layer)
config.hide = hide
def scene(layer='master'):
renpy.scene(layer)
for l in _3d_layers:
renpy.scene(l)
config.scene = scene
运行之后按shift+P进入的画面如图:
在这个界面用鼠标拖动摄像机图标即可移动摄像机的x和y坐标,滚动鼠标滚轮调整设想的z坐标。其他功能……我们下次再说……
预告部分:会续一篇各个菜单功能的详解。