用Mesh网格绘制Cube及uv给其贴图(8个顶点绘制Cube、24个顶点绘制Cube)

1 篇文章 0 订阅

 1.效果图

2.代码实现 

创建一个空对象将代码脚本挂上即可

(1)此方法是使用24个顶点实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]

public class DrawMesh : MonoBehaviour
{
    Mesh mesh;
    [SerializeField]
    Texture2D texture2D; //要赋上的图片  手动拖

    // Start is called before the first frame update
    void Start()
    {
        mesh = new Mesh();
        Vector3 pos= transform.position;

        // 设定的顶点坐标是从左下顺时针
        //顶点位置
        mesh.vertices = new Vector3[] { 
            // 完整的
            new Vector3(-0.5f,-0.5f,-0.5f), new Vector3(-0.5f, 0.5f, -0.5f), new Vector3(0.5f,0.5f,-0.5f) ,new Vector3(0.5f,-0.5f,-0.5f), //前面
            new Vector3(0.5f,-0.5f,0.5f), new Vector3(0.5f, 0.5f, 0.5f), new Vector3(-0.5f,0.5f,0.5f) ,new Vector3(-0.5f,-0.5f,0.5f) , //后面 
            new Vector3(-0.5f,-0.5f,0.5f), new Vector3(-0.5f, 0.5f, 0.5f), new Vector3(-0.5f,0.5f,-0.5f) ,new Vector3(-0.5f,-0.5f,-0.5f) , //左面 
            new Vector3(0.5f,-0.5f,-0.5f), new Vector3(0.5f, 0.5f, -0.5f), new Vector3(0.5f,0.5f,0.5f) ,new Vector3(0.5f,-0.5f,0.5f) , //右面 
            new Vector3(-0.5f,0.5f,-0.5f), new Vector3(-0.5f, 0.5f, 0.5f), new Vector3(0.5f,0.5f,0.5f) ,new Vector3(0.5f,0.5f,-0.5f) , //上面 
            new Vector3(-0.5f,-0.5f,0.5f), new Vector3(-0.5f, -0.5f, -0.5f), new Vector3(0.5f,-0.5f,-0.5f) ,new Vector3(0.5f,-0.5f,0.5f) //下面 
        };
        //三角形索引
        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, //下面
        };
        // uv 贴图  注意一定要对奇 不然图片可能歪或者不完整
        mesh.uv = new Vector2[] { 
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0),
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0),
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0),
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0),
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0),
            new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1), new Vector2(1, 0)
        };
        mesh.RecalculateNormals(); // 法线  

        GetComponent<MeshFilter>().mesh = mesh;

        Material mat = new Material(Shader.Find("Standard"));
        mat.mainTexture = texture2D;
        GetComponent<MeshRenderer>().material = mat;
    }

}
(2)此方法是使用8个顶点实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]

public class CrateTwo : MonoBehaviour
{
    Mesh mesh;
    // Start is called before the first frame update
    void Start()
    {
        mesh = new Mesh();
        mesh.vertices = new Vector3[] {
            Vector3.zero,new Vector3(0,1,0),new Vector3(1,1,0),new Vector3(1,0,0), //前面
            new Vector3(1,0,1),new Vector3(1,1,1),new Vector3(0,1,1),new Vector3(0,0,1) //后面
        };
        mesh.triangles = new int[]
        {
            0,1,2,0,2,3, //前
            4,5,6,4,6,7, //后
            7,6,1,7,1,0, //左
            3,2,5,3,5,4, //右
            1,6,5,1,5,2, //上
            7,0,3,7,3,4, //下
        };
        mesh.RecalculateNormals();
        GetComponent<MeshFilter>().mesh = mesh;
        Material mat = new Material(Shader.Find("Standard"));
        GetComponent<Renderer>().material = mat;
    }

}

 小菜不易,感谢观看,学到了就留下个支持的赞吧!

关注我,了解更多Unity相关知识哦!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是一个示例代码,用于在Blender中使用顶点UV和法线数据创建一个立方体: ```python import bpy import bmesh from mathutils import Vector # 定义立方体的顶点UV和法线数据 verts = [ Vector((0, 0, 0)), Vector((0, 1, 0)), Vector((1, 1, 0)), Vector((1, 0, 0)), Vector((0, 0, 1)), Vector((0, 1, 1)), Vector((1, 1, 1)), Vector((1, 0, 1)), ] uvs = [ Vector((0, 0)), Vector((0, 1)), Vector((1, 1)), Vector((1, 0)), ] norms = [ Vector((0, 0, -1)), Vector((0, 0, 1)), Vector((0, -1, 0)), Vector((0, 1, 0)), Vector((-1, 0, 0)), Vector((1, 0, 0)), ] # 创建一个网格对象 mesh = bpy.data.meshes.new("Cube") # 创建一个 BMesh 对象并添加顶点、面和 UV 数据 bm = bmesh.new() for v in verts: bm.verts.new(v) for i in range(0, 8, 4): face = bm.faces.new((bm.verts[i], bm.verts[i+1], bm.verts[i+2], bm.verts[i+3])) for j, loop in enumerate(face.loops): loop[bm.loops.layers.uv.active].uv = uvs[j] bm.normal_update() for i, f in enumerate(bm.faces): f.normal = norms[i] # 将 BMesh 对象转换为网格对象 bm.to_mesh(mesh) mesh.update() # 创建一个对象,并将网格对象作为其数据 obj = bpy.data.objects.new("Cube", mesh) # 将对象添加到场景中 bpy.context.scene.collection.objects.link(obj) # 将对象选中并将视图切换到对象模式 bpy.context.view_layer.objects.active = obj obj.select_set(True) bpy.ops.object.mode_set(mode='OBJECT') ``` 该代码使用了Blender的Python API,首先定义了顶点UV和法线数据,然后使用BMesh对象创建了一个立方体的网格,并将其转换为网格对象。然后将网格对象分配给一个新创建的对象,并将该对象添加到场景中。最后,将对象选择并将视图切换到对象模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不食卷心菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值