改变对象的变换,使其父对象与其子对象相匹配

问题描述 投票:0回答:1

为此而疯狂。我试图找到一种方法,以便当我抓取一个对象时,我可以设置该对象的旋转和位置,以便原始对象的父对象的旋转和位置与原始对象的子对象的旋转和位置相匹配,如下所示如果父对象也是原始对象的子对象。 ChatGPT 给了我这段代码,但它根据初始旋转/位置、抓取对象的位置等给出了完全不同的结果。如果这与它有任何关系,它会在每次抓取时重新调整父级。

{
        // Reparent objectA to objectB
        objectA.SetParent(objectB);

        // Calculate the world position and rotation of objectC
        Vector3 objectCWorldPosition = objectC.position;
        Quaternion objectCWorldRotation = objectC.rotation;

        // Calculate the local position and rotation needed for objectA
        Vector3 localPosition = objectA.InverseTransformPoint(objectCWorldPosition);
        Quaternion localRotation = Quaternion.Inverse(objectA.rotation) * objectCWorldRotation;

        // Apply the local position and rotation to objectA to match objectC's world position and rotation
        objectA.localPosition = localPosition;
        objectA.localRotation = localRotation;
    }

这段代码每次都会给出不同的结果,但我只想每次都相同,这样无论你在哪里以及如何抓取原始对象,它在父对象(即手)中看起来都是相同的

我一直通过 ChatGPT 运行相同的提示,它每次都会给出稍微修改的答案,但它们往往都有相同的结果。

c# unity-game-engine rotation position reparenting
1个回答
0
投票

如果有人发现这个并需要帮助,这是我找到的解决方案。仅仅找到旋转的差异并将其应用到对象上还不够。 ChatGPT 说要这样做:

transform.rotation *= parentObject.rotation * Quaternion.Inverse(child.rotation)

但是,这行不通。每次你都会得到随机轮换。我发现的解决方案(在一位出色的专业人士的帮助下)是您需要调整每个轴的旋转,并且由于每次都会更改目标位置,因此您需要在每次旋转移动后调整位置。所以它看起来更像是这样的:

Quaternion rotationOffset = Quaternion.FromToRotation(refUp, handUp);
transform.rotation = rotationOffset * transform.rotation;
// Fix Position
Quaternion rotationOffset = Quaternion.FromToRotation(refForward, handForward);
transform.rotation = rotationOffset * transform.rotation;
// Fix Position
Quaternion rotationOffset = Quaternion.FromToRotation(refRight, handRight);
transform.rotation = rotationOffset * transform.rotation;
// Fix Position

您甚至可能需要重复几次,因为每次调整都会影响最后一次调整,但几次尝试后它就会大致进入正确的位置。我希望这能够有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.