首页 > 解决方案 > 物体旋转太慢

问题描述

所以基本上我“制作”了一个控制手部运动的脚本,并且也有适当的碰撞。它的大部分工作,然而,旋转似乎有一个有限的速度,即使它的速度设置为高值。

无论我将乘数更改为什么,旋转速度都很慢。

这是代码:

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 控制器。一切似乎都在工作,除了旋转的速度。

很少使用四元数,所以它可能只是一些基本问题。

标签: c#unity3dvirtual-reality

解决方案


你需要改变maxAngularVelocity刚体的。默认仅为每秒 7 弧度,小于每秒 2 次完整旋转。

将其设置为更高的值,例如 20,将允许刚体在需要时更快地转动。不幸的是,这不能通过检查器访问,但它是通过脚本来访问的:

void Start()
{
    // Physics Movement
    _followTarget = followObject.transform;
    _body = GetComponent<Rigidbody>();
    _body.collisionDetectionMode = CollisionDetectionMode.Continuous;
    _body.interpolation = RigidbodyInterpolation.Interpolate;
    _body.mass = 20f;
    _body.maxAngularVelocity = 20f;

    // Teleport Hands
    _body.position = _followTarget.position;
    _body.rotation = _followTarget.rotation;
}

推荐阅读