c# - 物体旋转太慢
问题描述
所以基本上我“制作”了一个控制手部运动的脚本,并且也有适当的碰撞。它的大部分工作,然而,旋转似乎有一个有限的速度,即使它的速度设置为高值。
无论我将乘数更改为什么,旋转速度都很慢。
这是代码:
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 控制器。一切似乎都在工作,除了旋转的速度。
很少使用四元数,所以它可能只是一些基本问题。
解决方案
你需要改变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;
}
推荐阅读
- c# - 无法在我的 C#.NET Winforms 应用程序中使用 DYMO 280 标签打印机
- kotlin-exposed - 如何在 Kotlin Exposed 中应用“NOW()”作为日期时间列值?
- python - 如何将包含数据和 datetime64[ns] 的列表与具有 datetime64[ns] 索引的 pandas 数据框合并
- c - 如何修复 GDB 的错误“指定给 RtlFreeHeap 的地址无效”
- jquery - 如何仅将数据表中选定的复选框 id 保存回数组中的控制器
- html - 如何在 IE11 中设置 Mailto 链接?
- oracle - 在plsql中将blob图像转换为PUBLIC.ORDIMAGE
- javascript - 简单待办事项列表:当列表为空时添加“无”,或在添加至少一项时将其删除。更好的解决方案是什么?
- sql - 在将 oracle 查询转换为大查询时出现“语法错误:预期的“(”或关键字 UNNEST 但得到标识符...”
- ansible - 如何使用 Ansible playbook 进入 Solaris 区域并在那里执行命令?