1. 程式人生 > >Unity Mesh(五) Mesh 立方體Cube貼圖以及六個面分別貼不同的圖片

Unity Mesh(五) Mesh 立方體Cube貼圖以及六個面分別貼不同的圖片

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Test3D : MonoBehaviour
{

    public enum Direction
    {
        ClockWise,
        Anti_ClockWise
    }

    public Material mat;

    public Direction direction;

    // Use this for initialization
    void Start()
    {
        switch (direction)
        {
            case Direction.ClockWise:
                DrawCubeWithUV_CloclWise();
                break;
            case Direction.Anti_ClockWise:
                DrawCubeWithUV_Anti_CloclWise();
                break;
        }
    }



    void DrawCubeWithUV_CloclWise()
    {
        gameObject.GetComponent<MeshRenderer>().material = mat;

        Mesh mesh = GetComponent<MeshFilter>().mesh;
        mesh.Clear();

        //設定頂點
        mesh.vertices = new Vector3[]
        {
            //front
            new Vector3(0, 0, 0),
            new Vector3(0, 0, 1),
            new Vector3(1, 0, 1),
            new Vector3(1, 0, 0),

            //top
            new Vector3(0, 0, 1),
            new Vector3(0, 1, 1),
            new Vector3(1, 1, 1),
            new Vector3(1, 0, 1),

            //back
            new Vector3(0, 1, 1),
            new Vector3(0, 1, 0),
            new Vector3(1, 1, 0),
            new Vector3(1, 1, 1),

            //bottom
            new Vector3(0, 1, 0),
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0),
            new Vector3(1, 1, 0),

            //left
            new Vector3(0, 1, 0),
            new Vector3(0, 1, 1),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, 0),

            //right
            new Vector3(1, 0, 0),
            new Vector3(1, 0, 1),
            new Vector3(1, 1, 1),
            new Vector3(1, 1, 0),
        };



        //順時針看不到正面的,貼圖在裡面
        mesh.triangles = new int[]
       {
              0,1,2,
              0,2,3,
              4,5,6,
              4,6,7,
              8,9,10,
              8,10,11,
              12,13,14,
              12,14,15,
              16,17,18,
              16,18,19,
              20,21,22,
              20,22,23

       };

        Vector2[] uvs = new Vector2[mesh.vertices.Length];
        for (int i = 0; i < uvs.Length; i += 4)
        {
            //正常貼圖
            uvs[i] = new Vector2(0, 0);
            uvs[i + 1] = new Vector2(0, 1);
            uvs[i + 2] = new Vector2(1, 1);
            uvs[i + 3] = new Vector2(1, 0);

            //轉換貼圖
            //uvs[i] = new Vector2(1, 0);
            //uvs[i + 1] = new Vector2(1, 1);
            //uvs[i + 2] = new Vector2(0, 1);
            //uvs[i + 3] = new Vector2(0, 0);
        }
        mesh.uv = uvs;

        //Vector3[] normals = new Vector3[mesh.vertices.Length];
        //for (int i = 0; i < normals.Length; i++)
        //{
        //    if (i < 4)
        //        normals[i] = Vector3.forward;
        //    if (i >= 4 && i < 8)
        //        normals[i] = Vector3.up;
        //    if (i >= 8 && i < 12)
        //        normals[i] = Vector3.back;
        //    if (i >= 12 && i < 16)
        //        normals[i] = Vector3.down;
        //    if (i >= 16 && i < 20)
        //        normals[i] = Vector3.left;
        //    if (i >= 20 && i < 24)
        //        normals[i] = Vector3.right;
        //}
        //mesh.normals = normals;
    }

    void DrawCubeWithUV_Anti_CloclWise()
    {
        gameObject.GetComponent<MeshRenderer>().material = mat;

        Mesh mesh = GetComponent<MeshFilter>().mesh;
        mesh.Clear();

        //設定頂點
        mesh.vertices = new Vector3[]
        {
            //front
            new Vector3(0, 0, 0),
            new Vector3(0, 0, 1),
            new Vector3(1, 0, 1),
            new Vector3(1, 0, 0),

            //top
            new Vector3(0, 0, 1),
            new Vector3(0, 1, 1),
            new Vector3(1, 1, 1),
            new Vector3(1, 0, 1),

            //back
            new Vector3(0, 1, 1),
            new Vector3(0, 1, 0),
            new Vector3(1, 1, 0),
            new Vector3(1, 1, 1),

            //bottom
            new Vector3(0, 1, 0),
            new Vector3(0, 0, 0),
            new Vector3(1, 0, 0),
            new Vector3(1, 1, 0),

            //left
            new Vector3(0, 1, 0),
            new Vector3(0, 1, 1),
            new Vector3(0, 0, 1),
            new Vector3(0, 0, 0),

            //right
            new Vector3(1, 0, 0),
            new Vector3(1, 0, 1),
            new Vector3(1, 1, 1),
            new Vector3(1, 1, 0),
        };

        //逆時針看到的很好,但是貼圖反了
        mesh.triangles = new int[]
       {
              0,2,1,
              0,3,2,
              4,6,5,
              4,7,6,
              8,10,9,
              8,11,10,
              12,14,13,
              12,15,14,
              16,18,17,
              16,19,18,
              20,22,21,
              20,23,22
       };
#if false
        //六個面貼同一張圖片
        Vector2[] uvs = new Vector2[mesh.vertices.Length];
        for (int i = 0; i < uvs.Length; i += 4)
        {
            //uvs[i] = new Vector2(0, 0);
            //uvs[i + 1] = new Vector2(0, 1);
            //uvs[i + 2] = new Vector2(1, 1);
            //uvs[i + 3] = new Vector2(1, 0);
            uvs[i] = new Vector2(1, 0);
            uvs[i + 1] = new Vector2(1, 1);
            uvs[i + 2] = new Vector2(0, 1);
            uvs[i + 3] = new Vector2(0, 0);
        }
        mesh.uv = uvs;
#else
        //六個面貼不同的圖片
        Vector2[] uvs = sixTexForCube(mesh.vertices);
        mesh.uv = uvs;
#endif
        //法線
        //Vector3[] normals = new Vector3[mesh.vertices.Length];
        //for (int i = 0; i < normals.Length; i++)
        //{
        //    if (i < 4)
        //        normals[i] = Vector3.forward;
        //    if (i >= 4 && i < 8)
        //        normals[i] = Vector3.up;
        //    if (i >= 8 && i < 12)
        //        normals[i] = Vector3.back;
        //    if (i >= 12 && i < 16)
        //        normals[i] = Vector3.down;
        //    if (i >= 16 && i < 20)
        //        normals[i] = Vector3.left;
        //    if (i >= 20 && i < 24)
        //        normals[i] = Vector3.right;
        //}
        //mesh.normals = normals;
    }

    Vector2[] sixTexForCube(Vector3[] verticles)
    {
        Vector2[] uv = new Vector2[verticles.Length];

        float t = 1 / 3f;

        //front
        uv[0] = new Vector2(t, 0);
        uv[1] = new Vector2(t, t);
        uv[2] = new Vector2(0, t);
        uv[3] = new Vector2(0, 0);

        //top
        uv[4] = new Vector2(2 * t, 0);
        uv[5] = new Vector2(2 * t, t);
        uv[6] = new Vector2(t, t);
        uv[7] = new Vector2(t, 0);

        //back
        uv[8] = new Vector2(1, 0);
        uv[9] = new Vector2(1, t);
        uv[10] = new Vector2(2 * t, t);
        uv[11] = new Vector2(2 * t, 0);

        //Bottom
        uv[12] = new Vector2(t, t);
        uv[13] = new Vector2(t, 2 * t);
        uv[14] = new Vector2(0, 2 * t);
        uv[15] = new Vector2(0, t);

        //left
        uv[16] = new Vector2(2 * t, t);
        uv[17] = new Vector2(2 * t, 2 * t);
        uv[18] = new Vector2(t, 2 * t);
        uv[19] = new Vector2(t, t);

        //right
        uv[20] = new Vector2(1, t);
        uv[21] = new Vector2(1, 2 * t);
        uv[22] = new Vector2(2 * t, 2 * t);
        uv[23] = new Vector2(2 * t, t);

        return uv;
    }
}


