沿摄像机方向以移动旋转方式旋转刚体

时间:2020-05-01 16:32:37

标签: c# unity3d rotation quaternions direction

我想像普通的第三人称射击游戏一样,使用moverotation沿主相机的方向旋转对象,但是我不知道如何设置四元数值

List<string>

3 个答案:

答案 0 :(得分:1)

我使用协程进行平滑旋转。我用Quaternion.LookRotation做这份工作。

因此您指示要查看的对象的位置以及动画的持续时间。在这里,您要将脸部旋转到主摄像头

StartCoroutine(SmoothRotation(Camera.main.transform, 3f));
:
:

IEnumerator SmoothRotation(Transform target, float duration)
{
    float currentDelta = 0;
    var startrotation = transform.rotation;//use your rigisbody if you want here i use the gameobject
    var LookPos = target.position - transform.position;
    var finalrot = Quaternion.LookRotation(LookPos);


    while (currentDelta <= 1f)
    {
        currentDelta += Time.deltaTime / duration;
        transform.rotation = Quaternion.Lerp(startrotation, finalrot, currentDelta);//
        yield return null;
    }

    transform.rotation = finalrot;
}

如果要(在运行时在场景中)看到摄像机指向的位置,只需在update()中添加以下代码:

    Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.TransformDirection(Vector3.forward) * 10f, Color.black);

如果您要指向同一方向,则只需在SmoothRotation方法中更改Finalrot的线即可:

var finalrot = Camera.main.transform.rotation;

您不需要计算LookPos

对于您的疯狂旋转问题,我建议您重置x和z旋转

direction = hit.transform.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(direction);
rotation.x = 0f;
rotation.z = 0f;

使用spere内的光线投射检测物体所需的技巧:Physics.OverlapSphere:使用可选参数layermask

时,可以选择要投射的物体
private void DetectEnemy(Vector3 center, float radius)
{

    var hitColliders = Physics.OverlapSphere(center, radius );

    for (var i = 0; i < hitColliders.Length; i++)
    {
        print(hitColliders[i].name + "," + hitColliders[i].transform.position);
        // collect information on the hits here
    }
}

答案 1 :(得分:0)

我用相机创建了一个射线投射,我想将刚体旋转到该射线投射指向的位置,但是如果我启动一个单位,它会疯狂旋转。有什么问题吗?

    with open('file2.txt') as f:
        data = [f.readline().rstrip().split(' ') for x in range(4)]

    # print(data)

    array1, array2, array3, array4 = data

    count = 1

    for i in array1:
val = int(i)
# print(val)

if count == 1:
    val1 = val
elif count == 2:
    val2 = val
elif count == 3:
    val3 = val
elif count == 4:
    val4 = val
count += 1

    count = 1

    for i in array2:
        val = int(i)
        # print(val)

        if count == 1:
            val5 = val
        elif count == 2:
            val6 = val
        elif count == 3:
            val7 = val
        elif count == 4:
            val8 = val
        count += 1

    for i in array3:
val = int(i)
# print(val)

if count == 1:
    val9 = val
elif count == 2:
    val10 = val
elif count == 3:
    val11 = val
elif count == 4:
    val12 = val
count += 1

    for i in array4:
val = int(i)
# print(val)

if count == 1:
    val13 = val
elif count == 2:
    val14 = val
elif count == 3:
    val15 = val
elif count == 4:
    val16 = val
count += 1

    print(val1, val2, val3, val4)
    print(val5, val6, val7, val8)
    print(val9,val10,val11,val12)
    print(val13,val14,val15,val16)

答案 2 :(得分:0)

添加一个字符控制器组件,就是为了这个目的。参见:

https://docs.unity3d.com/Manual/class-CharacterController.html