【Unity】一人称視点でオブジェクトを掴んで移動させる #3

投稿者: | 2020-05-11

掴んだオブジェクトがプレイヤーの視線方向の軸に沿って回転できるようにしました。

// アイテムを移動させる
else if (state == 2)
{
    itemRb.velocity = (transform.forward * itemDist + transform.position - item.transform.position) * 10f;

    itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.forward, item.transform.forward), 2f)) * turnSpeed;
    itemRb.angularVelocity += Vector3.Cross(item.transform.right, transform.right) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.right, item.transform.right), 2f)) * turnSpeed;

    //itemRb.rotation = Quaternion.Lerp(item.transform.rotation, transform.rotation,0.2f);
    //item.transform.rotation = Quaternion.Euler(Vector3.Lerp(item.transform.forward,transform.forward, 0.2f));
    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * (1 - Vector3.Dot(transform.forward, item.transform.forward)) * turnSpeed;
    //itemRb.angularVelocity += Vector3.Cross(item.transform.right, transform.right) * (1 - Vector3.Dot(transform.right, item.transform.right)) * turnSpeed;


    //itemRb.AddTorque(Vector3.Cross(item.transform.forward, transform.forward) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.forward, item.transform.forward), 2f)) * turnSpeed,ForceMode.Impulse);
    //itemRb.AddTorque(Vector3.Cross(item.transform.right, transform.right) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.right, item.transform.right), 2f)) * turnSpeed,ForceMode.Impulse);


    //itemRb.angularVelocity += Vector3.Cross(item.transform.up, transform.up) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.up, item.transform.up), 2f)) * turnSpeed;
    //rb_ItemParent.angularVelocity = Vector3.Cross(itemParent.right, transform.right) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.right, itemParent.right), 2f)) * turnSpeed;


    //itemRb.angularVelocity = Vector3.Cross(Vector3.Lerp(item.transform.forward, item.transform.right, 0.5f), Vector3.Lerp(transform.forward, transform.right, 0.5f)) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(Vector3.Lerp(transform.forward, transform.right, 0.5f), Vector3.Lerp(item.transform.forward, item.transform.right, 0.5f)), 2f)) * turnSpeed;
    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.forward, item.transform.forward), 2f)) * turnSpeed;
    //itemRb.angularVelocity = Vector3.Cross(item.transform.right, transform.right) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.right, item.transform.right), 2f)) * turnSpeed;

    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Quaternion.Angle(transform.rotation, itemRb.rotation) * turnSpeed;
    //itemRb.MoveRotation(Quaternion.Lerp(item.transform.rotation, transform.rotation, 0.5f));
    //itemRb.MoveRotation(transform.rotation);

    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Vector3.Dot(transform.right, item.transform.forward) * turnSpeed;
    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * (1-Vector3.Dot(transform.forward, item.transform.forward)) * turnSpeed;

    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Mathf.Sqrt(1 - Mathf.Pow(Vector3.Dot(transform.forward, item.transform.forward), 2f)) * turnSpeed;


    //itemRb.angularVelocity = transform.up * Vector3.Dot(item.transform.forward, transform.forward) * turnSpeed;
    //itemRb.angularVelocity = Vector3.Cross(item.transform.forward, transform.forward) * Vector3.Dot(item.transform.forward, transform.forward) * turnSpeed;

Cubeの正面がプレイヤーの正面と合うように回転させたあとに、それに加えて、Cubeの右方向がプレイヤーの右方向と合うように回転させます。

MoveRotation()等を使ったほうが簡単そうですがうまくいきませんでした。

この回転を加えたので、掴んだCubeがどこにもぶつかっていないのに斜めに傾いたまま止まるということがなくなりました。なので、Cubeがテーブルにぶつかって、カメラから見て時計方向に回転したときには、テーブルから離すと元の向きに戻ります。

また、上を向いて素早く移動させるとCubeが時計方向にくるくる回転しますが、移動をやめると元の向きに戻ります。

新しい回転を加える前は、この方向へCubeの向きが戻らなかったので不自然でした。

コメントを残す

メールアドレスが公開されることはありません。