所以我试图在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()
获得当前的相机。