Unity中获取地形的法线

Unity角色脚部IK进阶实战:动态地形适配与防穿模解决方案 在游戏开发中,角色动画的真实感与沉浸感至关重要,而反向动力学(IK)技术是实现这一目标的核心手段之一。IK系统通过计算骨骼链末端效应器的位置和旋转,反向推导出中间关节的姿态,从而让角色肢体能够智能地适应环境交互。其技术价值在于能够显著提升角色与场景的物理贴合度,消除不自然的悬浮或穿透现象,广泛应用于角色行走、攀爬、抓握等复杂动画场景。本文聚焦于Unity引擎中脚部IK的进阶实现,针对动态地形适配与防穿模这两个工程实践中的核心挑战,深入剖析了基于射线检测与IK权重混合的解决方案。该方案通过预测性检测、法线对齐 阅读详情

序

之前,生成了地形图:(42条消息) 从灰度图到地形图_averagePerson的博客-优快云博客

那末,地形的法线贴图怎么获取?

大概分为两个部分吧,先拿到法线数据,再画到纹理中去。

关于法线

计算

Unity - Scripting API: Mesh.RecalculateNormals (unity3d.com)

这个链接讲的是法线的计算,它是什么空间下的?无所谓了……

这里也不对地形搞什么几何变换,而且它是方向,模型空间世界空间是一个结果。

获取

Unity - Scripting API: Mesh.normals (unity3d.com)

直接一个等于号,然后这个法线是对顶点不是对三角形面片。

就这两点,没了。

存到纹理中

构造

Unity - Scripting API: Texture2D (unity3d.com)

这个变量,好像在unity shader里也经常出现嘞

要把法线数据存到Texture2D里,首先得构造一下对象啊,构造函数是什么?

Unity - Scripting API: Texture2D.Texture2D (unity3d.com)

RGBA32,构造RenderTexture的时候也有你。

怎么赋值?

赋值

Unity - Scripting API: Texture2D.SetPixels (unity3d.com)

  1. 直接传数组

  1. 数组要展平【mesh.normals其实就是一维的,那就可以直接用了】

  1. 最后需要Apply

  1. 从左到右从下到上【地形顶点正好也是这个顺序的】

官方示例代码:

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        Renderer rend = GetComponent<Renderer>();

        // duplicate the original texture and assign to the material
        Texture2D texture = Instantiate(rend.material.mainTexture) as Texture2D;
        rend.material.mainTexture = texture;

        // colors used to tint the first 3 mip levels
        Color[] colors = new Color[3];
        colors[0] = Color.red;
        colors[1] = Color.green;
        colors[2] = Color.blue;
        int mipCount = Mathf.Min(3, texture.mipmapCount);

        // tint each mip level
        for (int mip = 0; mip < mipCount; ++mip)
        {
            Color[] cols = texture.GetPixels(mip);
            for (int i = 0; i < cols.Length; ++i)
            {
                cols[i] = Color.Lerp(cols[i], colors[mip], 0.33f);
            }
            texture.SetPixels(cols, mip);
        }
        // actually apply all SetPixels, don't recalculate mip levels
        texture.Apply(false);
    }
}

试一试

根据文档,调api就行了。

代码

计算法线的

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

public class Terrian : MonoBehaviour
{
    public int N = 10;
    public Texture2D texture2dHeightMap;
    [Range(1,100)]
    public float heightRatio = 30.0f;//一个系数,控制地形总体的高度的

    public Texture2D normalTex;

    MeshRenderer meshRenderer;
    MeshFilter meshFilter;

    // 用来存放顶点数据
    List<Vector3> verts;
    List<int> indices;
    Vector3[] normals;

    private void Awake()
    {
    }

