美文网首页
Godot笔记:用Viewport实现在2D场景中显示3D内容

Godot笔记:用Viewport实现在2D场景中显示3D内容

作者: 吃烧烤的老王 | 来源:发表于2019-07-13 19:58 被阅读0次

引言
Godot说:视口(Viewport)是通往另一个世界的入口。
在学习本教程之前,你可以先阅读一下我翻译的关于视口的官方文档《Godot 视口》对视口概念有一个大体的了解。本教程以官方提供的案例《视口 之 3d in 2d》为基础,手把手教你使用Godot的视口实现在一个2D场景中用独立视口显示一个3D场景。

最终效果如下:

最终效果

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

我们先看一下3D场景的实现:

3dscene.png

3D场景的根节点是一个Node节点,其子节点包含1个Camera,1个名为“Cube3D”的MeshInstance和2个OmniLight。注意要勾选CameraCurrent属性,使其成为该场景的有效摄像机。“Cube3D”上的脚本如下:

extends MeshInstance
​
func _process(delta):
 rotation_degrees.y += delta * 100.0

我们在看一下原始2D场景的实现:

2dscene.png

2D场景更为简单,"Player2D"是一个Sprite,其脚本如下:

extends Sprite
​
func _process(delta):
 rotation_degrees += delta * 100.0

小结:从上面我们可以看到,实际上就是两个普通的场景,正如引言中所说:"视口是通往另一个世界的入口"。接下来我们就要使用视口将3D和2D两个场景像平行宇宙一样,显示在一起。

final.png
  • 添加“画布”
    因为我们要把3D场景嵌到2D场景中,所以先在2D场景中添加一个Sprite命名为“Viewport_Sprite”,它的作用相当于一块“画布”,我们要把来自视口的“另一个世界”的内容绘制在这个“画布”上,才能在这个世界显示出来。
  • 添加视口
    然后我们要添加今天的主角视口,命名为“Viewport_for_3dScene”,把刚才的那个原始3D场景直接实例化为视口的子场景。将视口的Size属性设为x400y400(默认为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除了可以隔离以外还可以提供一些渲染方面的高级选项

相关文章

网友评论

      本文标题:Godot笔记:用Viewport实现在2D场景中显示3D内容

      本文链接:https://www.haomeiwen.com/subject/olnmkctx.html