Godot笔记:用Viewport实现在2D场景中显示3D内容
2019-07-13 本文已影响0人
吃烧烤的老王
引言
Godot说:视口(Viewport)是通往另一个世界的入口。
在学习本教程之前,你可以先阅读一下我翻译的关于视口的官方文档《Godot 视口》对视口概念有一个大体的了解。本教程以官方提供的案例《视口 之 3d in 2d》为基础,手把手教你使用Godot的视口实现在一个2D场景中用独立视口显示一个3D场景。
最终效果如下:

主场景是2D场景,里面有一个顺时针旋转的Godot图标,右边独立视口中显示的是一个3D场景,里面有一个旋转的立方体。
我们先看一下3D场景的实现:

3D场景的根节点是一个Node
节点,其子节点包含1个Camera
,1个名为“Cube3D”的MeshInstance
和2个OmniLight
。注意要勾选Camera
的Current
属性,使其成为该场景的有效摄像机。“Cube3D”上的脚本如下:
extends MeshInstance
func _process(delta):
rotation_degrees.y += delta * 100.0
我们在看一下原始2D场景的实现:

2D场景更为简单,"Player2D"是一个Sprite,其脚本如下:
extends Sprite
func _process(delta):
rotation_degrees += delta * 100.0
小结:从上面我们可以看到,实际上就是两个普通的场景,正如引言中所说:"视口是通往另一个世界的入口"。接下来我们就要使用视口将3D和2D两个场景像平行宇宙一样,显示在一起。

-
添加“画布”
因为我们要把3D场景嵌到2D场景中,所以先在2D场景中添加一个Sprite
命名为“Viewport_Sprite”,它的作用相当于一块“画布”,我们要把来自视口的“另一个世界”的内容绘制在这个“画布”上,才能在这个世界显示出来。 -
添加视口
然后我们要添加今天的主角视口,命名为“Viewport_for_3dScene”,把刚才的那个原始3D场景直接实例化为视口的子场景。将视口的Size
属性设为x
400y
400(默认为0,0),注意将Own World
选项勾选。或者你也可以为视口创建一个World
。这一步的作用就是将视口的子树分离成一个独立的世界。 -
把视口绘制到画布上
脚本实现如下:
extends Viewport
func _ready():
var sprite:Sprite = get_node("../Viewport_Sprite")
sprite.texture = get_texture()
提示:可以看到当前,在编辑器中我们看不到视口中的3D场景,这是因为在视口中的内容只有在运行时的窗口中才可以看到。因此,我们通常会把视口下的子树保存为一个场景来编辑。
FAQ:
- 是不是一定要勾选
Own World
属性?
这是个可选项,如果你不勾选,视口依然显示其子树的内容,但是两个世界并没有隔离开,即物理和光照都会有交互 -
Own World
和创建World
有什么区别?
Own World
仅是为隔离两个世界的快捷选项,而创建World
除了可以隔离以外还可以提供一些渲染方面的高级选项