【发布时间】:2021-12-13 00:14:18
【问题描述】:
所以基本上我“制作”了一个控制手部运动的脚本,并且也有适当的碰撞。大部分都有效,但是,即使将其速度设置为高值,旋转似乎也有一个有限的速度。
不管我把乘数改成什么,旋转的速度都很慢。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hand: MonoBehaviour
{
// Physics Movement
[SerializeField] private GameObject followObject;
[SerializeField] private float followSpeed = 30f;
[SerializeField] private float rotateSpeed = 100f;
[SerializeField] private float teleportDistance = 0.75f;
[SerializeField] private Vector3 positionOffset;
[SerializeField] private Vector3 rotationOffset;
private Transform _followTarget;
private Rigidbody _body;
private bool _inGrab = false;
void Start()
{
// Physics Movement
_followTarget = followObject.transform;
_body = GetComponent<Rigidbody>();
_body.collisionDetectionMode = CollisionDetectionMode.Continuous;
_body.interpolation = RigidbodyInterpolation.Interpolate;
_body.mass = 20f;
// Teleport Hands
_body.position = _followTarget.position;
_body.rotation = _followTarget.rotation;
}
void Update()
{
PhysicsMove();
}
private void PhysicsMove()
{
// Position
var positionWithOffset = _followTarget.position + positionOffset;
var distance = Vector3.Distance(positionWithOffset, transform.position);
_body.velocity = (positionWithOffset - transform.position).normalized * (followSpeed * distance);
// Rotation
var rotationWithOffset = _followTarget.rotation * Quaternion.Euler(rotationOffset);
var q = rotationWithOffset * Quaternion.Inverse(_body.rotation);
q.ToAngleAxis(out float angle, out Vector3 axis);
_body.angularVelocity = axis * (angle * Mathf.Deg2Rad * rotateSpeed);
// Teleport back when too far
if(distance > teleportDistance)
{
_body.position = _followTarget.position;
_body.rotation = _followTarget.rotation;
}
}
}
脚本附加到具有刚体的手模型上,跟随目标是 XR 控制器。一切似乎都在工作,除了旋转的速度。
很少使用四元数,所以它可能只是一些基本问题。
【问题讨论】:
-
如果您只想让它跟随控制器,您确定要通过物理移动它吗?在我看来,仅对变换使用 SLerp 会得到更好的结果。
-
您找到这个问题的答案了吗?如果我的有帮助,请考虑accepting it 给我一些声誉积分,并帮助其他浏览搜索面板的人在这里找到有用的答案。
标签: c# unity3d virtual-reality