unity3d 用手旋转物体

noj0wjuj  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(128)

我想用我的手只在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;

    }

}
bis0qfac

bis0qfac1#

嗯,我真的不知道什么是假定的运动的'手'或旋转的对象本身,但它似乎像你的代码正在做以下事情:

  • “startPos”只是一个从你旋转的物体到“手”的方向,
  • 令人惊讶的是,“closestPoint”是由相同的操作创建的,但假设可能的位置变化,在Update()中可能会导致不同的值。
  • 你创建的四元数'rot'确实描述了一些旋转,但计算它的方式让我怀疑它在这里有任何意义,因为它描述了虚拟对象在世界零点的旋转,该对象在startPos处旋转,以在closestPoint处旋转,
  • 然后,您只需使用之前乘以10的Y轴分量创建另一个旋转,最后将其添加到“currentRot”中,该值在SetOffsets()中设置过一次,从未更新。

这里是有趣的部分开始-如何帮助自己percieve四元数trhough向量:站在房间的中央,这是你的[0,0,0],然后选择一个直线方向到最近的墙-这是你的初始旋转(identity,也称为'no-rotation')。然后选择位于不同角的两个对象,假设是一把椅子和一朵花。现在看看椅子。从椅子到花的旋转量可以用四元数来描述,如果你要使用四元数的话。(),你将给它提供一个椅子相对于你的位置,然后是花相对于你的位置。如果你在目标点倾斜你的头,你的“向上”方向也会因为旋转而改变。
总之,我认为上面的代码没有什么意义,可以给您两点建议:
1.请在上下文中描述一个问题,最好是截图,也许是你试图实现的一些草图,因为仅仅是文字是不够的,
1.请看几个关于如何在Unity中使用四元数的教程,这里有很多。我知道,Q看起来很棘手,让人兴奋,但如果你设法从底层数学中抽象出来,它的逻辑是非常非常简单的:就像直线上的一段表示沿着这条直线在一个方向上的移动量,而在另一个方向上的移动量,四元数表示绕点和轴的旋转量。我发现球体是最好的解释方式:想象一个球体,球体表面上的小点是从其中心“看"的方向,从该点的小箭头是”向上“的方向,球体本身固定在其中心点上,因此它不能移动,因此两个点的位置和方向之间的任何差异(记住”向上“箭头)都可以用四元数来描述。

相关问题