几何向量:点与三角形

      判断点在三角形内部,属于三维开发中很常用的一种算法,之前搞忘记说了,前面我们判断射线与平面,如果再加上判断交点是否在三角形内的计算就更好了。

      好,假设我们有个三角形,和三角形所在平面的一个点,那么怎么判断点与三角形的关系,先来个示意图,如下:

      

      可以看的出来,如果点P在三角形内部,那么P与三角形ABC组成的六个夹角之和为180°(三角形内角和180°),如果在三角形外部,则不然。ps:这里我们不考虑signed旋转角正负号问题。

      那么判断算法就很容易实现了,使用余弦定理/点积/内置API,随意怎么计算就行(还不了解计算原理的回过头去看下),下面实现一下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PointTriangle : MonoBehaviour
{
    public Transform A;
    public Transform B;
    public Transform C;

    public Transform P;

    private Vector3 PosA;
    private Vector3 PosB;
    private Vector3 PosC;
    private Vector3 PosP;

    void Start()
    {

    }

    void Update()
    {
        PosA = A.position;
        PosB = B.position;
        PosC = C.position;
        PosP = P.position;

#if UNITY_EDITOR
        Debug.DrawLine(PosA, PosB, Color.black);
        Debug.DrawLine(PosB, PosC, Color.black);
        Debug.DrawLine(PosC, PosA, Color.black);
#endif
        bool result = CheckPointInTriangle(PosP, PosA, PosB, PosC);
#if UNITY_EDITOR
        Color col = result ? Color.black : Color.red;
        Debug.DrawLine(PosA, PosP, col);
        Debug.DrawLine(PosB, PosP, col);
        Debug.DrawLine(PosC, PosP, col);
#endif
    }

    private bool CheckPointInTriangle(Vector3 posP, Vector3 posA, Vector3 posB, Vector3 posC)
    {
        float angleBAP = Vector3.Angle(posB - posA, posP - posA);
        float anglePAC = Vector3.Angle(posP - posA, posC - posA);
        float angleACP = Vector3.Angle(posA - posC, posP - posC);
        float anglePCB = Vector3.Angle(posP - posC, posB - posC);
        float angleCBP = Vector3.Angle(posC - posB, posP - posB);
        float anglePBA = Vector3.Angle(posP - posB, posA - posB);

        float angle = angleBAP + anglePAC + angleACP + anglePCB + angleCBP + anglePBA;
#if UNITY_EDITOR
        Debug.LogFormat("angle = {0}", angle);
#endif
        if (Mathf.Approximately(angle, 180.0f))
        {
            return true;
        }
        return false;
    }
}

      效果如下:

  

      当然还有其他方法,后面聊,现在主要看微积分在。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值