用手旋转物体

问题描述 投票:0回答:1

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

    }

}

c# unity3d
1个回答
0
投票

好吧,我并没有真正了解“手”或旋转对象本身的假定运动是什么,但看起来您的代码正在执行以下操作:

  • 'startPos' 只是从你正在旋转的任何东西到'手'的方向,
  • 令人惊讶的是,'closestPoint' 是由相同的操作创建的,但假设位置可能发生变化,在 Update() 中可能会导致不同的值。
  • 你正在创建的四元数“rot”肯定是在描述一些旋转,但计算它的方式让我怀疑它在这里有任何意义,因为它描述了在世界零处看着 startPos 的虚构对象的旋转要看 closestPoint,
  • 然后您只需使用前一个乘以 10 的 Y 轴分量创建另一个旋转,最后将其添加到在 SetOffsets() 中设置一次且从未更新的“currentRot”中。
有趣的部分从这里开始——如何通过向量帮助自己感知四元数:站在房间的中央,这是你的 [0,0,0],然后选择一个直线方向到最近的墙——这是你的初始旋转(身份,也称为“无旋转”)。然后在不同的角落选择两个对象,假设它是一把椅子和一朵花。看看现在的椅子。从椅子看向花朵需要应用到自身的旋转量可以描述为四元数,如果你使用 Quaternion.FromTo(),你将以椅子相对于你的位置来喂养它,并且然后是花的位置,也是相对于你的。

总而言之,我认为上面的代码没什么意义,可以建议您两件事:

    请在上下文中描述问题,最好使用屏幕截图和手绘草图来描述您想要实现的目标,
  1. 请观看有关如何在 Unity 中使用四元数的几个教程,其中有很多。我知道,Q 看起来很诡计而且令人兴奋,但如果你从基础数学中抽象出来,它的逻辑非常非常简单:就像线上的一段代表沿着这条线来回移动的量,四元数是表示围绕点和轴的旋转量。我发现球体是最好的解释方式:球体表面上的小点是从其中心开始的“观察方向”,从该点开始的小箭头是“向上”方向,球体本身固定在它的中心点所以它不能移动,因此两个点的位置和方向(记住“向上”箭头)之间的任何差异都可以用四元数来描述。
© www.soinside.com 2019 - 2024. All rights reserved.