国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity】為網(wǎng)格生成頂點法線(Mesh.RecalculateNormals計算異常的解決方案)

這篇具有很好參考價值的文章主要介紹了【Unity】為網(wǎng)格生成頂點法線(Mesh.RecalculateNormals計算異常的解決方案)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

背景

我們通過代碼動態(tài)創(chuàng)建的網(wǎng)格,因為沒有法線,不會接收到光照。

正常情況下調(diào)用Mesh.RecalculateNormals方法,重新生成法線即可。

但特定情況下通過此方法計算出的頂點發(fā)現(xiàn)都是(0, 0,0),這種情況下只能手動生成法線了

如下圖,左邊物體有正確的法線,可以接收光照信息,右側(cè)物體無法線,無法接收光照。
unity頂點法線,Unity,unity,游戲引擎

RecalculateNormals計算異常的原因

經(jīng)測試發(fā)現(xiàn)導(dǎo)致Mesh.RecalculateNormals計算異常的情況:
如果Mesh中的某個頂點,在三角形標號數(shù)組中,即畫了正面的網(wǎng)格,又畫了反面的網(wǎng)格,則會導(dǎo)致RecalculateNormals計算錯誤,該點法線計算結(jié)果為(0, 0,0)。

解決方法1

對于雙面網(wǎng)格,將頂點數(shù)組增加一倍,用于繪制反面的網(wǎng)格,分別放入Mesh的三角形標號數(shù)組中,以保證每個點法線計算正確。

解決方法2

用下方的生成頂點法線算法,手動計算期望的法線數(shù)組。

原理

法線:法線是指始終垂直于某平面的直線。在幾何學(xué)中,法線指平面上垂直于曲線在某點的切線的一條線。

網(wǎng)格的法線數(shù)組:法線數(shù)組存放Mesh每個頂點的法線,數(shù)組大小與頂點坐標對應(yīng),normals[i]對應(yīng)頂點vertices[i]的法線。

在 Max Wagner 的 《Generating Vertex Normals》文章 中寫到——嚴格意義上講,點是沒有法線的。點的法線是在使用Phone或Gouraud模型時計算光照使用。如果一個面上的所有法線都一樣,他們的光照也就一樣,就會產(chǎn)生 flatness 效果;而如果把每個頂點的法向設(shè)置不同,則更平滑。

我們通過代碼創(chuàng)建的網(wǎng)格一般都是多邊形,所以給每個頂點賦值他所在的平面的法線即可。

生成頂點法線算法

unity頂點法線,Unity,unity,游戲引擎
創(chuàng)建網(wǎng)格,并設(shè)定如上圖的八個點位,三角形序列,uv

 		Mesh mesh = new Mesh();
        Vector3[] vertices = new Vector3[8];
        vertices[0] = new Vector3(0,0,0);
        vertices[1] = new Vector3(0,1,0);
        vertices[2] = new Vector3(1,0,0);
        vertices[3] = new Vector3(1,1,0);
        
        vertices[4] = new Vector3(1,0,0);
        vertices[5] = new Vector3(1,1,0);
        vertices[6] = new Vector3(2,0,1);
        vertices[7] = new Vector3(2,1,1);
        mesh.vertices = vertices;
        
        int[] triangles = new int[12];
        triangles[0] = 0;
        triangles[1] = 1;
        triangles[2] = 3;
        
        triangles[3] = 2;
        triangles[4] = 0;
        triangles[5] = 3;
        
        triangles[6] = 4;
        triangles[7] = 5;
        triangles[8] = 7;

        triangles[9] = 6;
        triangles[10] = 4;
        triangles[11] = 7;
        
        mesh.triangles = triangles;

        Vector2[] uv = new Vector2[8];
        uv[0] = new Vector2(0,0);
        uv[1] = new Vector2(0,1);
        uv[2] = new Vector2(1,0);
        uv[3] = new Vector2(1,1);
        
        uv[4] = new Vector2(0,0);
        uv[5] = new Vector2(0,1);
        uv[6] = new Vector2(1,0);
        uv[7] = new Vector2(1,1);
        mesh.uv = uv;

生成法線數(shù)組

 Vector3[] normals = new Vector3[8];
        Vector3 v1 = Vector3.Cross(vertices[0] - vertices[1], vertices[0] - vertices[3]);
        normals[0] = v1;
        normals[1] = v1;
        normals[2] = v1;
        normals[3] = v1;

        Vector3 v2 = Vector3.Cross(vertices[4] - vertices[5], vertices[4] - vertices[7]);
        normals[4] = v2;
        normals[5] = v2;
        normals[6] = v2;
        normals[7] = v2;
        mesh.normals = normals;
        //mesh.RecalculateNormals();

最終效果

unity頂點法線,Unity,unity,游戲引擎

(此案例中,使用Mesh.RecalculateNormal,也可生成正確法線。)文章來源地址http://www.zghlxwxcb.cn/news/detail-639941.html

