Unity Final VR IK (Asset) 将人物锁定在坐姿
Unity Final VR IK (Asset) lock person in sitting position
目前我正在为有无障碍访问限制的人开发一款游戏。我遇到了将玩家模型锁定在坐姿的问题。如果用户没有将自己置于房间中心,玩家模型将被拉向某个方向。我想将玩家模型锁定在座位上,并且只允许手臂运动和头部旋转,在使用 HMD 的游戏中不能倾斜或移动。
由于我使用的是 Final VR IK 资产,所以我尝试使用他们的演示来确定 VR 中的坐姿,但无法让玩家保持自然坐姿。我不确定如何对此进行编程或设置限制才能执行此操作。
编辑:为了简化我的问题。如何锁定 oculus rift HMD 以仅允许旋转而不允许位置跟踪。
我想出了如何将 HMD 锁定到只允许旋转而不是位置跟踪的方法。要添加坐姿,只需使用坐着的 body 动画。我做了两件事。首先我在 OVRCameraRig 脚本中添加了一行代码:
trackingSpace.localPosition = -1 * centerEyeAnchor.localPosition;
这是在 RaiseUpdatedAnchorsEvent() 之前完成的;在 UpdateAnchors() 方法中调用第 260 行。它的作用是锁定头部位置,只允许头部旋转。
我做的第二件事是根据@derHugo 对我的其他问题之一的回答编写了头部重定位脚本。它的作用是当 space 条被按下时它会移动整个 OVRCameraRig 位置。 OVRCameraRig 上必须有一个 parent 才能工作 在下面的屏幕截图中,您可以看到 CameraParent object 作为 parent。我使用一个球体作为重定位 object,它被放置在我的玩家模型头部的中间。我不得不添加这个的原因是有时当你点击播放时,播放器会从一个奇怪的位置开始,这取决于耳机开始时的位置。 在屏幕截图中,您可以看到在检查器中未检查使用位置跟踪,这是一个错误。请保持选中以防止耳机屏幕撕裂
这是游戏中玩家位置变化的代码:
public class VRPositionChange : MonoBehaviour
{
public Transform resetPos;
private Transform parent;
private void Awake()
{
// create a new object and make it parent of this object
parent = gameObject.GetComponentInParent<Transform>();
}
// Update is called once per frame
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// reset parent objects position
parent.position = resetPos.position;
}
}
}
目前我正在为有无障碍访问限制的人开发一款游戏。我遇到了将玩家模型锁定在坐姿的问题。如果用户没有将自己置于房间中心,玩家模型将被拉向某个方向。我想将玩家模型锁定在座位上,并且只允许手臂运动和头部旋转,在使用 HMD 的游戏中不能倾斜或移动。
由于我使用的是 Final VR IK 资产,所以我尝试使用他们的演示来确定 VR 中的坐姿,但无法让玩家保持自然坐姿。我不确定如何对此进行编程或设置限制才能执行此操作。
编辑:为了简化我的问题。如何锁定 oculus rift HMD 以仅允许旋转而不允许位置跟踪。
我想出了如何将 HMD 锁定到只允许旋转而不是位置跟踪的方法。要添加坐姿,只需使用坐着的 body 动画。我做了两件事。首先我在 OVRCameraRig 脚本中添加了一行代码:
trackingSpace.localPosition = -1 * centerEyeAnchor.localPosition;
这是在 RaiseUpdatedAnchorsEvent() 之前完成的;在 UpdateAnchors() 方法中调用第 260 行。它的作用是锁定头部位置,只允许头部旋转。
我做的第二件事是根据@derHugo 对我的其他问题之一的回答编写了头部重定位脚本。它的作用是当 space 条被按下时它会移动整个 OVRCameraRig 位置。 OVRCameraRig 上必须有一个 parent 才能工作 在下面的屏幕截图中,您可以看到 CameraParent object 作为 parent。我使用一个球体作为重定位 object,它被放置在我的玩家模型头部的中间。我不得不添加这个的原因是有时当你点击播放时,播放器会从一个奇怪的位置开始,这取决于耳机开始时的位置。 在屏幕截图中,您可以看到在检查器中未检查使用位置跟踪,这是一个错误。请保持选中以防止耳机屏幕撕裂
这是游戏中玩家位置变化的代码:
public class VRPositionChange : MonoBehaviour
{
public Transform resetPos;
private Transform parent;
private void Awake()
{
// create a new object and make it parent of this object
parent = gameObject.GetComponentInParent<Transform>();
}
// Update is called once per frame
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// reset parent objects position
parent.position = resetPos.position;
}
}
}