1. 程式人生 > >【Unity3d】(二) Unity3D--光的反射與折射實現

【Unity3d】(二) Unity3D--光的反射與折射實現

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場景下):起始為紅光,當然發生反射、折射(以及全反射)現象。