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场景下):起始为红光,当然发生反射、折射(以及全反射)现象。