기울어진 탱크로 목표를 조준하다

7583 단어 Unity

포대가 좌우로 회전하여 포탑이 상하로 회전하는 탱크만 있다.
탱크가 지면을 따라 기복이 심한 상태에서 목표를 겨냥하기 위해
목표의 방향을 탱크의 좌표계로 바꾸어 계산하면 매우 편리하다.
    // ターゲットを戦車座標系に
    Vector3 dir = targetTr.position - cannonTr.position;
    Quaternion invRot = Quaternion.Inverse(transform.rotation);
    Vector3 invDir = invRot * dir;
변환된 방향에서부터 회전각, 앙각은 각각 포대, 포탑의 현지 좌표계에 들어간다
TankCannonCtrl.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TankCannonCtrl : MonoBehaviour {
    [SerializeField] Transform targetTr; // 目標
    [SerializeField] Transform turretTr; // 砲台
    [SerializeField] Transform cannonTr; // 砲塔

    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
        // ターゲットを戦車座標系に
        Vector3 dir = targetTr.position - cannonTr.position;
        Quaternion invRot = Quaternion.Inverse(transform.rotation);
        Vector3 invDir = invRot * dir;
        float turretAng = getLongitudeRad(invDir) * Mathf.Rad2Deg; // ローカルでの方位角
        float cannonAng = getLatitudeRad(invDir) * Mathf.Rad2Deg; // ローカルでの仰角
        Quaternion turretRot = Quaternion.AngleAxis(turretAng, Vector3.up);
        Quaternion cannonRot = Quaternion.AngleAxis(cannonAng, -Vector3.right);
        turretTr.localRotation = turretRot; //Quaternion.Lerp(turretTr.localRotation, turretRot, 0.2f);
        cannonTr.localRotation = cannonRot; //Quaternion.Lerp(cannonTr.localRotation, cannonRot, 0.2f);
        Debug.DrawRay(cannonTr.position, cannonTr.forward * 100f);
    }

    private float getLongitudeRad(Vector3 _dir)
    {
        return Mathf.Atan2(_dir.x, _dir.z);
    }
    private float getLatitudeRad(Vector3 _dir)
    {
        float lxz = Mathf.Sqrt(_dir.x * _dir.x + _dir.z * _dir.z);
        return Mathf.Atan2(_dir.y, lxz);
    }
}

포탄을 비스듬히 쏘고 싶은 경우비스듬히 쏘다식으로 얻은 각도를 목표로 한다.

좋은 웹페이지 즐겨찾기