在保持玩家全局方向的同时改变场景,3d

问题描述

当玩家触碰场景A的起始传送盒时,场景从场景A切换到场景B,并降落在场景B的落地传送盒上。 我希望玩家在着陆时面向相同的方向,就像他开始前往门户时一样。 我不知道如何追踪它的 vector3 变换。 感谢您提前提供帮助。

解决方法

自动加载(单例)在场景变化中幸免于难。因此,您可以使用它们来存储在场景变化时必须保留的信息。

要创建自动加载,请转到“项目”菜单,然后选择“项目设置”选项,打开“项目设置”对话框,然后转到“自动加载”选项卡。

创建 - 或使用现有的 - 自动加载脚本,该脚本将保存您需要跟踪跨场景更改的任何变量。 例如,您可以将玩家得分、生命数和类似变量放在那里。

在这种情况下,您需要玩家头像的方向。


由于我们谈论的是 3D,我假设玩家头像是一个 Spatial(或派生的)节点。此外,我将假设我们只想保留旋转。不是缩放,或任何其他转换。严格来说只是旋转。


仅旋转

你可以得到一个 Quat 代表这样的方向:

$Avatar.Transform.basis.get_rotation_quat()

并在更改场景之前将其存储在您的自动加载中:

AutoloadName.orientation = $Avatar.Transform.basis.get_rotation_quat()

然后,在准备好新场景后,您可以检索并设置它,这需要创建一个新的 Transform


我们可以像这样将我们存储的旋转与我们在目的地的 Basis 结合起来:

var quat = AutoloadName.orientation
var basis = $Avatar.Transform.basis
var new_basis:Basis = Basis(quat.xfrom(basis.x),quat.xfrom(basis.y),quat.xfrom(basis.z))
$Avatar.Transform = Transform(new_basis,$Avatar.Transform.origin)

明确地说,我在该代码中所做的是创建一个新的 Transform,它将保留它的 origin(以及它的翻译),并带有一个旋转的基础 em> 由存储的 Quat。所以它实际上会结合旋转。


或者,我们可以从 Quat 创建一个新的基础:

var quat = AutoloadName.orientation
$Avatar.Transform = Transform(Basis(quat),$Avatar.Transform.origin)

这也意味着目的地的任何缩放都会丢失。


好吧,我们可以读取目的地的缩放比例,然后再次缩放:

var scale = $Avatar.Transform.basis.get_scale()
var quat = AutoloadName.orientation
$Avatar.Transform = Transform(Basis(quat).scaled(scale),$Avatar.Transform.origin)

这样它就会有目的地的缩放,以及你存储的旋转。 请注意,基础可以表示缩放和旋转以外的变换(例如倾斜)。


旋转和缩放

如果可以保留缩放等,但不能保留翻译,您可以简单地存储basis

AutoloadName.basis = $Avatar.Transform.basis

并设置它:

$Avatar.Transform = Transform(AutoloadName.basis,$Avatar.Transform.origin)

完全变换

当然,如果您也想保留翻译,您只需存储 Transform

AutoloadName.transform = $Avatar.Transform

并设置它:

$Avatar.Transform = AutoloadName.transform