leaflet 鼠标移动到图层时变_Ren'Py引擎从入门到放弃(支线4)——假装3D的模拟摄像机和图层...

cf9b366ea7b5fb20d8fff5072ea22b8c.png

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

支线系列是独立于基础之外的内容,会引用一些外部平台大佬的内容,感觉有困难的同学可以暂时不(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​lemmasoft.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进入的画面如图:

b32986d28734a6464174fb37619774e7.png

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值