기울어진 탱크로 목표를 조준하다
7583 단어 Unity
![](https://s1.md5.ltd/image/2329668a1161206804f1f5656ccbdd32.png)
포대가 좌우로 회전하여 포탑이 상하로 회전하는 탱크만 있다.
탱크가 지면을 따라 기복이 심한 상태에서 목표를 겨냥하기 위해
목표의 방향을 탱크의 좌표계로 바꾸어 계산하면 매우 편리하다.
// ターゲットを戦車座標系に
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);
}
}
![](https://s1.md5.ltd/image/813f40a18c1be1835a1569466b85f849.gif)
포탄을 비스듬히 쏘고 싶은 경우비스듬히 쏘다식으로 얻은 각도를 목표로 한다.
Reference
이 문제에 관하여(기울어진 탱크로 목표를 조준하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ELIXIR/items/def60c864a41e9d43a6e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)