【Unity3d】(二) Unity3D--光的反射与折射实现

本文详细介绍使用Unity3D进行光学物理实验的开发过程,包括光的反射与折射的实现方法。通过Vectrosity插件绘制光线,利用Unity内置函数处理光的反射,并自定义折射函数,最终实现场景中的光学效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity3D--光的反射与折射实现
  最近做老师的科研项目,主要方向是虚拟现实,重点是研究光学物理实验。在这里写一些自己开发过程中想法和实现细节,方便自己回顾和分享给需要的小伙伴! ☆☆☆☆☆☆☆☆☆☆☆
  说起光,首先要在Unity3D场景中将光线显示出来且满足光学实验规律。那么,先介绍目前我用过的两种光线显示方法:
  一、Unity3D中的LineRender画线法,该方法网上介绍都比较详细,我就不说了。主要介绍我目前实验中用到Vectrosity
  二、Vectrosity 5.4.2画线插件,该插件可以很方便地在2D和3D物体上绘制线段、射线以及折线等等。(点击下载:目前在审核中,需要可以私发插件包和官方文档。)
  接下来,回到我们的重点内容:光的反射和折射实现。
  光的反射,不用多说,Unity3D中包含该方法,即:reflect(float3 I,float3 N);I为入射光线向量,N为法线向量。
  例如:fanShe = Vector3.Reflect(hit.point - v0, hit.normal); //返回fanShe为反射光线。
  运用Vectrosity 插件绘制反射光线,即:

using UnityEngine;
using Vectrosity;
public class Lightings : MonoBehaviour
    {
        private VectorLine myLine;//绘制反射光线
        
        void Start()
        {
        }
        
        void Update()
        {
            v0 = GameObject.Find("origin").transform.position;
                //绘制反射光线...
                fanShe= Vector3.Reflect(hit.point - v0, hit.normal);
                myLine = VectorLine.SetRay3D(Color.blue, 0.1f, hit.point, fanShe);
                myLine.lineWidth = 4.0f; 
        }
}

光的折射,不幸的是在Unity3D中并没有写该方法,需要我们自己构造,没搞错吧??这种API方法难道不是应该Unity3D写好的吗?有反射,怎么会没有折射,这也太偏心了吧。。。。。

      没有办法的呀,自己默默找资料,写呗。废话不多说,直接上代码。GoGo~~~~~

 //该函数返回结果为:折射光线的方向,其中:I为入射光线,N为法线,h为折射率
        public Vector3 Refract(Vector3 I, Vector3 N, float h)
        {
            I = I.normalized;//单位化
            N = N.normalized;

            float A = Vector3.Dot(I, N);
            float B = 1.0f - h * h * (1.0f - A * A);
            Vector3 T = h * I - (h * A + Mathf.Sqrt(B)) * N;
            if (B > 0)
                return T;
            else
                return Vector3.zero;
        }

下面还是运用实例,讲解该方法如何运用,上代码——>>

public class Lightings : MonoBehaviour
    {
        public float mN1 = 1.0f;  //空气折射率1
        public float mN2 = 1.33f;  //水折射率1.33
        private VectorLine myLine1;//绘制反射光线
        
        void Start()
        {
        }
        
        void Update()
        {
                //绘制折射光线...光线从空气射向水中,绘制水中折射光线。
                //(endHit.point - startHit.point)为入射光线向量
                zheShe = Refract(endHit.point - startHit.point, endHit.normal, mN1/mN2);
                myLine1 = VectorLine.SetRay3D(Color.red, 0.1f, hit.point, zheShe);
                myLine1.lineWidth = 4.0f; 
        }
}

贴一张我的实验效果图(3D场景下):起始为红光,当然发生反射、折射(以及全反射)现象。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值