完整代碼,增加了點位, 注釋部分為增加了背部網(wǎng)格

   public Mesh CreatMeshTest()
    {
        Mesh mesh = new Mesh();
        Vector3[] vertices = new Vector3[12];
        vertices[0] = new Vector3(0,0,0);
        vertices[1] = new Vector3(0,1,0);
        vertices[2] = new Vector3(1,0,0);
        vertices[3] = new Vector3(1,1,0);
        
        vertices[4] = new Vector3(1,0,0);
        vertices[5] = new Vector3(1,1,0);
        vertices[6] = new Vector3(0.5f,0,1);
        vertices[7] = new Vector3(0.5f,1,1);
        
        vertices[8] = new Vector3(0.5f,0,1);
        vertices[9] = new Vector3(0.5f,1,1);
        vertices[10] = new Vector3(0,0,0);
        vertices[11] = new Vector3(0,1,0);
        mesh.vertices = vertices;
        
        int[] triangles = new int[18];
        triangles[0] = 0;
        triangles[1] = 1;
        triangles[2] = 3;
        
        triangles[3] = 2;
        triangles[4] = 0;
        triangles[5] = 3;
        
        triangles[6] = 4;
        triangles[7] = 5;
        triangles[8] = 7;

        triangles[9] = 6;
        triangles[10] = 4;
        triangles[11] = 7;
        
        triangles[12] = 8;
        triangles[13] = 9;
        triangles[14] = 11;

        triangles[15] = 10;
        triangles[16] = 8;
        triangles[17] = 11;
        
        // triangles[18] = 0;
        // triangles[19] = 3;
        // triangles[20] = 1;
        //
        // triangles[21] = 2;
        // triangles[22] = 3;
        // triangles[23] = 0;
        //
        // triangles[24] = 4;
        // triangles[25] = 7;
        // triangles[26] = 5;
        //
        // triangles[27] = 6;
        // triangles[28] = 7;
        // triangles[29] = 4;
        //
        // triangles[30] = 8;
        // triangles[31] = 11;
        // triangles[32] = 9;
        //
        // triangles[33] = 10;
        // triangles[34] = 11;
        // triangles[35] = 8;
        
        mesh.triangles = triangles;

        Vector2[] uv = new Vector2[12];
        uv[0] = new Vector2(0,0);
        uv[1] = new Vector2(0,1);
        uv[2] = new Vector2(1,0);
        uv[3] = new Vector2(1,1);
        
        uv[4] = new Vector2(0,0);
        uv[5] = new Vector2(0,1);
        uv[6] = new Vector2(1,0);
        uv[7] = new Vector2(1,1);
        
        uv[8] = new Vector2(0,0);
        uv[9] = new Vector2(0,1);
        uv[10] = new Vector2(1,0);
        uv[11] = new Vector2(1,1);
        mesh.uv = uv;
        
        Vector3[] normals = new Vector3[12];
        Vector3 v1 = Vector3.Cross(vertices[0] - vertices[1], vertices[0] - vertices[3]);
        normals[0] = v1;
        normals[1] = v1;
        normals[2] = v1;
        normals[3] = v1;

        Vector3 v2 = Vector3.Cross(vertices[4] - vertices[5], vertices[4] - vertices[7]);
        normals[4] = v2;
        normals[5] = v2;
        normals[6] = v2;
        normals[7] = v2;
        
        Vector3 v3 = Vector3.Cross(vertices[8] - vertices[9], vertices[8] - vertices[11]);
        normals[8] = v3;
        normals[9] = v3;
        normals[10] = v3;
        normals[11] = v3;
        mesh.normals = normals;
        //mesh.RecalculateNormals();
        return mesh;

    }

