unity3d 与创建对象的相对位置问题

wz1wpwve  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(160)

我有一个带有用户控制器化身、四元曲面1、另一个化身和另一个四元曲面的Unity项目。我正尝试将我在VR中的移动复制到我的玩家角色相对于创建的曲面的化身表示上。例如,如果我移动到我创建的曲面的左侧,那么我的化身的表示也应该移动到它自己的曲面的左侧。类似地,如果我指向我的曲面的左上角,那么我的表示也应该指向它自己的曲面的左上角。
我通过Map化身的父对象(玩家1)相对于我的四边形曲面的位置和旋转来实现这一点。从那里,我将位置和旋转值投影到化身的表示(玩家2)相对于其自身曲面的父对象上。之后,表示的每个部分(头部、左手、右手)都被更新以匹配玩家控制的化身的部分的局部位置。
一般来说,我的化身的移动和整体位置/旋转都被正确地Map了。然而,当我试图更精确时,我开始遇到问题(例如触摸表面的角。)在该场景中,我将触摸角而我的化身表示将触摸区域附近,但不是完全在角落里。2需要注意的是,两个表面都有相同的比例值。3下面是我用来将我的动作Map到化身上的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PuppetMovement : MonoBehaviour
{

    //Player Variables
    public GameObject Player1;
    public GameObject Player1Head;
    public GameObject Player1LeftHand;
    public GameObject Player1RightHand;
    
    //Representation Variables
    public GameObject Player2;
    public GameObject Player2Head;
    public GameObject Player2LeftHand;
    public GameObject Player2RightHand;
    
    //Surface Variables
    public GameObject Surface1;
    public GameObject Surface2;

    // Update is called once per frame
    void Update()
    {
        Vector3 playerRelativeToSurface = Surface1.transform.InverseTransformPoint(Player1.transform.position);
        
        Quaternion playerRotationRelativeToSurface = Player1.transform.rotation * Quaternion.Inverse(Surface1.transform.rotation);
        Player2.transform.rotation = Surface2.transform.rotation * playerRotationRelativeToSurface ;
        
        Vector3 rotatedDirection = Surface2.transform.rotation * playerRelativeToSurface;
        
        Player2.transform.position = rotatedDirection + Surface2.transform.position;

        Player2Head.transform.localPosition = Player1Head.transform.localPosition;
        Player2Head.transform.localRotation = Player1Head.transform.localRotation;
        
        Player2LeftHand.transform.localPosition = Player1LeftHand.transform.localPosition;
        Player2LeftHand.transform.localRotation = Player1LeftHand.transform.localRotation;
        
        Player2RightHand.transform.localPosition = Player1RightHand.transform.localPosition;
        Player2RightHand.transform.localRotation = Player1RightHand.transform.localRotation;
        
    }
}

这是玩家控制的化身的视图。正如你所看到的,右边的控制器正在触摸右上角。

这就是代表性化身的样子。它在一般区域,但不是我触摸我的表面的精确位置。
我将感谢任何帮助解决这个问题。谢谢!

6jjcrrmo

6jjcrrmo1#

我不能确切地告诉你的代码在哪里失败,除非它没有考虑伸缩性。
对象的反向转换

Vector3 playerRelativeToSurface = Surface1.transform.InverseTransformPoint(Player1.transform.position);

实际上就是

Player2.transform.position = Surface2.transform.TransformPoint(playerRelativeToSurface);

小旁注:如果直接使用Transform作为字段

public Transform Player1;
public Transform Player1Head;
public Transform Player1LeftHand;
public Transform Player1RightHand;
// ...

你可以在任何地方摆脱X11M1N1X,这让IMHO变得更干净一点。

相关问题