【问题标题】:How to use godot 3d grid?如何使用godot 3d网格?
【发布时间】:2021-11-14 08:00:47
【问题描述】:

所以我正在尝试在 godot 中制作纸牌游戏,并且我想使用 raycast 将纸牌拖放到游戏板上(刚体)。到目前为止它正在工作,但我的问题是:我怎样才能对齐卡片,这样它们就不会重叠或在游戏板之外产生。我发现我需要使用网格,但我真的不知道它是如何工作的。

我已附上我的代码和我的节点截图:

func place():
var rayOrigin = Vector3()
var rayEnd = Vector3()
var cardbase = preload("res://Cards/CardBase.tscn")
var card = preload("res://Cards/3dcard.tscn")
var cardscript = preload("res://Cards/3dcard.gd")
var camera = get_tree().get_root().find_node("Camera", true, false)
if Input.is_action_just_released("leftclick") && cardinhand == 1 :
    var space_state = get_world().direct_space_state
    var mouse_position = get_viewport().get_mouse_position()
    rayOrigin = camera.project_ray_origin(mouse_position)
    rayEnd = rayOrigin + camera.project_ray_normal(mouse_position) * 2000000000
    var intersection = space_state.intersect_ray(rayOrigin, rayEnd)
    if not  intersection.empty(): 
        board = 1
        var addcard = card.instance()
        addcard.Cardname = cardnm
        add_child(addcard)
        addcard.translation = Vector3(intersection.position.x*1.01,intersection.position.y,intersection.position.z)
    cardinhand = 0

https://i.stack.imgur.com/UnPPb.png

【问题讨论】:

    标签: 3d grid godot


    【解决方案1】:

    您不需要GridMap,如果您打算这样做,您将不会使用GridMap

    GridMap 的主要用途是设计场景。将其视为 3D TileMap。您将有一个 MeshLibrary(与 TileSet 对应)使用它将网格放置在网格的不同单元格中。


    不要使用GridMap,而是这样做:

    • 将位置转换为棋盘的本地空间。
    • 进行网格调整(这是除以单元格大小,四舍五入,然后再次乘以单元格大小)。
    • 然后将位置转换回全局空间。
    • 将卡片放在该全局位置。

    我假设你不需要担心方向。如果你这样做,那么我建议创建一个 Basis,然后从 Basis 创建一个 Transform

    类似这样的:

    var grid_size := Vector3(2.0, 2.0, 2.0)
    
    # ...
    
    # check the ray collided with the rigid_body board
    if intersection.collider == rigid_body:
    
        # ...
    
        addcard.global_transform.origin = rigid_body.to_global(
            grid_size * (
                rigid_body.to_local(intersection.position) / grid_size
            ).floor()
        )
    

    请注意,我假设一个变量 rigid_body 包含对板的引用。


    顺便说一句,你在做3D,你可以用get_viewport().get_camera()获取当前相机。

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 2022-08-03
      • 2011-10-24
      • 2022-12-11
      • 2018-06-10
      • 2020-09-28
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多