戦車照準システムの開発記録-ユニティノート(2020.11.16)

インターネットでの方法に関係なく、戦車砲塔の照準システムを構築する
必要がありますが、最終的には完全に完成していないことを直接認めます。バレルはまだ私の考えどおりに動作しません。しかし、それは形になります。効果の後、
砲塔は続きますが、バレルにはまだ独自のアイデアがあります
砲塔は続きますが、バレルにはまだ独自のアイデアがあります

コードに直接移動します。原則についてコメントしたいのですが、ほとんど言っています。ここに砲塔を置きましょう。

            // 用于存储瞄准的方向
            Vector3 aimPosition = Vector3.zero;
            // 用于确定射线的落点
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            float distance;
            Plane plane = new Plane(Vector3.up, raycastTarget.position);
            if (plane.Raycast(ray, out distance))
            {
    
    
                aimPosition = ray.origin + ray.direction * distance;
            }

            // 炮塔的实际旋转
            Vector3 turretPos = aimPosition;
            turretPos.y = turret.position.y;  //过滤掉y轴的信息,防止炮塔出现绕x,z轴旋转的问题
            Quaternion aimRotTurret = Quaternion.RotateTowards(turret.rotation,
            Quaternion.LookRotation(turretPos - turret.position, Vector3.up), Time.deltaTime * rotateSpeed);
            turret.rotation = aimRotTurret;

コア部分は、Quaternion.RotateTowardsメソッドを使用して、タレットがゆっくりと回転する効果を実現することです。このメソッドは、単純にカスタマイズされています。必要なパラメータは、初期回転(タレットの位置)、ターゲット回転、および回転速度です。次に、彼の戻り値を取得し、フレームごとにタレットの回転に割り当てます。インターネットを見ると、この方法はlerpに似ているはずだと言われていますが、とにかく少し混乱しています(ただ動作します)。
次に、ターゲットの回転を決定する必要があるもう1つの重要な問題があります。まず、カメラの前面に沿って放射される光線を通過させ、常にカメラの前面にある光線を当てると、位置が常に保証されます。タレットの前(カメラはタレットの前にあります))平面、Vector3 aimPositionを取得するには、これがaimPositionバレルの位置合わせ位置であり、タレットの隣にあり、影響aimPositionがY-からフィルターで除外されます。軸、そうでなければスイングタレットタレット
ここに画像の説明を挿入
タレットになりますそうは言っても、これまでのところかなり成功していると思いますが、バレルはそれほど滑らかではありません。私の考えでは、バレルはまだaimPositionですが、xとz軸は除外されます。しかし、状況は非常に不十分です。バレルはタレットの一部です。タレット回転ガンの管理は回転に従う必要があります。無視すると、タレットは逃げ出し、バレルはまだ所定の位置に固定されています。無視しない場合、砲身は砲塔より1歩早く戻ります。現状は説明できない状態です。たぶんそれは0が間違っているからです。今、少し遅れて、明日やりましょう。

	// 炮管的实际旋转(有问题)
    Vector3 gunPos = aimPosition;
    gunPos.x = 0;
    gunPos.z = 0;  //类似的过滤操作
    Quaternion aimRotGun = Quaternion.RotateTowards(gun.rotation,
    Quaternion.LookRotation(gunPos - gun.position, Vector3.up), Time.deltaTime * rotateSpeed);
    gun.rotation = aimRotGun;

その夜、バレル回転の問題は解決されました。以下の方法:

    // 炮管的实际旋转(BUG已经修好)
	Vector3 gunPos = aimPosition;
	Quaternion aimRotGun = Quaternion.RotateTowards(gun.rotation,
	Quaternion.LookRotation(gunPos - gun.position), Time.deltaTime * rotateSpeed);
	// 让localRotation的y,z轴不要转
	gun.localRotation = Quaternion.Euler(aimRotGun.eulerAngles.x, 0f, 0f);

この方法は、gun.localRotationへの割り当ての最後に何かを実行することです。aimRotGun.eulerAngles.xは使用する回転軸であり、y軸とz軸は直接0に設定されます。

おすすめ

転載: blog.csdn.net/qq_37856544/article/details/109730863