기울어진 탱크로 목표를 조준하다
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);
}
}
포탄을 비스듬히 쏘고 싶은 경우비스듬히 쏘다식으로 얻은 각도를 목표로 한다.
Reference
이 문제에 관하여(기울어진 탱크로 목표를 조준하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ELIXIR/items/def60c864a41e9d43a6e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)