我想用我的手只在Y轴上旋转一个对象。我在我的实现中也能实现这一点。问题在于保存最后一次旋转,当手试图再次旋转对象时,对象的开始旋转完全捕捉到一个新的旋转。
我该如何解决这个问题?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateObj : MonoBehaviour {
private Quaternion currentRot;
private Vector3 startPos;
public Transform hand;
private bool offsetSet;
void Start () {
}
void Update () {
Rotate ();
}
void SetOffsets () {
if (offsetSet)
return;
startPos = Vector3.Normalize (hand.transform.position - this.transform.position);
currentRot = this.transform.rotation;
offsetSet = true;
}
void Rotate () {
SetOffsets ();
Vector3 closestPoint = Vector3.Normalize (hand.transform.position - this.transform.position);
var rot = Quaternion.FromToRotation (startPos, closestPoint);
rot = Quaternion.Euler (0, rot.eulerAngles.y * 10f, 0);
this.transform.rotation = rot * currentRot;
}
}
1条答案
按热度按时间bis0qfac1#
嗯,我真的不知道什么是假定的运动的'手'或旋转的对象本身,但它似乎像你的代码正在做以下事情:
这里是有趣的部分开始-如何帮助自己percieve四元数trhough向量:站在房间的中央,这是你的[0,0,0],然后选择一个直线方向到最近的墙-这是你的初始旋转(identity,也称为'no-rotation')。然后选择位于不同角的两个对象,假设是一把椅子和一朵花。现在看看椅子。从椅子到花的旋转量可以用四元数来描述,如果你要使用四元数的话。(),你将给它提供一个椅子相对于你的位置,然后是花相对于你的位置。如果你在目标点倾斜你的头,你的“向上”方向也会因为旋转而改变。
总之,我认为上面的代码没有什么意义,可以给您两点建议:
1.请在上下文中描述一个问题,最好是截图,也许是你试图实现的一些草图,因为仅仅是文字是不够的,
1.请看几个关于如何在Unity中使用四元数的教程,这里有很多。我知道,Q看起来很棘手,让人兴奋,但如果你设法从底层数学中抽象出来,它的逻辑是非常非常简单的:就像直线上的一段表示沿着这条直线在一个方向上的移动量,而在另一个方向上的移动量,四元数表示绕点和轴的旋转量。我发现球体是最好的解释方式:想象一个球体,球体表面上的小点是从其中心“看"的方向,从该点的小箭头是”向上“的方向,球体本身固定在其中心点上,因此它不能移动,因此两个点的位置和方向之间的任何差异(记住”向上“箭头)都可以用四元数来描述。