Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用

简介: Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用

当我们使用射线投射检测到碰撞时,可以从RaycastHit中获取射线投射返回的信息,其中normal变量表示碰撞物体表面的法线向量:

using UnityEngine;
public class Example : MonoBehaviour
{
    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        bool flag = Physics.Raycast(ray, out RaycastHit hit);
        if (flag)
        {
            //法线信息 
            Debug.Log(hit.normal);
        }
    }
}

image.gif

Unity圣典中的介绍:

image.gif

例如子弹击中物体时,会在物体表面生成一个弹孔,该弹孔的朝向可以通过normal法线向量进行设置,同样,击中物体时产生的溅射粒子特效的朝向也需要根据该法线信息进行设置。

image.gif

image.gif

我们通过鼠标点击来模拟上面的效果,从鼠标位置发出一条射线进行检测,点击鼠标时在碰撞点生成一个弹孔及溅射粒子特效,代码如下:

usingUnityEngine;
usingUnityEditor;
publicclassExample : MonoBehaviour{
    [SerializeField] privateGameObjectdecal;
    [SerializeField] privateGameObjecteffect;
privateboolflag;
privateRaycastHithit;
privatevoidUpdate()
    {
Rayray=Camera.main.ScreenPointToRay(Input.mousePosition);
flag=Physics.Raycast(ray, outhit);
if (flag)
        {
if (Input.GetMouseButtonDown(0))
            {
vardecalInstance=Instantiate(decal);
decalInstance.transform.position=hit.point+hit.normal* .02f;
decalInstance.transform.forward=hit.normal;
vareffectInstance=Instantiate(effect);
effectInstance.transform.position=hit.point+hit.normal* .02f;
effectInstance.transform.forward=hit.normal;
            }
        }
    }
privatevoidOnDrawGizmos()
    {
Handles.color=Color.cyan;
if (flag)
        {
Handles.DrawLine(hit.point, hit.point+hit.normal);
        }   
    }
}

image.gif

image.gif

image.gif

目录
相关文章
|
10天前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
10天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如"JQR")以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
8月前
|
存储 图形学
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
【unity小技巧】unity中导入下载的3D模型及albedo/baseColor、normal 、AO/Occlus、metallic、roughness贴图纹理设置
253 0
|
9月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
142 0
|
图形学
Unity 向量
Unity 向量
118 0
|
数据可视化 图形学
Unity射线编程详解
Unity射线编程详解
132 0
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
453 0
|
图形学
Unity基础——向量
Unity基础——向量
536 0