【Unity3d】(二) Unity3D--光的反射與折射實現
阿新 • • 發佈:2018-12-16
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場景下):起始為紅光,當然發生反射、折射(以及全反射)現象。