    private void Start()
    {
        verts = new List<Vector3>();
        indices = new List<int>();

        meshRenderer = GetComponent<MeshRenderer>();
        meshFilter = GetComponent<MeshFilter>();

        //normalTex = new Texture2D(texture2dHeightMap.width, texture2dHeightMap.height, TextureFormat.RGB24,-1,false);
        normalTex = new Texture2D(N,N, TextureFormat.RGB24, -1, false);//2.5D的地形,顶点的法线,法线贴图规模不是灰度图规模
    }

    private void Update()
    {
        Generate();

        normals = new Vector3[N * N];
        normals = meshFilter.mesh.normals;
        for(int i = 0; i < 10; ++i)
        {
            print(normals[i]);
        }

        Color[] colors = new Color[N * N];
        for(int i = 0; i < N * N; ++i)
        {
            colors[i] = new Color(normals[i].x, normals[i].y, normals[i].z);
        }

        normalTex.SetPixels(colors);
        normalTex.Apply(false);
    }

    public void Generate()
    {
        ClearMeshData();

        // 把数据填写好
        AddMeshData();

        // 把数据传递给Mesh,生成真正的网格
        Mesh mesh = new Mesh();
        mesh.vertices = verts.ToArray();
        mesh.triangles = indices.ToArray();

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        meshFilter.mesh = mesh;
    }

    void ClearMeshData()
    {
        verts.Clear();
        indices.Clear();
    }

    void AddMeshData()
    {

        //01填充顶点数据
        for (int z = 0; z < N; ++z)//按先x后z的顶点排列顺序,所以先循环的是z
        {
            for(int x = 0; x < N; ++x)
            {
                int u = Mathf.FloorToInt(1.0f * x / N * texture2dHeightMap.width);
                int v = Mathf.FloorToInt(1.0f * z / N * texture2dHeightMap.height);
                float grayValue = texture2dHeightMap.GetPixel(u,v).grayscale;

                float height = grayValue*heightRatio;
                Vector3 temp = new Vector3(x, height, z);
                verts.Add(temp);
            }
        }
        //02填充索引数据
        for(int z = 0; z < N - 1; ++z)
        {
            for(int x = 0; x < N - 1; ++x)
            {
                int index_lb = z * N + x;//index of the left bottom vertex. lb = left bottom
                int index_lt = (z + 1) * N + x;
                int index_rt = (z + 1) * N + x + 1;
                int index_rb = z * N + x + 1;

                indices.Add(index_lb);indices.Add(index_lt);indices.Add(index_rt);
                indices.Add(index_rt);indices.Add(index_rb);indices.Add(index_lb);
            }
        }
    }


    
}

显示法线贴图的。这个是在摄像机上的——屏幕后处理嘛!

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

public class ShowTexture2D : MonoBehaviour
{
    public Terrian terrian;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        Graphics.Blit(terrian.normalTex, destination);
    }


}

结果

看着……走势差不多吧。而且,绿色的,表示向上,符合的。

对不对?在这种情况下,没法看出来。只能接着往下做,然后拔出萝卜带出泥巴。

纯平面是纯绿色

高度系数越大,颜色越深

Unity地形制作:Heightmap核心原理与实战全流程指南 高度图(Heightmap)是计算机图形学中用于定义三维地形表面起伏的核心数据格式,其本质是一张灰度图像,通过像素亮度值编码高度信息。这一原理使得地形数据能够以二维形式高效存储和处理,并直接驱动三维网格的生成。在游戏开发与虚拟仿真领域,Heightmap的技术价值在于极大地提升了大规模自然场景的创作效率与真实感,是实现开放世界、飞行模拟等应用场景中逼真地形的基石。通过结合Unity Terrain系统,开发者可以快速将Heightmap转换为可交互的地形,并利用纹理绘制、植被散布等功能进行细节丰富。本文聚焦 阅读详情

相关推荐

Unity脚部IK实战:5分钟解决角色爬坡穿模问题

