Estou tentando imitar uma transformação 3D em um ambiente 2D e, portanto, estou tentando fazer sozinho a parte 3D dos cálculos
Para referência, usei um Node3D para verificar se meu método de cálculo está correto
func calc_transform_3d(position_3d:Vector3, rotation_3d:Vector3, scale_3d:Vector3 ) -> Transform3D:
var transform_3d := Transform3D(
Basis.from_euler(rotation_3d).scaled(scale_3d),
position_3d
)
return transform_3d
func _ready():
var node_3d:Node3D = $Node3D
var custom_transform := calc_transform_3d(node_3d.position, node_3d.rotation, node_3d.scale)
print(custom_transform == node_3d.transform) # returns false
Mas o calc_transform_3d()
método fornece a saída errada (para sua informação, não é um erro de ponto flutuante que verifiquei)
Então , como calcular um Transform3D (semelhante a como um Node3D o calcula) dado apenas position
e ?rotation
scale
Sua rotação e escala são feitas nesta ordem: S*R*INPUT. Se você transformou um cubo dessa maneira, poderá facilmente obter uma forma de diamante distorcida.
Inverta a ordem e use escala local em vez de escala global: R * S * INPUT, (isso significa que seu cubo se tornará apenas um prisma retangular com escala). Então escreva sua função algo assim: