Unity系统Cube的法线

Unity基础篇-UV坐标和法线 unity uv坐标和法线详解 阅读详情

前几天在搞一个Voxel的项目,盒子的表现不美观,于是想给Voxel加上法线增强盒子的立体效果,给shader里加了法线,但是显示出来法线效果不对,绕了很大一圈。
一开始怀疑是法线方向不对,法线反了就看不到啊,应该也没反。
UV顺序不对吗?UV没顶点重合不会看不到。
后来才发现MagicVoxel For unity的包是没有切线数据的,没切线数据无法正确显示。

切线的描述:

Mesh.tangents 网格切线
var tangents : Vector4[]
Description描述
The tangents of the mesh.
网格的切线
Tangents are mostly used in bump-mapped shaders. A tangent is a unit length vector that follows mesh surface along horizontal (U) texture direction. Tangents in Unity are represented as Vector4, with x,y,z components defining the vector, and w used to flip the binormal if needed.
切线主要用于bump-mapped shaders。切线是一个有方向的单位长度,沿着网格表面指向水平(U)纹理方向。在Unity中切线被描述为Vector4,包括x,y,z这些组件定义的矢量,如果需要,及w用来翻转副法线。
Unity calculates the other surface vector (binormal) by taking a cross product between normal and tangent, and multiplying result by tangent.w. Thus w should always be 1 or -1.
Unity通过计算向量和法线的叉乘来计算其他表面的向量(副法线),并乘以tangent.w。因此w应该总是1或者-1。
You should calculate tangents yourself if you plan to use bump-mapped shaders on the mesh. Assign tangents after assigning normals or using RecalculateNormals
如果你计划在网格上用凹凸贴图着色器,你应该自己计算切线。在赋值法线或者用RecalculateNormals之后再赋值切线。

另外看MagicVoxel的源码,发现法线数据都是和面同一方向的,记得unity的Cube法线貌似不全是垂直于平面的,今天抽空写个脚本显示出来看看。

先上图

cube normal

每个面的4个顶点是一种颜色,数字编号是顶点的顺序编号,看起来直观一些。
白色的法线是世界Forward方向,也是第一个面。
黑色是面向我们的面,这个面的上面两个顶点的法线是向上的。和上方的面的重合的顶点的法线互换了。(这里后期研究下)
左右和下方两个面法线是垂直于面的。

贴上代码:方便下次研究

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CNVTest : MonoBehaviour
{
    MeshFilter mf;
    Color[] c = new Color[6];

    void Start()
    {
        mf = GetComponent<MeshFilter>();
        int i, no;
        int m;
        GameObject oParent = null;

        c[0] = Color.white;
        c[1] = Color.yellow;
        c[2] = Color.red;
        c[3] = Color.green;
        c[4] = Color.blue;
        c[5] = Color.cyan;

     
        no = 0;
        m = 0;
        for (i=0; i < mf.mesh.uv.Length; i++)
        {
            m = i % 4;
            if (m == 0)
            {
                no = i / 4;
                oParent = new GameObject("v_"+no.ToString());
                oParent.transform.SetParent(transform);
                oParent.transform.localPosition = Vector3.zero;
                oParent.transform.localRotation = Quaternion.identity;
            }
            //顶点
            GameObject ob = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            ob.transform.SetParent(oParent.transform);
            ob.transform.localScale = Vector3.one * 0.07f;
            ob.transform.localRotation = Quaternion.identity;
            ob.transform.localPosition = mf.mesh.vertices[i];
            CNormal nm = ob.AddComponent<CNormal>();
            nm.dir = mf.mesh.normals[i];
            nm.c = c[no];
            nm.txt = string.Format("vertice:{0},uv:{1}", i, mf.mesh.uv[i]);
            

            Debug.Log("cube:i=" + i + ",ver:" + mf.mesh.vertices[i] + ",uv:" + mf.mesh.uv[i] + ",normal:" + mf.mesh.normals[i]);
        }
    }

    
}

