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

投稿者: | 2020-05-10

前の記事の勘違いを修正しました。

前の記事では、プレイヤーとItemの正面のなす角が小さくなるように回転させたいのに、内積をそのまま使っていました。

コサインは角度が小さいと1になって90度のときに0になるので、内積を1から引いたり、サインに直して使うと、Cubeがプレイヤーと同じ方向を向くようになりました。

Cubeは正面の後ろ側の面だけ赤くしているので、赤い面がこちらに向いているとCubeはプレイヤーの正面と同じ方向を向いています。

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

            //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;

            // 左クリックを離すとアイテムを掴むのをやめる
            if (CrossPlatformInputManager.GetButtonUp("Fire1"))
            {
                // アイテムの物理マテリアルをもとに戻す
                itemColl.material = itemPM;

                imgComp.sprite = hand[0];

                itemRb.useGravity = true;
                itemRb.isKinematic = false;
                state = 0;
            }

また、回転させる軸は、プレイヤーとCubeの正面の方向に垂直な方向にすればいいので、Vector3.Crossを使っています。https://docs.unity3d.com/jp/460/ScriptReference/Vector3.Cross.html

フレミングの左手の法則の親指、人差し指のベクトルを第1引数、第2引数に入れると、中指の方向のベクトルが返ります。

これにプラスの値を掛けると反時計回りに、マイナスだと時計回りに回転するようです。

ですが、このままだとプレイヤーの視線に沿った回転についてこないので、上を見てマウスを動かすとCubeがくるくる回転したり、Cubeがテーブルとぶつかってその方向へ回転した後に元の向きに戻らなかったりします。

プレイヤーの向きに合わせて、視線に沿って回転させられるように修正が必要です。

コメントを残す

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