找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6924|回复: 0

[转载] Ren'Py引擎从入门到放弃(支线4)——假装3D的模拟摄像机和图层

[复制链接]
发表于 2019-5-11 16:01:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 BuErShen 于 2019-5-11 15:40 编辑

Ren'Py引擎从入门到放弃(支线4)——假装3D的模拟摄像机和图层

世上无难事,只要肯放弃。

支线系列是独立于基础之外的内容,会引用一些外部平台大佬的内容,感觉有困难的同学可以暂时不(fang)看(qi)。

本篇内容将讲解模拟摄像机和 3D图层。请善用官方文档的搜索功能,能解决大部分疑问。

先放原链接:3D camera motion, Action Editor, Transform and Image Viewer - lemmasoft.renai.us

最后一版代码下载链接如下:https://lemmasoft.renai.us/forums/download/file.php?id=47508

第一个问题:为什么是模拟摄像机而不是真正的摄像机?

答:模拟摄像机的活动受限,镜头永远平行于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图层深度。

使用鼠标直接调整镜头的 xy坐标。

使用鼠标滚轮直接调整镜头的z坐标。

生成的脚本中的值可以直接编辑,并不需要回到原来的地方再调整。

单独时间线实现对关键帧的增、删、改。

设置完动画效果后生成脚本并置入剪贴板,可以直接粘贴到 Ren'Py(v6.99以上)脚本中。

尤其是最后一句,肥肠实用。

第三个问题:如何使用模拟摄像机和3D图层等功能?

答:点击开头的第2个链接,下载 camera.zip 文件,把压缩包里的内容解压到自己的目录下。

修改 options.rpy 文件,添加一句:
[RenPy] 纯文本查看 复制代码
define config.developer = True

这样就可以在启动工程后使用 shift+P

提前设置一些图层为3D图层。如果不做设置,则默认“master”为唯一3D图层。

options.rpy文件中修改配置项:
[RenPy] 纯文本查看 复制代码
define config.layers = ['master', 'background', 'middle', 'forward', 'transient', 'screens', 'overlay']

使用 register_3d_layer 函数将需要的图层注册为3D图层。如果不注册,则“master”图层自动成为唯一3D图层。在任意脚本中配置:
[RenPy] 纯文本查看 复制代码
init python:
    register_3d_layer('background', 'middle', 'forward')

注意,backgroundmiddleforward这3个图层只是样例中定义的,并不是强制要求。创作者可以根据自己的需求定义更少或更多图层。

样例代码:
[RenPy] 纯文本查看 复制代码
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_movecamera_moveslayer_movelayer_movesall_moves不能在一次交互中同时执行。

如果某次交互中包含多个镜头运动,只有最后一个能看到效果,其他的都会瞬时完成。

scenehide语句使用 master图层或者指定的图层。如果优先使用3D图层,代码格式如下(原文没有对齐可能会报错,我调整了下):
[RenPy] 纯文本查看 复制代码
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进入的画面如图:

运行之后按shift+P进入的画面如图.jpg

在这个界面用鼠标拖动摄像机图标即可移动摄像机的xy坐标,滚动鼠标滚轮调整设想的z坐标。其他功能……我们下次再说……

预告部分:会续一篇各个菜单功能的详解。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-4-16 18:14 , Processed in 0.088176 second(s), 16 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表