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

目录
相关文章
|
7月前
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
5月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
50 0
|
5月前
|
图形学
Unity 向量
Unity 向量
|
5月前
|
数据可视化 图形学
Unity射线编程详解
Unity射线编程详解
|
11月前
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
252 0
|
图形学
Unity基础——向量
Unity基础——向量
445 0
|
图形学
Unity射线检测3d,2D,正交透视。
使用射线功能制作点击物体获取物体名字。可以做简单点击相应。 3D射线检测,Camera 在正交模式与透视模式皆可使用 void Update() { Ray ray = Camera.main.ScreenPointToRay(Input.
1878 0
|
API vr&ar 图形学
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【100个 Unity小知识点】☀️ | Unity中使用代码查询Draw call、Tris和Verts等信息
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
【Unity3D 灵巧小知识点】☀️ | Unity通过 射线 获取 鼠标的世界坐标 和 鼠标点击的物体信息
|
图形学
Unity 3D中的射线与碰撞检测
创建一条射线Ray需要指明射线的起点(origin)和射线的方向(direction)。这两个参数也是Ray的成员变量。注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。
4350 0