到了這里,關(guān)于【Unity】為網(wǎng)格生成頂點法線(Mesh.RecalculateNormals計算異常的解決方案)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Unity網(wǎng)格篇Mesh(二)

    Unity網(wǎng)格篇Mesh(二)

    本文接上一遍Unity網(wǎng)格篇Mesh(二) 我們的網(wǎng)格目前處于一種特殊的情況下。因為我們到目前為止還沒有給他們法線向量,默認的法線向量是(0,0,1)(垂直于屏幕向里),而我們需要的正好相反。 法線工作原理是什么呢? 法線是垂直于面的向量。我們通常使用單位長度的法向量

    2024年01月17日
    瀏覽(20)
  • Unity中實時獲取網(wǎng)格上點的位置,還有對應(yīng)的面和法線

    Unity中實時獲取網(wǎng)格上點的位置,還有對應(yīng)的面和法線

    在Unity中,可以使用Mesh類來獲取一個網(wǎng)格上點的位置以及對應(yīng)的面和法線。以下是具體步驟: 在腳本中,需要先獲取要操作的網(wǎng)格對象。可以使用以下代碼: Mesh mesh = GetComponentMeshFilter().mesh; 其中,GetComponentMeshFilter()用于獲取該游戲?qū)ο笊系腗eshFilter組件,mesh屬性用于獲取該

    2024年02月08日
    瀏覽(21)
  • 論文解讀Nerf2Mesh:基于Nerf的網(wǎng)格資產(chǎn)生成

    論文解讀Nerf2Mesh:基于Nerf的網(wǎng)格資產(chǎn)生成

    論文標題 Delicate Textured Mesh Recovery from NeRF via Adaptive Surface Refinement 簡單翻譯:通過Nerf恢復(fù)網(wǎng)格結(jié)構(gòu) 論文下載地址,點這里 1:網(wǎng)格知識點介紹(可跳過): 3D模型有三種表達方式, 體素(Voxel),網(wǎng)格(Mesh),點云(Point Cloud) 、SDF等,但在實際渲染應(yīng)用中,主流的表達方

    2024年02月02日
    瀏覽(31)
  • 關(guān)于unity粒子系統(tǒng)renderer設(shè)為mesh(網(wǎng)格)模式后無法旋轉(zhuǎn)的問題

    關(guān)于unity粒子系統(tǒng)renderer設(shè)為mesh(網(wǎng)格)模式后無法旋轉(zhuǎn)的問題

    ?將其中的render alignment設(shè)為local就可以了

    2024年02月12日
    瀏覽(37)
  • unity C# 讀取shp并生成mesh(ShpLoader使用)

    unity C# 讀取shp并生成mesh(ShpLoader使用)

    聲明 使用?: Unity讀取并解析Shapefile地圖文件_SuperWiwi的博客-CSDN博客_unity讀取shp 結(jié)構(gòu)參考: 文件頭_GIS基礎(chǔ)工具篇01C#讀寫shp矢量文件_賤賤豬66的博客-CSDN博客 github: ?https://github.com/EIdeallab/ShpLoader 注意問題:拿到數(shù)據(jù)后先Arcgis打開 1 編碼格式? ?更多情況是數(shù)據(jù)來源自其它地方

    2024年02月11日
    瀏覽(40)
  • VCG 網(wǎng)格頂點聚類

    頂點聚類方法將落在給定大小體素中的所有頂點集中到單個頂點之上,其過程有點類似于點云體素下采樣,之后再基于聚類之后的頂點重新連接面片,以達到網(wǎng)格簡化的目的。

    2024年01月15日
    瀏覽(19)
  • 【unity】RenderFeature的應(yīng)用(生成水平面的網(wǎng)格線)

    【unity】RenderFeature的應(yīng)用(生成水平面的網(wǎng)格線)

    在URP里RenderFeature是用于后處理效果上的,也還可以實現(xiàn)一些特殊的效果,比如生成網(wǎng)格線。我們可以使用 CommandBuffer來創(chuàng)建地面網(wǎng)格,這樣的話可以通過調(diào)整 CommandBuffer的參數(shù)來控制地面網(wǎng)格的密度。 實現(xiàn)效果 創(chuàng)建流程 創(chuàng)建RenderFeature模板 編寫CommandBuffer生成網(wǎng)格方法 增加到

    2024年02月12日
    瀏覽(17)
  • 虛幻UE 材質(zhì)-頂點/網(wǎng)格體繪制、Megascans材質(zhì)混合

    虛幻UE 材質(zhì)-頂點/網(wǎng)格體繪制、Megascans材質(zhì)混合

    首先很高興大家能夠關(guān)注我,提前在2023年結(jié)束達到百粉! 然后這篇文章是使用虛幻UE 的網(wǎng)格體/頂點繪制模式來對Megascans材質(zhì)進行混合的實驗。 注意:以下材質(zhì)都是指材質(zhì)實例,網(wǎng)格體繪制和頂點繪制一個意思 1、頂點繪制模型: 需要模型的面數(shù)盡量多一點,官方的立方體面

    2024年02月03日
    瀏覽(95)
  • UE4 頂點網(wǎng)格動畫播放后渲染模糊問題

    UE4 頂點網(wǎng)格動畫播放后渲染模糊問題

    問題描述:ABC格式的頂點網(wǎng)格動畫播放結(jié)束后,改模型看起來顯得很模糊有抖動的樣子 解決辦法:關(guān)閉逐骨骼動態(tài)模糊

    2024年02月07日
    瀏覽(25)
  • 服務(wù)網(wǎng)格Service Mesh和Istio

    服務(wù)網(wǎng)格Service Mesh和Istio

    服務(wù)網(wǎng)格是一種用于處理微服務(wù)架構(gòu)中服務(wù)間通信的網(wǎng)絡(luò)基礎(chǔ)架構(gòu)。它通過在應(yīng)用程序的每個服務(wù)之間插入代理(通常稱為Sidecar代理),來實現(xiàn)服務(wù)間通信的控制和管理。這種方式將通信邏輯從應(yīng)用程序代碼中解耦出來,使得開發(fā)人員可以專注于業(yè)務(wù)邏輯而無需擔(dān)心網(wǎng)絡(luò)通信

    2024年02月22日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包