相關推薦

Unity Mesh() Mesh 立方體Cube以及分別不同圖片

using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))] public class Test3D : MonoBehaviour { publi

unity 中帶以及動畫的模型檔案轉為 lowpoly 風格的方法

本篇講述的是使用程式碼來修改的方法,其實unity已經給我們提供了設定的方法:Normals選擇Calculate,Smoothing Angle調整為0即可。原文章中主要是沒有提到UV以及骨骼與定點的繫結方法。由於實現lowpoly的風格其實就是將原來的1個點複製為多個點,

【原】高光參數放入顏色的alpha通道中

llb ceo -- shade struct surf render fall diffuse 今天美術想把高光貼圖參數合成到Main貼圖中,減少貼圖數,挺好,知道省內存了。 於是簡單改了改surface著色器。 Shader "Custom/HighLightByAlp

Unity Mesh(七) Mesh給球

之前在    中已經說明了如何畫球,現在我們在這個球的基礎上貼圖。           這裡我們有個極座標和直角座標的轉換,具體我也不是很明白,反正就是拿來用吧,據某位大神講解,極座標(球座標)由球半徑,水平角和垂直角決定,我們完全可以理解為三維座標轉換成uv座標的

Unity Mesh(四) Mesh 平面圖形的

前面都講了怎麼畫,沒有寫怎麼貼圖,上一篇提到了法線,今天這篇會說說平面圖形的貼圖。 為了更好的觀察,我們使用這張圖片來進行貼圖(可以右擊儲存): 一、三角形貼圖 三角形的貼圖是最簡單的,因為我們畫的三角形就簡單,直接根據點來選取: 首先說下貼圖的座標系:如下圖

動態載入烘培與Terrain轉mesh

前言 unity載入烘培貼圖是需要載入場景才可以使用,但如果專案只使用一個場景或者有許多關卡地形時,明顯通過載入場景來達到更換烘培貼圖的這種做法是不妥當的。而terrain地形在有些安卓機上的支援並不是很好,所以有必要把地形轉為網格。慶幸的是,網上也有這方面的

立方體環境Cube Mapping)之OpenGL原理