在3D游戏角色动画中,正向动力学(FK)常用于制作预定义动作,但当角色在斜坡、楼梯等不平坦地形移动时,FK难以让脚掌自适应地面,导致模型“悬空”或“穿模”。反向动力学(IK)则从目标点出发,逆向计算关节姿态,使末端效应器(如脚掌)精准到达指定位置,从而解决地形适配问题。其技术价值在于通过实时物理检测与动画数据的融合,显著提升角色移动的真实感和沉浸感,广泛应用于第三人称游戏、角色控制器及需要复杂地形交互的场景。本文聚焦于Unity引擎中的脚部IK实现,通过射线检测地形高度,动态调整骨骼位置与旋转,并配合权重平

weixin_29009881的博客 314

Unity Shader - 简单山脉 - 顶点着色器重构法线

此文是基于之前的一篇:Unity Shader - 使用Noise噪点图生成简单山脉(使用tex2Dlod控制顶点高度)写的,这篇使用tex2Dlod的,虽然将控制顶点的高度逻辑放到了vertex shader(顶点着色器)中读取高度图来控制了,但是却丢失了实时的法线控制,因为之前在CSharp脚本控制山脉顶点高度时有调用:Mesh.RecalculateNormals();,所以运行后,可以看到...

Jave.Lin 的学习笔记 2378

【Unity基础】9.地形系统Terrain

今天学习地形系统Terrain~

Lampard的博客 2万+

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

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

平台不倒,记录不息 2447

Unity 2018.3地形功能更新介绍

Unity 2018.3将更新地形系统,此次更新涉及改进的工具和利用GPU实现的更高性能。它还添加了HDRP高清晰渲染管线和LWRP轻量级渲染管线的支持,同时兼容内置渲染管线和现有Unity地形系统。   请获取Unity 2018.3 Beta体验更新内容,但是需要注意:Unity 2018.3 Beta版仍处于开发阶段,新版本的用户界面和API可能会受到未来改动影响。   性能   在性...

qq_38456196的博客 2836

Unity Shader-法线贴图(Normal Map)与视差贴图(Parallax Map)

简介 法线贴图技术至今一直是游戏增强画面效果的利器之一。随着移动设备的性能越来越好,曾经的在PC平台的各种高级技术在移动平台也都开始大规模使用了。最近印象最深刻的就是《镇魔曲》,场景地形全部都加了法线,可以说是无所不用其极了....之前还没见过哪个游戏在移动平台敢这么大规模地使用法线。而且人模的渲染也是走的次时代的流程。不得不说大厂就是牛,本屌丝只能望别人家的游戏兴叹啊。本篇文章主要是研

puppet_master的专栏 1万+

Unity中实时获取网格上点的位置,还有对应的面和法线

在Unity中,可以使用Mesh类来获取一个网格上点的位置以及对应的面和法线。

shguxudong11的博客 2830

Unity3D4.0教程:地形如何显示法线效果2

Unity3D4.0教程:地形如何显示法线效果 Posted on 2013年01月25日 by U3d / Unity3D脚本/插件/被围观 374 次 1、

解析Unity3D中计算法线矩阵的函数

计算法线矩阵

m0_46183319的博客 883

告别130MB/s瓶颈!用Zynq+NVMe实现1.2GB/s高速存储的PL数据分流实战

本文详细介绍了如何通过Zynq+NVMe实现1.2GB/s高速存储的PL数据分流方案,突破传统Zynq架构130MB/s的瓶颈。文章分享了PL直连NVMe的硬件架构设计、软件栈优化及性能调优实战技巧,帮助开发者实现高速数据流的稳定存储。

weixin_42653691的博客 372

Vue3 + MQTT.js 实现 SCADA 实时数据通信:从不稳定到稳定的完整实践

