今天突然别人问我红点瞄准器在镜子上如何计算,之前的吃鸡项目做过不记得,今天写个小用例整理下。
主体思想记得是目标位置到眼睛穿过红点瞄准器获取当前点的位置就可以。应该是这样吧,:)
武器测试结构
首先整个结构:
枪上Cube是握把,瞄准器就是镜子,红点,远处100米放一个目标点便于观察红点位置。
很多人说瞄准走枪管,不要这样想,绿色的瞄准线平行于枪管就可以了。
实现代码
先上代码:
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
public class Testhongdian : MonoBehaviour
{
public Camera camerMain;
public Transform jingzi;
public Transform hongdian;
public float dis = 100f;
// Start is called before the first frame update
void Start()
{
camerMain = Camera.main;
}
// Update is called once per frame
void Update()
{
//模拟枪口方向有目标点
Vector3 targetPoint = jingzi.transform.position + jingzi.transform.forward * dis;
//目标点到相机的dir , 因为枪位置可能变化, 所以要计算目标到眼睛
Vector3 dir = (camerMain.transform.position - targetPoint).normalized;
float denominator = Vector3.Dot(dir, jingzi.transform.forward);
float numerator = Vector3.Dot(jingzi.transform.position - targetPoint, jingzi.transform.forward);
float t = numerator / denominator;
Debug.Log(denominator.ToString("F5") + "," + numerator.ToString("F5") + "," + t.ToString("F5"));
//红点坐标
Vector3 newat = targetPoint + dir * t;
Debug.DrawLine(targetPoint, newat , Color.green);
hongdian.transform.position = newat;// at + jingzi.transform.position;
}
}
首先计算目标点位置,因为武器标准位置就是目标,所以是镜子的forward方向就是目标。
计算一个向量,然后用Dot计算夹角的比值,就知道偏移,dir * t就是在镜子上的偏移。
最后把红点的位置给上,当然自己要处理出去了怎么办。
实现效果
附上效果GIF: