Godot中鼠标点击3D对象

Godot中鼠标点击3D对象

方法一:调用RigidBody3D中的input_event事件

RigidBody3D中有信号input_event可以接受鼠标的输入,用这个信号可以处理点击事件。

 

具体用法如下:

  1. 新建一个demo场景
  2. 连接上信号input_event
  3. 代码如下:判断是否有鼠标点击事件即可。

 

public void _on_rigid_body_3d_input_event(Camera3D camera, InputEvent inputevent, Vector3 postion, Vector3 normal, int shape_idx)
{
    if(inputevent is InputEventMouseButton)
    {
        if((inputevent as InputEventMouseButton).IsPressed())
        {
            GD.Print("Click Ball");
        }
    }
}

 

 

 

方法二:调用PhysicsRayQuery

从camera到鼠标点击的位置发射一条射线,检查与哪些对像有碰撞,既获得相应的对像并处理相关的事件。

public override void _PhysicsProcess(double delta)
{
    base._PhysicsProcess(delta);

    var mousepostion = GetViewport().GetMousePosition();

    # 相机发射射线的开始点与结束点
    var rayOrigin = c3d.ProjectRayOrigin(mousepostion);
    var rayEnd = c3d.ProjectRayNormal(mousepostion)*100000;

    # 检查有哪些碰撞
    var query = PhysicsRayQueryParameters3D.Create(rayOrigin, rayEnd);
    var spaceState = GetWorld3D().DirectSpaceState;
    # 在这里可以可以找到碰撞点
    var results = spaceState.IntersectRay(query);

    if(results.Count>0)
    {
        # 可以找到碰撞对像并进行操作
        var mi3 = GetNode<MeshInstance3D>("RigidBody3D/MeshInstance3D");
        var material = mi3.GetActiveMaterial(0);
        material.Set("albedo_color",new Color(255,0,0));
    }
    else
    {
        var mi3 = GetNode<MeshInstance3D>("RigidBody3D/MeshInstance3D");
        var material = mi3.GetActiveMaterial(0);
        material.Set("albedo_color",new Color(0,255,0));
    }
}

 

 

posted @ 2024-01-21 16:27  酱_油  阅读(326)  评论(0编辑  收藏  举报