向量的平面投影 ProjectOnPlane

1 定义 - ProjectOnPlane

 //
// 摘要:
//     Projects a vector onto a plane defined by a normal orthogonal to the plane.
//
// 参数:
//   planeNormal:
//     The direction from the vector towards the plane.
//
//   vector:
//     The location of the vector above the plane.
//
// 返回结果:
//     The location of the vector on the plane.
public static Vector3 ProjectOnPlane
			(
			Vector3 vector, 
			Vector3 planeNormal
			);

2 使用方法

  • 参数1 方向
  • 参数2 平面的法向量

投影向量

var pj = Vector3.ProjectOnPlane(dir, normal);

返回值是一个投影向量,平行于指定的平面

3 效果演示

请添加图片描述

4 参考代码

using UnityEditor;
using UnityEngine;

public class Pj : MonoBehaviour
{
    
    

    void Update()
    {
    
    
        project();
    }

    //方向向量目标点 看向点
    public Transform target,looker;
    //两点确定法线方向
    public Transform n1, n2;
    //跟随点
    public Transform sign;

    void project()
    {
    
    
        looker.transform.LookAt(target);

        //指向目标的向量
        var dir = target.position - transform.position;
        //平行于X轴平面的法向量 Y轴正方向向量 (1,0,0)
        var normal = n1.position - n2.position;
        //投影向量
        var pj = Vector3.ProjectOnPlane(dir, normal);
        //相对本对象位置进行变化
        sign.position = transform.position + pj;

        //绘制方向
        Debug.DrawLine(transform.position, target.position);
        //绘制投影
        Debug.DrawLine(transform.position, sign.position, Color.blue);
        //绘制法线
        Debug.DrawLine(target.position, sign.position,Color.red);
    }

    //绘制平面
    private void OnDrawGizmos()
    {
    
    
        //平行于X轴平面的法向量 Y轴正方向向量 (1,0,0)
        var dir = n1.position - n2.position;

        Handles.color = Color.yellow;
        for (int i = 0; i < 10; i++)
        {
    
    
            var dis = i + 1;
            Handles.DrawWireDisc(transform.position, dir, dis * 0.1f);
        }
    }
}

5 工程包
链接

6 投影函数 Project
请添加图片描述
7 函数返回值
是vector向量 想X轴正方形进行投影,最终落在X轴的一个点
请添加图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38531633/article/details/120172778