Unity3D四元数使我的本地轴随机

时间:2015-11-03 13:36:30

标签: unity3d

  • 重新提出我的问题,因为人们不清楚我的意思。

所以我有一个球员(胶囊),我希望他的底部面对立方体的中心。问题是我只能在失去对前向矢量的控制时才能使它工作,我需要我的前向矢量来告诉我的玩家他可以移动的位置2.此外,看到玩家游戏在Y轴上旋转而没有输入也不是很好一个控件。这是hapenning:

  • 胶囊所持有的立方体是向前矢量。

https://www.youtube.com/watch?v=00BIhBHSSKQ&feature=youtu.be

问题在于它在1轴上移动时确实指向了立方体的中心,但是当在另一个轴上移动时,它开始表现得很奇怪。这是代码:

using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

    public Transform ground;
    public Transform player;

    void Update()
    {
        Landing();
    }

    public void Landing()
    {
            Vector3 dir = ground.position - player.position;
        Quaternion rot = Quaternion.LookRotation(player.forward, -dir);

        player.rotation = rot 
    }
}

如果我添加此代码,但它可以工作,但我失去了对我前进方向的控制,它只是一直在旋转:

    Quaternion bla2 = Quaternion.LookRotation(player.right, -dir);

https://www.youtube.com/watch?v=NO5Jpf-_pjo

2 个答案:

答案 0 :(得分:1)

  

我想把底部指向太空中的一个点。

我认为有更简单的方法可以完成它。如果我理解正确,您可能希望将播放器的bottom向量与另一个给定向量dir对齐吗?好吗?

如果我是对的,你可以简单地使用这个脚本:

player.trandform.bottom = dir;

因此,您无需重新计算其旋转对象。此外,可以按照这种方式对任何对象的forwardrightleft,...方向进行操作。

注意:您可能想要为此轮播设置动画。为此,您可以使用Vector3的Lerp / Slerp方法在这两个向量之间平滑过渡。

player.transform.bottom = Vector3.Lerp(player.transform.bottom, dir, Time.deltaTime * rotateSpeed);

答案 1 :(得分:0)

喜欢这样吗?

obj.Translate(speed * Vector3.forward * Time.deltaTime);

您说要使用自定义y

Vector3 direction = obj.forward;
direction.y = input.GetAxis("Vertical");  // < --- however you are retieving your input i have no idea
obj.Translate(direction.normalized * speed * Time.deltaTime);