如何使用godot三维网格



所以我试图在godot中制作一个纸牌游戏,我想使用光线投射在游戏板(刚体)上拖放纸牌。到目前为止,它是有效的,但我的问题是:我如何对齐卡片,这样它们就不会在游戏板外重叠或产生。我已经知道我需要使用网格,但我真的不知道它是如何工作的。

我已经附上了我的代码和我的节点的屏幕截图:

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

您不需要GridMap,如果要使用GridMap,也不是这样。

GridMap的主要用途是设计场景。把它想象成一个3DTileMap。您将有一个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()获得当前的相机。