Unity 进阶 之 判断基于物体所处位置(前后左右)

家电修理 2023-07-16 19:17www.caominkang.com电器维修

Unity 进阶 之 判断基于物体所处位置(前后左右)/ 方法原理 /注意事项的简单整理

目录

Unity 进阶 之 判断基于物体所处位置(前后左右)/ 方法原理 /注意事项的简单整理

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码

七、附录

点积

叉积


一、简单介绍

Unity中的一些知识点整理。

本节简单介绍在Unity开发中的,判断某个物体在某个物体的位置(相对的前后左右判断),便于根据位置进行一些其他的操作,如果你有新的方式也可以留言,多谢。

二、实现原理

1、在Unity中,使用点积进行前后的判断

   Vector3 dir = target.position - transform.position; //位置差,方向     

   Vector3.Dot(transform.forard, dir);

返回值为正时,目标在自己的前方,反之在自己的后方
 

2、在Unity中,使用叉积的 y 值进行左右判断

  Vector3.Cross(transform.forard, target.position).y

  返回值为正时,目标在自己的右方,反之在自己的左方
(为什么取y呢 ,因为 transform.forard实际上是 (0,0,1)rotation, 也就是只有z有值,

cross出来,就只有 y是计算 x和z 的情况,x是计算  y的情况,z是0; 左右关系,是由x和z决定的。)

三、注意事项

1、一个相对另一个物体的判断,最好使用他们间的相对位置判断准确,这样可以避免判断的错误

2、实际应用中,合理的使用这种关系,和变换这种关系的使用,拓展出一些新功能的使用,大家结合实际开发使用即可

四、效果预览

五、实现步骤

1、打开 Unity ,新建空工程

2、在场景中,布局场景,用于演示

3、创建脚本,一个用来封装判断函数,一个用来测试函数功能

 

4、把测试脚本挂载到场景中,并且对应赋值

5、运行场景,效果如上,随着 BaseTransform 转动 或者 Player 移动到不同位置,打印结果就会相应结果

六、关键代码

1、JudgeIsForardRightBaseSomeOneTransfrom

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

namespace XANUtils { 

 /// 
 /// 判断前后左右的封装
 /// 
	public class JudgeIsForardRightBaseSomeOneTransfrom
	{
  /// 
  /// 判断在基于位置的是否在前后
  /// 
  /// 
  /// 
  /// true:前;false:后
  public static bool IsForard(Transform baseTrans, Vector3 pos) {
   return GetIsForardValue(baseTrans, pos) >= 0 ? true:false;
  }

  /// 
  /// 判断在基于位置的是否在左右
  /// 
  /// 
  /// 
  /// true:右;false:左
  public static bool IsRight(Transform baseTrans, Vector3 pos)
  {
   return GetIsRightValue(baseTrans, pos) >= 0 ? true : false;
  }

  // 大于0,前
  // pos 为 0 ,结果会出错 (做好是相对位置)
  public static float GetIsForardValue(Transform baseTrans, Vector3 pos)
  {
   return Vector3.Dot(baseTrans.forard, pos - baseTrans.position);
  }

  // 大于0,右边
  // pos 为 0 ,结果会出错(做好是相对位置)
  public static float GetIsRightValue(Transform baseTrans, Vector3 pos)
  {
   return Vector3.Cross(baseTrans.forard, pos - baseTrans.position).y;
  }
 }
}

2、TestJudgeIsForardRightBaseSomeOneTransfrom

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

namespace TestSpace { 

	public class TestJudgeIsForardRightBaseSomeOneTransfrom : MonoBehaviour
	{
		public Transform BaseTransform;
		public Transform NeedJudageTrans;


		// Update is called once per frame
		void Update()
		{
			if (BaseTransform != null && NeedJudageTrans != null)
			{
				bool isForard =  JudgeIsForardRightBaseSomeOneTransfrom.IsForard(BaseTransform, NeedJudageTrans.position);
				bool isRight = JudgeIsForardRightBaseSomeOneTransfrom.IsRight(BaseTransform, NeedJudageTrans.position);

				Debug.LogWarning(GetType() + "/Update()/" + (isForard ? "前" : "后"));
				Debug.LogWarning(GetType() + "/Update()/" + (isRight ? "右" : "左"));

			}
			else {
				Debug.LogError(GetType()+ "/Update()/ BaseTransform or NeedJudageTrans is null !! ");
			}
		}
	}
}

七、附录

点积

判断两个物体的位置 关系,是可以通过 这个 cos 来判断,知道了这个余玄值,就可以知道 这个角度了。

 几何的定义 a·b=|a||b|cos 

对于n维度代数定义:

它在Unity中 调用是通过Vector3.Dot(),Unity中使用的也是代数公式

 public static float Dot(Vector3 lhs, Vector3 rhs)
    {
      return (float) ((double) lhs.x (double) rhs.x + (double) lhs.y (double) rhs.y + (double) lhs.z (double) rhs.z);
    }

如何判断的方位

使用 a 物体的transform.forard向量与 a 物体到 b 的方向做点击就可以得到这个余弦值了

a 到 b 的方向 otherObj.transform.position – transform.position

transform.forard 是玩家正面朝向 方向

大于0则面对,否则则背对着。这个计算也会有一点误差,但大致够用。

 因为求的角度用的是 单位向量,所以可以直接求得cos

这个角度值 还可以用来判断是否在视野内,一般情况下人的视野是在124度内,游戏里一般是限制在90度左右,视距就直接是两点之间的距离了。

a·b= |a| |b| cos   =>    a·b= |1|

cos的 含义图

作用

  •     是光照模型的应用,漫反射,高光的计算,diffuse=0.5+0.5dot(n,l) ,n是法线方向,l是光照方向, 高光saturate(po(dot(n,h),_Gloss))其中,h是 (vieDir+orldLightDir)/2
  •     是判断方位,角度,视野
  •     是 几何意义可以是求b在 a的投影
  •     等等
     

叉积

是一种在向量空间中向量的二元运算。与点积不同,它的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量和垂直。其应用也十分广泛,通常应用于物理学光学和计算机图形学中。

叉积的定义 c =a x b  其中a,b,c均为向量。即两个向量的叉积得到的还是向量! 

 

性质

  • c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面 。
  • 模长|c|=|a||b|sin
  • 满足右手法则 。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。
     

参考博文https://blog.csdn./qq2512667/article/details/79841333/

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by