主要用来做双手持物体的效果,跟踪点可以理解为单手持物体时,物体跟踪的手部的点,校准点可以理解为由单手变双手时,另一个手上的点。
旋转轴定位点方向可以理解为跟踪点到旋转轴定位点的向量方向,及跟踪点为原点,旋转轴定位点方向会指向校准点。
using UnityEngine;
//旋转轴定位点方向
public enum LocationOrientation
{
X,
OppositeX,
Y,
OppositeY,
Z,
OppositeZ,
}
public class ObjectTrack : MonoBehaviour
{
[Header("跟踪点"),SerializeField] private Transform trackPoint;
[Header("校准点"),SerializeField] private Transform calibrationPoint;
[Header("旋转轴定位点方向"),SerializeField] private LocationOrientation orientation = LocationOrientation.Y;
private Vector3 _rotaryAxisLocatingPoint;//旋转轴定位点
private Transform _self;
void Start()
{
_self = transform;
}
private void Update()
{
var trackPosition = trackPoint.position;
_self.position = trackPosition;
_rotaryAxisLocatingPoint = trackPosition + GetOrientation();
Vector3 toDirection = (calibrationPoint.position - trackPosition).normalized;
Vector3 direction = (_rotaryAxisLocatingPoint - trackPosition).normalized;
Quaternion rotation = Quaternion.FromToRotation(direction,toDirection);
_self.rotation = rotation * _self.rotation;
}
private Vector3 GetOrientation()
{
Vector3 value = Vector3.zero;
switch (orientation)
{
case LocationOrientation.X:
value = _self.right * 0.2f;
break;
case LocationOrientation.OppositeX:
value = -_self.right * 0.2f;
break;
case LocationOrientation.Y:
value = _self.up * 0.2f;
break;
case LocationOrientation.OppositeY:
value = -_self.up * 0.2f;
break;
case LocationOrientation.Z:
value = _self.forward * 0.2f;
break;
case LocationOrientation.OppositeZ:
value = -_self.forward * 0.2f;
break;
}
return value;
}
}