这个脚本会自动添加到顶点。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CNormal : MonoBehaviour
{
    public Vector3 dir;
    public Color c;
    public string txt;

    GUIStyle fontStyle = new GUIStyle();

    public Vector3[] lines = new Vector3[2];

    //划线显示法线
    LineRenderer linerender;
    Material mat;
    Camera cam;
    void Start()
    {
        fontStyle.normal.background = null;    //设置背景填充
        fontStyle.normal.textColor = c;// new Color(1, 0, 0);   //设置字体颜色

        linerender = gameObject.AddComponent<LineRenderer>();

        mat = new Material(Shader.Find("Standard"));
        mat.color = c;
        linerender.material = mat;
        linerender.startWidth = 0.01f;// .SetWidth(0.01f, 0.01f);
        linerender.endWidth = 0.01f;
        

        cam = Camera.main;
    }

    void OnGUI()
    {
        lines[0] = transform.position;
        lines[1] = transform.position + transform.rotation * dir;
        linerender.SetPositions(lines);

        Vector3 screenPos = cam.WorldToScreenPoint(lines[1]);
        GUI.Label(new Rect(screenPos.x, Screen.height - screenPos.y, 680, 50), txt, fontStyle);
    }

}


补一张带UV的,能看到法线和UV。
在这里插入图片描述

cube:i=0,ver:(0.5, -0.5, 0.5),uv:(0.0, 0.0),normal:(0.0, 0.0, 1.0)

cube:i=1,ver:(-0.5, -0.5, 0.5),uv:(1.0, 0.0),normal:(0.0, 0.0, 1.0)

cube:i=2,ver:(0.5, 0.5, 0.5),uv:(0.0, 1.0),normal:(0.0, 0.0, 1.0)

cube:i=3,ver:(-0.5, 0.5, 0.5),uv:(1.0, 1.0),normal:(0.0, 0.0, 1.0)

cube:i=4,ver:(0.5, 0.5, -0.5),uv:(0.0, 1.0),normal:(0.0, 1.0, 0.0)

cube:i=5,ver:(-0.5, 0.5, -0.5),uv:(1.0, 1.0),normal:(0.0, 1.0, 0.0)

cube:i=6,ver:(0.5, -0.5, -0.5),uv:(0.0, 1.0),normal:(0.0, 0.0, -1.0)

cube:i=7,ver:(-0.5, -0.5, -0.5),uv:(1.0, 1.0),normal:(0.0, 0.0, -1.0)

cube:i=8,ver:(0.5, 0.5, 0.5),uv:(0.0, 0.0),normal:(0.0, 1.0, 0.0)

cube:i=9,ver:(-0.5, 0.5, 0.5),uv:(1.0, 0.0),normal:(0.0, 1.0, 0.0)

cube:i=10,ver:(0.5, 0.5, -0.5),uv:(0.0, 0.0),normal:(0.0, 0.0, -1.0)

cube:i=11,ver:(-0.5, 0.5, -0.5),uv:(1.0, 0.0),normal:(0.0, 0.0, -1.0)

cube:i=12,ver:(0.5, -0.5, -0.5),uv:(0.0, 0.0),normal:(0.0, -1.0, 0.0)

cube:i=13,ver:(0.5, -0.5, 0.5),uv:(0.0, 1.0),normal:(0.0, -1.0, 0.0)

cube:i=14,ver:(-0.5, -0.5, 0.5),uv:(1.0, 1.0),normal:(0.0, -1.0, 0.0)

cube:i=15,ver:(-0.5, -0.5, -0.5),uv:(1.0, 0.0),normal:(0.0, -1.0, 0.0)

cube:i=16,ver:(-0.5, -0.5, 0.5),uv:(0.0, 0.0),normal:(-1.0, 0.0, 0.0)

cube:i=17,ver:(-0.5, 0.5, 0.5),uv:(0.0, 1.0),normal:(-1.0, 0.0, 0.0)

cube:i=18,ver:(-0.5, 0.5, -0.5),uv:(1.0, 1.0),normal:(-1.0, 0.0, 0.0)

cube:i=19,ver:(-0.5, -0.5, -0.5),uv:(1.0, 0.0),normal:(-1.0, 0.0, 0.0)

cube:i=20,ver:(0.5, -0.5, -0.5),uv:(0.0, 0.0),normal:(1.0, 0.0, 0.0)

