📌  相关文章
📜  godot mouse to world - Go 编程语言 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 15:31:00.535000             🧑  作者: Mango

Godot Mouse to World - 使用Go编程语言

Godot是一个流行的开源游戏引擎,它可以用来创建2D和3D游戏。在Godot中,将鼠标从屏幕坐标转换为世界坐标是非常有用的,这可以用于玩家控制角色的移动以及其他交互。

在这个教程中,我们将使用Go编程语言来实现这个功能。我们将介绍如何使用Godot中的输入系统,如何将鼠标从屏幕坐标转换为世界坐标,以及如何在Godot中使用Go编程语言。

前置条件

在开始本教程之前,需要完成以下准备工作:

  • 安装Godot。
  • 了解Go编程语言。
Godot输入系统

Godot的输入系统非常灵活,可以通过添加输入处理代码或使用Godot的内置输入脚本语言来处理各种输入设备。在这个例子中,我们将使用内置的Node._input()方法来处理鼠标输入。

下面是一个简单的输入处理函数,可以检测鼠标左键是否按下:

func _input(event *godot.InputEvent) {
    if event.IsAction("mouse_left") {
        if event.IsPressed() {
            // 左键按下
        } else {
            // 左键松开
        }
    }
}

在这个函数中,我们检测鼠标左键是否按下。如果它是被按下的,我们可以执行其它操作。如果它被释放了,我们可以进行一些其他的操作。我们将在下一节中讨论如何将鼠标坐标从屏幕坐标转换为世界坐标。

屏幕坐标和世界坐标

在Godot中,屏幕坐标是指用户界面中鼠标的x,y坐标。但是,当我们需要将鼠标坐标转换为3D世界坐标时,我们需要知道一些其他的信息:

  • 摄像机:您需要知道在哪一个摄像机下进行该转换。
  • 视口大小:视口大小(即屏幕分辨率)是必需的。这将用于将屏幕坐标转换为百分比位置。
  • 鼠标位置:鼠标在屏幕上的非常规百分比位置。

有了这些信息,我们可以使用以下代码将屏幕坐标转换为世界坐标:

func screenToRay(screen_position godot.Vector2) godot.Vector3 {
    camera := GetNode("Camera")  // 获取摄像机节点
    viewport_rect := camera.GetViewport().GetVisibleRect() // 获取视口的可见矩形
    viewport_size := camera.GetViewport().GetSize() // 获取视口的大小
    mouse := screen_position.Clamped(viewport_rect.Position, viewport_rect.Size)  // 从屏幕坐标转换到视口百分比坐标

    // 将屏幕坐标转换为世界坐标
    camera_transform := camera.GetGlobalTransform()
    camera_projection := camera.GetCameraProjection()
    ray_origin := camera_transform.origin
    ray_direction := camera_projection.Unproject(mouse, ray_origin)

    return ray_direction
}

在这个函数中,我们从Godot到屏幕百分比坐标中计算了光线。我们使用Viewports和CameraTransforms来将它们从屏幕坐标转换为世界坐标。

因为这个函数将从屏幕坐标转换为CameraProjection空间(这是在摄像机的正前方的空间),我们最终仍然需要将CameraProjection空间转换为WorldSpace坐标。这可以通过在CameraTransform中将所有这些矩阵组合在一起来完成。

在Godot中使用Go

现在您已经知道如何将鼠标坐标从屏幕坐标转换为世界坐标,接下来将介绍如何在Godot中使用Go编写代码。

由于Godot使用GDScript作为内置脚本语言,因此本教程中的示例将使用Godot的ProceduralScript,它允许您在Godot中编写Go代码。

在下面的示例中,我们将创建一个新的Node,并将其绑定到2D/3D场景中的MeshInstance上。这将允许我们将Node附加到场景的对象上,并在Godot中检测鼠标输入。

package main

import (
    "github.com/ShadowApex/godot-go/godot"
    "github.com/ShadowApex/godot-go/godot/demos/common"
)

func init() {
    godot.RegisterClass("MouseTo3D", "Node2D", &MouseTo3D{})
}

type MouseTo3D struct {
    godot.Node2D

    model godot.MeshInstance
}

func (m *MouseTo3D) _Ready() {
    m.model = GetNode("/root/Main/Model").(godot.MeshInstance)
}

func (m *MouseTo3D) _Input(event *godot.InputEvent) {
    if event.IsAction("mouse_left") && event.IsPressed() {
        mouse_position := GetViewport().GetMousePosition()
        ray_direction := screenToRay(mouse_position)

        mesh_intersection := common.MeshIntersection(m.model, ray_direction)
        if mesh_intersection.Collides {
            translation := mesh_intersection.Position
            translation.Z = 0 // 确保将其置于场景的平面

            // 创建新节点
            var node godot.Node2D
            godot.ClassDB.New("Node2D", &node)

            // 将其绑定到我们刚刚的条目
            node.SetPosition(translation)
            AddChild(&node, true)
        }
    }
}

在我们的示例中,我们创建了一个新的NodeTo3D类。我们使用godot.RegisterClass注册了该类,并将其绑定到Node2D Base类。

类的_init()函数初始化了我们的实例,我们查找了场景中的Model,并将其绑定到模型属性。在_input()函数中,我们使用我们定义的screenToRay()函数将输入事件转换为射线。

当用户点击左键时,我们使用射线来进行MeshIntersection。如果射线与模型发生碰撞,我们就在场景的交点处创建一个新的Node。

总结

本教程演示了如何使用Go编程语言将鼠标坐标从屏幕坐标转换为世界坐标。我们展示了如何使用Godot的内置输入系统,以及如何使用Godot的ProceduralScript来编写Go代码。

我们还展示了如何将屏幕坐标转换为Go数据类型,并将它们与Godot的摄像机和视图相关联。

参考资料