我有一个带有用户控制器化身、四元曲面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;
}
}
这是玩家控制的化身的视图。正如你所看到的,右边的控制器正在触摸右上角。
这就是代表性化身的样子。它在一般区域,但不是我触摸我的表面的精确位置。
我将感谢任何帮助解决这个问题。谢谢!
1条答案
按热度按时间6jjcrrmo1#
我不能确切地告诉你的代码在哪里失败,除非它没有考虑伸缩性。
对象的反向转换
实际上就是
小旁注:如果直接使用
Transform
作为字段你可以在任何地方摆脱X11M1N1X,这让IMHO变得更干净一点。