如何使用canvas_item_set_transform旋转?

How to rotate using canvas_item_set_transform?

我正在尝试复制一个 Sprite 节点并通过 VisualServer 在屏幕上显示它,到目前为止这是我基于 this 示例[=18= 的进展]

ci_rid = VisualServer.canvas_item_create()
VisualServer.canvas_item_set_parent(ci_rid, get_canvas_item())

self.remove_child(sprite_node);
sprite_node.queue_free();

var texture = load(sprite_node.texture.resource_path);
var pos_and_size=Rect2(Vector2(0,0), sprite_node.region_rect.size);

if(sprite_node.region_enabled==true):
    VisualServer.canvas_item_add_texture_rect_region(ci_rid,pos_and_size, texture,sprite_node.region_rect);
    var transform_matrix=Transform2D.IDENTITY;
    
    VisualServer.canvas_item_set_transform(ci_rid,transform_matrix.translated(sprite_node.position-sprite_node.region_rect.size / 2))

但是当我尝试像这样在它自己的轴上复制旋转时:

VisualServer.canvas_item_set_transform(ci_rid,
 transform_matrix.rotated(deg2rad(sprite_node.rotation_degrees)).translated(sprite_node.position-sprite_node.region_rect.size / 2)
) 

它没有给出预期的结果并将整个图像移动到另一个位置

原始精灵节点:

VisualServer 副本:

您可以在删除之前拿走 global_transform

var sprite_transform := sprite_node.global_transform

或者您可以在删除后重建它:

var sprite_transform = global_transform * Transform2D(sprite_node.rotation, sprite_node.position).scaled(sprite_node.scale)

我在这里使用 global_transform 因为该节点曾经是代码 运行 的子节点。所以它的变换是相对于它的。


我真的不知道你的纹理怎么没有错误。这就是我最终采用的方式:

var image:Image = sprite_node.texture.get_data()
var texture_rid := VisualServer.texture_create_from_image(image)

那么region和size是这样处理的:

var texture_size:Vector2 = image.get_size()
var region:Rect2 = sprite_node.region_rect if sprite_node.region_enabled else Rect2(Vector2.ZERO, texture_size)
var pos_and_size := Rect2(region.size * -0.5 if sprite_node.centered else Vector2.ZERO, region.size)

这些是我的 VisualServer 电话:

var ci_rid := VisualServer.canvas_item_create()
VisualServer.canvas_item_set_parent(ci_rid, get_canvas_item())
VisualServer.canvas_item_add_texture_rect_region(ci_rid, pos_and_size, texture_rid, region);
VisualServer.canvas_item_set_transform(ci_rid, sprite_transform)