cube:i=21,ver:(0.5, 0.5, -0.5),uv:(0.0, 1.0),normal:(1.0, 0.0, 0.0)

cube:i=22,ver:(0.5, 0.5, 0.5),uv:(1.0, 1.0),normal:(1.0, 0.0, 0.0)

cube:i=23,ver:(0.5, -0.5, 0.5),uv:(1.0, 0.0),normal:(1.0, 0.0, 0.0)

【Unity Shaders】Reflecting Your World —— Unity3D中的法线贴图和反射 本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。 这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。 ============================== 分割线 ============================== 写在前面 阅读详情

相关推荐

数据中心光模块升级实录:从200G QSFP56到400G QSFP-DD的踩坑指南

本文记录了数据中心从200G QSFP56升级至400G QSFP-DD光模块的完整实战经验。文章深入剖析了升级过程中面临的兼容性、链路预算、布线、散热与功耗管理等核心挑战,并提供了具体的解决方案与排坑指南,为高速网络升级提供了宝贵的实践参考。

butter的博客 481

关于Unity中Mesh网格的详解

3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面。 点和面以及纹理坐标都是通过3D建模软件建模出来的。 Unity会帮我们把模型的信息存到Mesh里面来,Mesh翻译成中文是网格。 顶点,三角形,纹理坐标,法线和切线。 3D建模软件 1:Autodesk 3D Studio Max 支持mac os windows; 2: Autodesk 3D Maya 支持windows 3: Cinema4D 支持mac..

oqqCHL的博客 3011

COMSOL仿真分析高压直流GIS/GIL绝缘性能优化

高压直流气体绝缘设备(GIS/GIL)的绝缘性能是保障电网可靠运行的关键。通过COMSOL Multiphysics多物理场仿真,可以深入分析气固界面电场分布与电荷积聚机理。该技术结合静电场、热场和电荷传输耦合计算,能准确模拟温度梯度对SF6气体与环氧树脂界面特性的影响。工程实践中,这类仿真可优化导体结构设计、改进绝缘材料配方,并建立电场-温度关联预警模型。特别是在80℃高温工况下,仿真显示界面电荷密度会显著增加23%,这对设备安全运行具有重要指导价值。

weixin_32075843的博客 193

Calculate Tangent Space是怎么计算切线的

  Unity在FBX文件的导入设置中有一个关于切线(Tangents)的设置项,通常是使用默认的Calculate Tangent Space,让Unity自动计算切线,而无需美术人员在FBX文件中制作切线。这个切线信息是用于把切线空间的法线贴图中获取到的法线信息转换到世界空间的,大部分情况下,我们不关心这个切线算出来到底是个什么样子。但是在制作各向异性头发时,我们需要知道发丝的走向,通常...

金城寺的博客 3124

LeRobot SO-ARM100 学习笔记(2) diffusion module

对 lerobot 中的 diffusion policy 进行基本的代码阅读

mikhailbran的博客 1588

Demo2Reward:用人类演示动态优化VLM奖励模型提示

多模态大模型(VLM)的奖励建模正面临核心瓶颈——静态提示导致语义鸿沟与泛化失效。其本质是将人类判断标准固化为不可更新的文本模板,使奖励信号脱离真实任务意图。Demo2Reward提出范式级改进:以结构化人类演示为元信号,驱动提示权重连续优化,实现从‘结果打分’到‘过程理解’的跃迁。该方法不修改VLM主干,却显著提升RLHF收敛效率与OOD鲁棒性,在医疗、工业质检等场景验证了跨任务迁移与热修复能力。它重新定义了提示工程的技术价值:不是前端微调,而是奖励系统的认知校准基础设施。

weixin_34302798的博客 408

Unity模型导入相关知识

Unity模型导入

qq_41044598的博客 1万+

Ubuntu系统 nano 编辑器使用教程