本文介绍了SCADA组态引擎开发中MQTT协议的应用及优化实践。项目采用MQTT协议实现工业设备数据采集与可视化,但面临连接不稳定、数据格式多样化和数据绑定复杂三大问题。针对MQTT连接问题,分析发现超时设置过短(原8秒)、缺少客户端超时配置和心跳机制是主要原因。优化方案包括:协议转换(mqtt://→ws://)、双重超时保护(15秒手动+30秒客户端)、60秒心跳间隔等,显著提升了连接稳定性。通过完整代码实现展示了连接配置、认证处理和错误处理机制,为物联网数据传输提供了可靠解决方案。

weixin_36794508的博客 1398

Slope(斜坡) 法线生成算法,在地形渲染中的应用

原文出处:http://www.azure.com.cn/article.asp?id=285 如有转载,请注明:http://www.azure.com.cn      现在的地形渲染一般都使用高度图来作为数据源,高度图中每一个像素的颜色都代表着一个高度值,就为其y值,其x,z值为程序生成的规格数据。所以将所有这些顶点依次用三角形带绘制出来,即形成一块地形。      但问题出来了,

1393

vos如何对接okcc(保姆级教程)

1.添加账户 点击 系统->账户管理 [图片] 2.创建费率 系统->费率管理 点击添加

qq_46333281的博客 3453

Unity三维地形精度不够?试试用ArcGIS Maps SDK加载本地高程tpkx来提升细节

本文详细解析了如何利用ArcGIS Maps SDK for Unity加载本地高程tpkx数据来提升三维地形精度。通过获取高精度DEM数据、生成优化tpkx切片包以及在Unity中进行地形优化实践,开发者可以实现毫米级地形还原,特别适用于GIS可视化、模拟训练和游戏开发等场景。

weixin_33728708的博客 266

SPI模式下的SD卡读写,为什么你的数据总出错?详解时序与状态机避坑指南

本文深入探讨SPI模式下SD卡读写数据出错的根本原因,提供时序优化与状态机设计的实战指南。针对时钟周期计数、状态机跳转和忙检测等核心问题,详解命令时序细节、状态机同步策略及高级避坑技巧,帮助开发者提升SD卡在SPI模式下的稳定性和性能。

weixin_30514745的博客 261

《缠中说禅108课》5:市场无须分析,只要看和干

喜欢吹牛皮的,在市场里最常见,例如一种以分析市场、吹牛皮为生的职业,叫什么股评、专家的。此类人不过是市场上的寄生虫,真正的猎手只会观察、操作,用嘴是打不了豺狼的。 市场就是一个狩猎场,首先你要成为一个好猎手,而一个猎手,首先要习惯于无言。如果真有什么真理,那真理也是无言的。可言说的,都不过是人类思想的分泌物,臭气熏天。真不可言说了,就无不可言,言而无言,是乃真言。 一个好的猎手,可以没有嘴巴,但一定会有一双不为外物所动的眼睛,在这眼睛下,一切如幻化般透明。要不被外物所动,则首先要不被自我所迷惑,其实..

BenRen1314的博客 801

Unity角色动画脚部IK实战:动态地形适配与旋转优化详解

在3D角色动画开发中,逆运动学(IK)是解决角色肢体与环境精准交互的核心技术。其原理是通过数学计算反向推导关节链的旋转与位移,使末端效应器(如手、脚)达到目标位置。这项技术的核心价值在于极大提升角色动画的真实感与沉浸感,尤其在角色移动、攀爬等与环境紧密互动的场景中至关重要。本文聚焦于脚部IK这一细分领域,深入探讨如何通过射线检测与骨骼操控实现动态地形适配,并利用投影法解决斜坡上的脚部旋转扭曲问题,从而让角色在各种复杂地形上都能呈现自然稳定的站姿与步态。

weixin_34138056的博客 338

无人机芯片模块技术要点分析

恶劣环境下信号稳定性:无人机在恶劣环境下工作时,遥感系统采集的信号往往很不稳定,视频信号处理芯片需要具备强抗干扰能力,能辨别脉冲脉宽为50ns以上、幅度为0V~4.5V的输入信号。这种架构能兼顾强大的运算能力和灵活的接口控制。芯片小型化:麻省理工学院的研究人员已设计出仅20平方毫米的微型芯片,可处理无人机飞行所需的惯性数据和相机图像,为微型无人机的发展奠定了基础。光子集成芯片(PIC) :研究显示,与电子芯片相比,光子计算芯片在延迟、计算容量和能效上都有数量级的提升,有望解决当前无人机系统的计算瓶颈。

YUNZHUO666的博客 1404

三方向映射技术详解:解决UV拉伸,实现高质量纹理投影

纹理映射是三维图形渲染的基础技术,用于将二维图像贴合到三维模型表面。其核心原理是通过UV坐标建立纹理与模型顶点间的对应关系。传统UV映射在模型表面严重拉伸时,会出现纹理模糊、像素化等问题,影响视觉质量。三方向映射技术通过分析模型表面在世界空间中的法线朝向,将其划分为顶面、侧面和底面,并分别使用世界坐标平面(如XZ、XY、ZY)进行独立投影,生成三套不受模型变形影响的UV坐标。这项技术的核心价值在于彻底解决了地形、建筑墙面等场景中的纹理拉伸难题,使砖纹、地板等材质在任何角度的表面上都能保持恒定比例与清晰度,极

weixin_34208283的博客 456

研一脑电小白日记 之 EEGLAB预处理实战指南

本文为脑电研究新手提供了一份详尽的EEGLAB预处理实战指南。从MATLAB与EEGLAB环境搭建、使用NeuracleEEGFileReader插件导入BDF格式数据开始,逐步讲解了电极定位、滤波、降采样、ICA去伪迹等核心步骤,旨在帮助初学者高效完成脑电数据预处理,为后续分析奠定坚实基础。

weixin_29230649的博客 557

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3320

将unity地形转换为mesh

之前这个博客: https://blog.youkuaiyun.com/wodownload2/article/details/90263882 主要是关于如何把场景中的物件,进行空间划分,并且根据主角的位置,动态的加载周边的物件,对于大地形的处理,则没有涉及到。 经过搜索,主要收集了如下具有参考价值的网址: http://www.cnblogs.com/jietian331/p/5831062.html 本...

小孔明的专栏 7847

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Unity地形】使用地形工具创建场景环境-Terrain

如上图Unity的地形工具可以让我们实现创建复杂、丰富的3D室外环境。我们创建地形很简单,在层级面板中右键-3Dobject-Terrain 就可以创建一个默认的地形模型!这个模型是Unity内置的。接下来的地形编辑功能全部集中在这个地形的组件上。

leoysq的博客 8090

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Unity地形系统

一、什么是地形? 地形指的是地表各种各样的形态,具体指地表以上分布的固定性物体共同呈现出的高低起伏的各种状态。 二、创建地形 创建地形,地形属于3D Object类型,可以通过菜单栏GameObject去创建,也可以直接在Hierarchy面板中创建。 三、地形工具 从左到右分别是创建相邻地形、绘制工具、绘制树木工具、绘制细节工具、设置工具。 ​​​​​​​ ...

a451319296的博客 3137

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Unity中地形的设置

1.在开发过程中建议关闭烘焙效果(Window—lighting–auto generate) 2.Terrain Colider 为地形增添一种碰撞的效果,不能让游戏物体穿过。 3.创建地形时候应该设置地形,设置地形的宽度,高度,长度,Resolution(分辨率)。 4.设置地形的高度为20m,地形的海拔高度是20。 5.按住shift让地形下降, 6.地形中第三个参数是为了平滑地形 7.右键...

weixin_44469024的博客 3232

【Unity】Unity插件:地形编辑器MTE(Mesh Terrain Editor)

MTE(Mesh Terrain Editor)是一款Unity的地形编辑器插件,该插件能够更方便的创建和编辑地图,提升场景开发效率。

一个普普通通的游戏开发者 1万+
上一篇: 从灰度图到地形图
下一篇: 在线绘制灰度地
averagePerson
博客等级 码龄5年 381粉丝 113原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值