VR中对带有约束的物理对象的交互

在VR游戏中, 使用双手(控制器)直接对虚拟世界中的对象进行交互, 已经成为一种”标准化”的设计, 一切看起来能够用手去交互的物体, 都需要附合物理规则.

简单的物理对象, 通常只是一个刚体(Rigidbody), 这种只需要模拟重力和惯性运动就可以了, 最多再调节一下摩擦力, 弹性, 空气阻力等, 所以在技术上借助物理引擎的帮助是比较简单的.

稍微复杂一点儿的物理对象, 是带有约束(Constraint)关系的, 比如门, 抽屉, 转盘, 滑杆, 绳索等等. 这里以最常见的滑动和转轴约束进行一下分析, 它们都是把位移或者旋转限制在一个轴上, 计算起来比较简单.

对带有约束的物理对象进行交互, 难点在于如何使物理对象仍然严格按约束关系来运动. 在 VR下双手与物体的交互 中提到过, 要想使一个物理对象动起来, 可以有三种方法: 设置位置, 设置速度(施加冲量), 释加力. 然而, 设置位置这种方式, 是不遵循物理定律的, 会导致物理对象脱离约束的运动范围, 频繁地被拉扯回来. 而施加速度或力的方式, 虽然能够保证物理对象严格地按照约束来运动, 但是很难保证物理对象的位置跟手是一致的. 因为VR下的交互, 通常是用手抓着不放进行拖动来完成的, 如果物理对象不跟着手同步一起动, 那么这个体验就不能算过关.

出于手感的考虑, 肯定是手的抓握点保持跟手同步运动的效果最为理想, 所以只能选择第一种设置位置的方法. 但是对于带有约束关系的物理对象, 这个是比较难保证的. 因为它们被限制在了一个轴上运动, 而我们的手不是. 因此, 如果要同步手的移动到这个物理对象上, 需要把手的位置按照约束关系进行映射. 比如滑动, 需要映射到滑动轴上; 比如转动, 需要把运动映射成旋转角. 这样的话, 相当于在交互时, 自行模拟了约束关系, 让设置的位置(或角度)保持在合理的约束范围内.

但是, 这么做有两个问题:
1. 松开手时, 物理对象是静止的. 因为设置位置(或角度)的方式, 物体的速度是0, 所以要想在松手时按照惯性继续运动, 需要手动设置一个速度(或者角速度)让它保持交互最后一刹那的运动继续下去.
2. 通过设置位置的方式, 对于间接接触的物理对象是没有连续性的作用的. 比如一个转盘, 上面放了一个球. 我们通过设置角度的方式让转盘转起来, 上面的球并不会平滑地滚动起来. 所以, 这也是一个待解决的问题, 等我找到更好的方法再来补充一下.

你可能感兴趣的:(虚拟现实,动画物理)