立方體紋理是一種特殊的紋理技術,它用6幅二維紋理影象構成一個以原點為中心的紋理立方體。對於每個片段,紋理座標(s, t, r)被當作方向向量看待,每個紋理單元都表示從原點所看到的紋理立方體上的影象。 一個典型的立方環境貼圖如下:                      

FairyGUI UIPanel看不到顯示UI的Mesh的問題

初學FairyGUI,看例子,FairyGUI在Editor中顯示UI的時候是先選擇Package名,在選擇Component名,然後在場景裡面就可以顯示包裡面的元件,這時就有一個問題,底層到底做了什麼使得UIPanel能夠顯示Mesh和貼圖? 看了Fairy

Unity Shader 法線的實現

計算 變換 float minus include 的確 dal 反射 mode 這裏有一個細節,關於法線貼圖是有兩個不同的空間的,如下:   切線空間:法線貼圖顏色為偏藍色   模型空間:法線貼圖顏色為五顏六色 因此根據不同的空間變換位置方便一致計算。 1 // 法

unity

inf 因此 基礎上 tro 控制 ron lmap 導入 金屬 貼圖的英語 Map 其實包含了另一層含義就是“映射”。其功能就是把紋理通過 UV 坐標映射到3D 物體表面。貼圖包含了除了紋理以外其他很多信息,比方說 UV 坐標、貼圖輸入輸出控制等等。材質是一個數據集,主要

ShaderLab學習小結(十)法線的簡單Shader

otl mvp truct 沒有 模型 視覺 有一個 rdb 值範圍 目標:賦予材質法線貼圖,並能響應光照的變化,體現出凹凸感。場景中只有一個主平行光找了一張法線貼圖(網上蕩的)在unity裏別忘了把這張圖設為normalmap先看一下,如果只是作為普通貼圖,賦在Diffu

Unity使用腳本進行批量動態加載

它的 有關 技術 post 應該 而且 下一步 AI 屬性。 先描述一下我正在做的這個項目,是跑酷類音遊。 那麽跑酷類音遊在繪制跑道上的時候,就要考慮不同的磚塊顯示問題。假設我有了一個節奏列表,那麽我們怎麽將不同的貼圖貼到不同的磚塊上去呢? 我花了好幾個小時才搞清楚裏面的門

blender 帶與顏色材質的模型,導入到Unity

發現 dba http 就是 技術 有用 自己 oss bee Blender初學環境:win10 x64blender 2.79unity 5.6.2 之前不論是用導出fbx,還是把 .blend文件拽入u3d中,原先的貼圖就沒有了研究了很多天,才發現一個我這裏可用的方法

Unity的www網路下載類(以替換模型為例說明)

一、編寫給模型替換貼圖的指令碼 /*** * * Title: * 網路基礎 * * * Description: * 功能: * WWW 下載類的學習 * * Date: 20

Unity 動態生成mesh圓圈

  using UnityEngine; using System.Collections; [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))] public class yuan : MonoBehaviour

Unity Shader程式設計 (一)簡單凹凸和自選邊緣顏色和強度的shader編寫

程式碼轉自: http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星雲(淺墨)  Shader "淺墨Shader程式設計/0.TheFirstShader"  {  &nb

Unity中的法線、漫反射及高光

我們都知道,一個三維場景的畫面的好壞,百分之四十取決於模型,百分之六十取決於貼圖,可見貼圖在畫面中所佔的重要性。在這裡我將列舉一些貼圖,並且初步闡述其概念,理解原理的基礎上製作貼圖,也就順手多了。 我在這裡主要列舉幾種UNITY3D中常用的貼圖,與大家分享,希望對大家有幫助。  

unity標準Shader之十種型別

                                                           十種貼圖型別 介紹:標準 Shader 貼圖 標準 Shader 使用的是 PBR 渲染,基於現實物理效果的渲染表現形式。 一個模型能不能使用標準 Shad

Unity處理

專案逼近後期,效能問題尤為突出。卡頓、幀數很低、記憶體過高等問題一一擺在面前。 就先從記憶體說起吧。 影響遊戲記憶體的因數有很多:比如說紋理、網格、動畫、音訊、Mono堆記憶體等。 今天咱們主要研究一

Unity標準 Shader 下的十種型別

一、Main Maps 主貼圖區域 1.Albedo 貼圖 ** Albedo:反照率[貼圖];用於體現模型的紋理,顏色。 反照率貼圖本身是一張顏色與紋理的貼圖。 該選項有貼圖屬性,也有顏色屬性。 兩個屬性可以單獨使用,也可以組合使用; 當顏色屬性為純白色時,