• 原因:文件编码不兼容(如 Windows 的 CRLF 换行符)。• 若使用 SSH 工具(如 PuTTY),确保终端设置中未占用。掌握这些操作后,你可以高效使用 nano 完成大部分文本编辑任务!• 底部快捷键栏:显示常用操作的快捷键(• 如果文件已修改,会提示是否保存:按。• 顶部状态栏:显示文件名和编辑状态。表示 Ctrl + G(查看帮助)。保存时自动生成备份文件(原文件名后加。• 强制保存只读文件:用。启动 nano 时添加。启动 nano 时添加。(重做)触发自动缩进。

qq_44534541的博客 2091

Unity Shader 基础纹理

纹理最初的目的就是使用一张图片来控制模型的外观。使用纹理映射技术,我们可以把一张图片黏在模型表面,逐纹素地控制模型的颜色。 这里简单的总结一下单张纹理,凹凸映射,渐变纹理,遮罩纹理。 单张纹理 Properties { _Color ("Color Tint", Color) = (1, 1, 1, 1) _MainTex ("Main Tex", 2D) = "white" {} _Specular ("Specular", Color) = (1, 1, 1, 1) _Gl

九本才的博客 1292

基于VisionMaster的药丸外观缺陷机器视觉检测系统实战解析

机器视觉作为工业自动化的核心技术,通过图像采集与智能分析替代人眼,实现高精度、高效率的在线检测。其核心原理在于利用相机、镜头、光源等硬件获取目标图像,再通过图像处理算法提取特征并进行识别与判断。这项技术的核心价值在于能够大幅提升生产质量与效率,尤其在需要高速、高精度且重复性强的检测场景中优势显著。在制药、食品、电子等行业的表面缺陷检测、尺寸测量、字符识别等环节应用广泛。本文聚焦于制药行业的药丸外观缺陷检测这一具体应用,深入探讨了如何利用海康威视VisionMaster视觉平台,结合**Blob分析**与**

weixin_32903229的博客 314

IPv6之001-IPv6是什么

技术本质:IPv6(Internet Protocol version 6)是互联网工程任务组(IETF)设计的网络层核心协议,用于替代IPv4核心使命:解决IPv4地址枯竭问题,重构互联网基础架构,支撑万物互联时代革命性特征fill:#333;color:#333;color:#333;fill:none;IPv6128位地址空间无状态自动配置原生IPsec加密协议头部精简。

老韩的Linux云计算架构师进阶之路 1395

unity渲染 - Mesh基础 自己创建mesh

English : coordinate : 坐标 tangent : 切线 normal :法线 triangle : 三角形 vertice : 顶点 mesh 中存储着 三维模型的数据 : vertices (顶点数组Vector3[]) 、triangles (三角形 int[]) 、normals (法线 Vector3 []) 、uv(纹理坐标 ,Vector2 []) tips: uv类似于unity的坐标系下的x,y,是纹理贴图坐标的简称它定义了图片上每个点的位..

alla_Candy的博客 3492

【Claude】Invalid model / Opus not available 错误:模型不可用的原因 bug报错已解决

使用 Claude API 时,指定错误或不可用的模型 ID 会收到 Invalid model 错误。本文从模型命名规则出发,给出模型降级链与动态选择方案。

博客 7915

[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用

本文系统讲解了计算机图形学中的纹理技术及其应用。文章首先打破"纹理仅是彩色贴图"的认知,指出其本质是GPU中的可编程内存区域。核心内容包括:环境贴图(球面与立方体方案)用于模拟全域光照;凹凸/法线贴图通过扰动法线模拟表面细节;位移贴图则真实改变几何结构,需配合高精度模型或动态细分技术。此外还介绍了三维纹理在自然材质和医学影像中的应用,以及纹理作为预计算数据容器的功能。全文展现了纹理技术从基础色彩映射到多维数据处理的演进历程,揭示了其在图形渲染中的核心地位和广泛应用前景。

软件科学-郝学胜 490

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

unity基础学习之法线贴图

原理和概念 用一张纹理来存储法线的值,法线的xyz方向取值是【-1,1】,而rgb的取值是【0,1】,所以这里有一个转换 rgb = (normal+1)/2=0.5*normal+0.5 资源 在unity中引入两个cube,为其分别制作一个材质,一个材质有法线贴图,一个没有,用作对比 资源1: 将图片导入unity,设置类型为normalmap 资源2: shader 如下: 法线贴图shader Shader "Custom/normalMapNormal" { Properties { _

HzjCsdn的博客 2821

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Unity Mesh生成Cube

第一个Cube的顶部,此时vertices列表中是空的,所以base_index是0,然后遍历这个面的顶点的渲染顺序,将其添加到这个组别的列表中,即[0,2,1,0,3,2],也就是说subs[0]目前是这个列表。一共是6个面,每个面包含的数据包括4个顶点的相对顶点坐标(Cube的中心为原点),法线方向,UV坐标,顶点渲染顺序,以及这个面用到的材质,因为这里是Top,即顶部,所以法线方向是(0,1,0),其他面以此类推。最后设置材质,将材质从字典中拿出,组成材质数组,给到meshRenderer。

Morris-w的专栏 1535

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何在Unity里翻转网格法线

将 .fbx 文件导入 Unity 后,偶尔会发现模型正面是透明的,背面却能看到,这是由于模型网格中的三角形顶点的排列顺序相反造成的,解决此问题可能到 Maya、3DMax 等 3D 建模软件中将模型中有问题的部分进行翻转法线操作,也可以在 Unity 中将三角形顶点的排列顺序进行反转,避免使用 3D 建模软件重新导出又导入到 Unity 的麻烦,如下代码:SkinnedMeshRenderer ...

unityofficial的博客 462

Unity 法线贴图、高光贴图、Cube Map shader

Unity 相关纹理贴图写unity shader有些时候了,出于寂寞,拿出来晒晒吧!!!!先看一下Unity 法线贴图、高光贴图、Cube Map shader最终效果: 说老实话,我不怎么喜欢看教程,我喜欢自己捉摸捉摸,要知道自己捉摸出来的东西那个高兴劲儿,恨不得全城人都跟我一起hi一把。这个多纹理shader写了有几个月了,当然还有其他一同出炉的shader。 什么是漫反射光照 先看一下U

恬纳微晰 1万+

Unity中Shader法线贴图(上)

Unity中Shader法线贴图

楠溪泽岸的博客 1711

Unity中Shader法线贴图(下)实现篇

我们在这篇文章中,实现法线贴图的正确采样Unity中Shader法线贴图(下)理论篇。

楠溪泽岸的博客 952

【Unity Shader入门精要 第13章】使用深度和法线纹理(三)

基于深度+法线纹理的描边

zhiai315的博客 1076

shader 获取法线_Ray-Marching 绘制图形的法线信息【Unity Shader】

代码参考自:http://blog.youkuaiyun.com/baidu_26153715/article/details/46510703效果如图: 完整代码及详细注释如下:Shader "Custom/RayMarching"{Properties{//_MainTex ("Texture", 2D) = "white" {}//_Cube("cubemap", cube) = ""{}}// ht...

weixin_39606244的博客 271

(五)Cube

(五)Cube

ttod的博客 272

【第005问 Unity中如何显示三角形中心法线?】

Unity中如何快速查看Mesh中三角形的法线?

平台不倒,记录不息 2447

Unity Mesh基础知识

Unity Mesh基础知识什么是MeshMesh的组成部分利用Mesh创建一个Cube创建Cube顶点坐标渲染转载链接 什么是Mesh     Mesh是指的模型的网格,3D模型是由多边形拼接而成,而多边形实际上又是由多个三角形拼接而成的。即一个3D模型的表面其实是由多个彼此相连的三角面构成。三维空间中,构成这些三角形的点和边的集合就是Mesh。 Mesh的组成部分     1.顶点坐标(vertex)     2.法线(normal)     3.纹理坐标(uv)     4.三角形序列(triangl

皮皮#2500 6334

Unity Mesh、MeshFilter、MeshRenderer到底是个啥玩意

1.首先我们创建一个Cube在Unity中,在Hierarchy中点击右键3d Object -&gt;Cube。然后查看右侧的Inspector窗口,如果没有的话,看顶部的Windows菜单,里面有Inspector窗口。如下截图: 包含了Mesh Filter,Mesh Renderer组件,然后再Mesh Filter中包含了Mesh The Mesh Filter takes a me...

zphshiwo的专栏 3万+
上一篇: 按时间计算抛物线
下一篇: 3D模型在UI中的RenderTexture显示
Thinbug
博客等级 码龄22年 2万+粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Thinbug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值