乐高风格分屏相机Godot

时间:2018-10-08 18:34:39

标签: godot

我想让lego style splitscreen camera具有无缝过渡。

任何人都有创建这样的东西的经验吗?我考虑过创建一个普通摄像机,然后为第二个播放器创建另一个摄像机,默认情况下该摄像机不可见。然后,当我想显示它时,我会画一个三角形来分割屏幕并将其纹理设置为2号相机视图。

我找到了this Unity implementation,但是我无法在Godot中实现它。我设法用它自己的相机创建了第二个视口,但是由于某种原因,第二个相机的视图没有显示任何内容。我认为问题在于第二视口的世界与主视口不同。

可以找到源代码here

2 个答案:

答案 0 :(得分:3)

我刚刚建立了一个玩具项目来进行测试,结果比预期的要简单。

这里是该过程的概述,然后将跟随代码示例。

  1. 添加一个主摄像头
  2. 以及带有树的辅助摄像机:“控制”>“视口”>“摄像机”
  3. 使用控件使用draw_ * api绘制分屏的形状
  4. 向Control添加一个着色器,以获取纹理并在SCREEN_UV处绘制
  5. 从视口获取视口纹理
  6. 每帧将视口纹理传递到Control着色器。
  7. 通过对动画进行动画处理并重绘Control形状来使拆分动画。

我不确定如何做边框。

要进行拆分连接,您可能必须将控件的形状按边框的粗细移动,然后在摄像机相互靠近时缩小边框。使用玩家之间的距离来计算边框宽度。

两个玩家之间的边框也呈一定角度,因此在对形状进行动画处理时,您将希望使用该角度。这将使视口的连接更加平滑。

控制代码:

extends Control

func _draw():
    # in this case animate tl and bml to get the 
    # rotating split like effect in the lego game
    var tl = Vector2()
    var tr = rect_size
    tr.y = 0
    var br = rect_size
    var bml = rect_size
    bml.x /= 2.0
    draw_polygon([tl, tr, br, bml, tl], [Color(), Color(), Color(), Color(), Color()], [])

func _process(d):
    material.set_shader_param('viewport', $Viewport.get_texture())

着色器代码:

shader_type canvas_item;

uniform sampler2D viewport;

void fragment(){
    COLOR=texture(viewport, SCREEN_UV);
}

我希望这可以帮助您入门!

答案 1 :(得分:0)

这是一个复杂的效果,有很多部分,因此请注意。

我发现最简单的方法是用视口和相机创建一个单独的场景,这将是您的主要场景,然后在其下添加游戏场景,如下所示:

Spatial
    Viewport1
        Camera1
    Viewport2
        Camera2
    GameScene

然后,您应该能够使用着色器材质制作一个ColorRect并从每个视口发送纹理:

shader_type canvas_item;
render_mode unshaded, cull_disabled;

uniform sampler2D viewport1;
uniform sampler2D viewport2;

void fragment() {
    vec3 view1 = texture(viewport1, UV).rgb;
    vec3 view2 = texture(viewport2, UV).rgb;

    vec3 col = vec3(0);

    // mix them in a satisfying way depending on distance and angle between cameras
    // float mixVal = <your formula here>
    // col = mix(view1, view2, mixVal)

    COLOR = vec4(col, 0.0); // this may not work in Godot shaders
}

这是一个很好的入门指南: https://docs.godotengine.org/en/3.1/tutorials/viewports/using_viewport_as_texture.html