当前位置: 首页 > news >正文

Unity - 导出的FBX模型,无法将 vector4 保存在 uv 中(使用 Unity Mesh 保存即可)

文章目录

  • 目的
  • 问题
  • 解决方案
  • 验证
  • 保存为 Unity Mesh 结果 - OK
  • 保存为 *.obj 文件结果 - not OK,但是可以 DIY importer
  • 注意
  • References


目的

备忘,便于日后自己索引


问题

为了学习了解大厂项目的效果:
上周为了将 王者荣耀的 杨玉环 的某个皮肤的头发效果还原
所以我想直接抓模型,再还原 shader
我使用的还是以前的老方法: GPA + 夜神模拟器,具体可以查看以前的另一篇教程,具体参考:教你如何使用GPA导出模型,另送一个 GPA CSV2MESH Tool in unity
在这里插入图片描述

抓出来的数据,导出 FBX 后,我看不出什么异常

直到,我逐行的 shader 还原效果的时候
发现 vertex input 数据有 float4 uv1 : TEXCOORD1; float4 uv2 : TEXCOORD2;

但是发现 shader 调试发现,uv1, uv2 使用颜色输出都发现了数据不对的 BUG

然后我还想在 unity Game 视图下,使用 RenderDoc 抓帧分析一下
结果 Load RenderDoc 之后,直接导致 unity 闪退
在这里插入图片描述
在这里插入图片描述

瞄了一下 CSharp 代码,发现我使用的是 Mesh.uv API,getter and setter 都是 Vector2[] 的,所以 zw 是不可能设置上的
在这里插入图片描述

然后瞄了一下 Mesh 是有 void SetUVs(int channel, Vector4[] uvs) 的 API 的
在这里插入图片描述
但是经过测试,还是发现 UV的 zw 无法保存下来
在这里插入图片描述

最终我问了一下unity 技术官方,结果他们测试是OK的 (因为他们是对 Mesh 内存数据的实时修改)
然后我也试了一下,确实OK,但是经过自己跟进一步测试,发现使用 FBX Exporter 导出之后,UV 还是会丢失的
我将测试总结一下: unity Mesh 中会保存 uv vector4 的数据,到时经过 FBX Exporter 插件导出之后,uv 就不可能保存 Vector4 了
在这里插入图片描述

然后我分析了一下 FBX Exporter 插件的代码
发现一丢丢问题:

  1. 我将 FBX Exporter Local 化后,再按照我下面截图的内容,修改后,还是无法导出 (如何 local 化,可以参考我之前的文章:Unity - 如何修改一个 Package 或是如何将 Package Local化 )
    在这里插入图片描述

  2. 发现 Unity 中 AutoDesk 的 package 里面封装的 API FbxLayerElemetnUV.Create 进入是继承 UV2
    也要先 local,但是这个 package 比较特殊,在 PackageManager 中不显示的,方法可以是先从 Library/PackageCache/com.autodesk.fbx@4.2.0 剪贴到 [项目目录]/Packages/下面,然后使用 Package add from disk 的方式
    然后再开始修改代码
    public class FbxLayerElementUV : FbxLayerElementTemplateFbxVector2 修改为
    public class FbxLayerElementUV : FbxLayerElementTemplateFbxVector4
    结果发现还是不行

在这里插入图片描述
在这里插入图片描述

因为之前说的,unity editor 下,无论 game view, 还是 scene view
直接 Load RenderDoc 都会导致unity 闪退
然后我再使用 RenderDoc + 真机 抓帧分析,果然是没有 vertex input TEXCOORD0 zw 分量数据的
在这里插入图片描述


解决方案

于是我就有点怀疑 FBX 是不能保存 uv 超过4 分量数据的
然后百度: ‘fbx 文本 file header’ 找到这篇:

  • FBX文件结构解读【文本格式】
    • 译文原始地址在这:FBX文件结构解读
    • 翻译之前的原文在这:A quick tutorial about the FBX ASCII format

google ‘fbx ascii file header’ 找到:

  • FBX binary file format specification - blender 的
    再 ‘How to save uv data more than 4 components in fbx file’ 找到:
  • FBX export/import only supports Vector2 in UV (but the uvs can contain upto Vector4 in Unity) - 这个人遇到的问题,和我一模一样,里面的解决方式就是使用 AssetData.CreateAsset(mesh, path) 的方式来解决的

经过前面 (还有很多篇)

看完 ascii 格式的 FBX 头文件后,我就知道,uv 存不了 vector4 了,那我就在猜

王者荣耀 也是使用 unity 开发的,难不成他们 TEXCOORD[N] 保存超过 2 个以上的分量数据都是使用 unity Mesh 的方式来保存的吗?


验证

  • 试一下 unity mesh 能否成功 - OK
  • 测试一下 *.obj 格式能否将 uv 保存超过 2 个分量以上的数据 - OK,但是AB打包可能不会打进去(目录中注意的部分会有讲到)

保存为 Unity Mesh 结果 - OK

先构建uv数据
在这里插入图片描述
然后设置数据
在这里插入图片描述
然后 shader 打印
在这里插入图片描述

之前的z是全黑色,w全白色,现在都有对应的强度了,OK,说明 unity mesh 还是OK的
想要了解 unity mesh 如何保存数据,我们可以将 AssetDatabase.CreateAsset 之后的 Mesh.asset 文件用文本编辑器打开,瞄一下就好啦
在这里插入图片描述


保存为 *.obj 文件结果 - not OK,但是可以 DIY importer

首先我们用 blender 简单整一个 cube,将 uv 展好,如下
在这里插入图片描述

然后导出 *.obj 放到 unity 里面瞄一下,如下图
在这里插入图片描述
然后我们直接给 obj 里面的 vt 增加 字段数据的分量,看看 unity 有否变化,然后发现是没有变化的
在这里插入图片描述

然后我们发现修改不了 原始的 .obj 里面在 library 下的 mesh cache 信息 (.fbx) 同样如此

比如下面的代码,我将问题写在注释了

        var assetObj = AssetDatabase.LoadAssetAtPath<Object>(assetPath); // assetObj == nullvar modelPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath); // modelPrefab == nullvar mesh_filter = modelPrefab.GetComponentInChildren<MeshFilter>(); // 所有导致 modelPrefab 出现空引用的 BUG

完整如下


public class AssetsImporterExt : AssetPostprocessor
{private void OnPreprocessModel(){var mi = assetImporter as ModelImporter;if (mi == null) return;// assetPath == "Assets/Test/Test_uv.obj"var assetPath = assetImporter.assetPath;var assetObj = AssetDatabase.LoadAssetAtPath<Object>(assetPath); // assetObj == nullvar modelPrefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath); // modelPrefab == nullvar mesh_filter = modelPrefab.GetComponentInChildren<MeshFilter>(); // 所有导致 modelPrefab 出现空引用的 BUGif (mesh_filter == null) return;var mesh = mesh_filter.sharedMesh;var uvs = new List<Vector4>();mesh.GetUVs(0, uvs);var ext = System.IO.Path.GetExtension(assetPath).ToLower();if (ext == ".obj"){var spliter = new string[] { " " };var sb = new StringBuilder();var dirty = false;using(var reader = new StreamReader(assetPath)){var idx = 0;while (!reader.EndOfStream){var line = reader.ReadLine();if (line.StartsWith("vt")){sb.Clear();var args = line.Split(spliter, System.StringSplitOptions.RemoveEmptyEntries);if (args.Length > 3) sb.Append(args[3]);if (args.Length > 4) sb.Append(" " + args[4]);Debug.Log($"extension uv data zw : {sb}");var uv_data = uvs[idx]; // get from arrayif (args.Length > 3){if (!float.TryParse(args[3], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.z = val; // update z component}if (args.Length > 4){if (!float.TryParse(args[4], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.w = val; // update w component}uvs[idx] = uv_data; // update to array++idx;dirty = true;} // end of if (line.StartsWith("vt"))} // end of while (!reader.EndOfStream)} // end of using(var reader = new StreamReader(assetPath))if (dirty){EditorUtility.SetDirty(mesh);EditorUtility.SetDirty(modelPrefab);AssetDatabase.SaveAssetIfDirty(modelPrefab);}} // end of if (ext == ".obj")}

既然 原始模型的 mesh 修改不了,那么我们可以处理 prefab 里面的 mesh,下面进行尝试一下
其实这帖子 FBX export/import only supports Vector2 in UV (but the uvs can contain upto Vector4 in Unity) 里面也有人是这样的思路,如下图
在这里插入图片描述

先来一段代码,看看能否修改成功

    private void OnPostprocessPrefab(GameObject gameObject){var mf = gameObject.GetComponentInChildren<MeshFilter>();if (mf == null) return;var mesh_path = AssetDatabase.GetAssetPath(mf.sharedMesh);Debug.Log($"mehs_path : {mesh_path}");var mesh = mf.sharedMesh;var uvs = new List<Vector4>();mesh.GetUVs(0, uvs);var ext = System.IO.Path.GetExtension(mesh_path).ToLower();if (ext == ".obj"){var spliter = new string[] { " " };var sb = new StringBuilder();var dirty = false;using (var reader = new StreamReader(mesh_path)){var idx = 0;while (!reader.EndOfStream){var line = reader.ReadLine();if (line.StartsWith("vt")){sb.Clear();var args = line.Split(spliter, System.StringSplitOptions.RemoveEmptyEntries);if (args.Length > 3) sb.Append(args[3]);if (args.Length > 4) sb.Append(" " + args[4]);Debug.Log($"extension uv data zw : {sb}");var uv_data = uvs[idx]; // get from arrayif (args.Length > 3){if (!float.TryParse(args[3], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.z = val; // update z component}if (args.Length > 4){if (!float.TryParse(args[4], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.w = val; // update w component}uvs[idx] = uv_data; // update to array++idx;dirty = true;} // end of if (line.StartsWith("vt"))} // end of while (!reader.EndOfStream)} // end of using(var reader = new StreamReader(assetPath))if (dirty){mesh.SetUVs(0, uvs);EditorUtility.SetDirty(mesh);EditorUtility.SetDirty(gameObject);AssetDatabase.SaveAssetIfDirty(gameObject);AssetDatabase.SaveAssets();AssetDatabase.Refresh();}} // end of if (ext == ".obj")}

在这里插入图片描述

OK,有了上面的 postprocess 代码 + prefab,我们 reimport 测试一下
在这里插入图片描述
可以看到 Test_uv.obj 里面的 mesh 的 uv 从 flaot2 变成了 float4 了,如下图
在这里插入图片描述

然后我们看一下 测试 shader 的效果,发现是有数据异常的,一部分有设置成功,一部分没有,那么很有可能是 *.obj 的顶点数解析和unity不一样
在这里插入图片描述

首先,瞄一下,*.obj 里面有 14 条 uv 信息 xy 分量是原来的,后面的 zw (0.25, 0.5) 都是我后续增加的
在这里插入图片描述

然后我们断点发现,unity 解析出来,会有 24 个 uv 信息,如下图
在这里插入图片描述

观察了一下规律,可以发现,他将一些多面共点,拆分为分别的三角面的对应的独立点
因此我们可以根据 uv.xy 如果坐标相同,那么我们就将 uv.zw 记录一份,共享这些 uv.xy 的数据的 zw 数据即可
继续修改一下代码

    private void OnPostprocessPrefab(GameObject gameObject){var mf = gameObject.GetComponentInChildren<MeshFilter>();if (mf == null) return;var mesh_path = AssetDatabase.GetAssetPath(mf.sharedMesh);Debug.Log($"mehs_path : {mesh_path}");var mesh = mf.sharedMesh;var uvs = new List<Vector4>();mesh.GetUVs(0, uvs);var ext = System.IO.Path.GetExtension(mesh_path).ToLower();if (ext == ".obj"){var dict = new Dictionary<string, Vector2>();var spliter = new string[] { " " };var sb = new StringBuilder();var dirty = false;using (var reader = new StreamReader(mesh_path)){var idx = 0;while (!reader.EndOfStream){var line = reader.ReadLine();if (line.StartsWith("vt")){sb.Clear();var args = line.Split(spliter, System.StringSplitOptions.RemoveEmptyEntries);if (args.Length > 3) sb.Append(args[3]);if (args.Length > 4) sb.Append(" " + args[4]);Debug.Log($"extension uv data zw : {sb}");var uv_data = uvs[idx]; // get from arrayvar key1 = float.Parse(args[1]).ToString("0.000000");var key2 = float.Parse(args[2]).ToString("0.000000");var key = $"{key1},{key2}";if (!dict.TryGetValue(key, out var zwVec)){if (args.Length > 3){if (!float.TryParse(args[3], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.z = val; // update z component}if (args.Length > 4){if (!float.TryParse(args[4], out float val)|| float.IsNaN(val)|| float.IsInfinity(val)){val = 0f;}uv_data.w = val; // update w component}zwVec.x = uv_data.z;zwVec.y = uv_data.w;dict[key] = new Vector2(zwVec.x, zwVec.y); // update to dict}uvs[idx] = uv_data; // update to array++idx;dirty = true;} // end of if (line.StartsWith("vt"))} // end of while (!reader.EndOfStream)} // end of using(var reader = new StreamReader(assetPath))if (dirty){// 将 xy 相同的都共用 uv.zw 数据for (int i = 0; i < uvs.Count; i++){var uv = uvs[i];var key = $"{uv.x.ToString("0.000000")},{uv.y.ToString("0.000000")}";if (dict.TryGetValue(key, out var zwVec)){uv.z = zwVec.x;uv.w = zwVec.y;uvs[i] = uv;}}mesh.SetUVs(0, uvs);EditorUtility.SetDirty(mesh);EditorUtility.SetDirty(gameObject);AssetDatabase.SaveAssetIfDirty(gameObject);AssetDatabase.SaveAssets();AssetDatabase.Refresh();}} // end of if (ext == ".obj")}

查看渲染结果,正常了
在这里插入图片描述

然后我们试试修改 *.obj 里面的uv 扩展数据瞄一下效果如何
在这里插入图片描述

最后的渲染效果如下
在这里插入图片描述


注意

  • *.obj 这种方式暂时没去验证能否将打包出来的 ab 里面的 mesh 修改(因为里头的文件信息是再 library 里面的临时生成的问题,打包不会打包进去)

  • 但是使用 *.asset 来保存 unity mesh 的方式肯定可以,因为变成了文件信息


References

  • FBX export/import only supports Vector2 in UV (but the uvs can contain upto Vector4 in Unity)

相关文章:

Unity - 导出的FBX模型,无法将 vector4 保存在 uv 中(使用 Unity Mesh 保存即可)

文章目录 目的问题解决方案验证保存为 Unity Mesh 结果 - OK保存为 *.obj 文件结果 - not OK&#xff0c;但是可以 DIY importer注意References 目的 备忘&#xff0c;便于日后自己索引 问题 为了学习了解大厂项目的效果&#xff1a; 上周为了将 王者荣耀的 杨玉环 的某个皮肤…...

【疯狂Java】数组

1、一维数组 (1)初始化 ①静态初始化&#xff1a;只指定元素&#xff0c;不指定长度 new 类型[] {元素1,元素2,...} int[] intArr; intArr new int[] {5,6,7,8}; ②动态初始化&#xff1a;只指定长度&#xff0c;不指定元素 new 类型[数组长度] int[] princes new in…...

leetcode 503. 下一个更大元素 II、42. 接雨水

下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&…...

【德哥说库系列】-PostgreSQL跨版本升级

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…...

rust学习——智能指针

智能指针 在各个编程语言中&#xff0c;指针的概念几乎都是相同的&#xff1a;指针是一个包含了内存地址的变量&#xff0c;该内存地址引用或者指向了另外的数据。 在 Rust 中&#xff0c;最常见的指针类型是引用&#xff0c;引用通过 & 符号表示。不同于其它语言&#xf…...

系列一、Spring Framework

一、谈谈你对Spring的理解 Spring是一个生态&#xff0c;是一个轻量级的开源容器框架&#xff0c;可以构建Java应用所需要的一切基础设施&#xff0c;它的出现是为了解决企业级应用开发中业务逻辑层和其他各层对象与对象之间耦合的问题&#xff0c;通常情况下所说的Spring是指S…...

PULP Ubuntu18.04

1. 安装eda工具&#xff1a;questasim_10.7_linux64&#xff0c;网上有教程和方法&#xff0c;如有问题&#xff0c;可私信我 2. 代码下载&#xff1a; git clone https://github.com/pulp-platform/pulp 编译代码 cd pulp source setup/vsim.sh make checkout make scripts …...

Docker harbor私有仓库部与管理

目录 搭建本地私有仓库 Docker容器的重启策略 Harbor 简介 什么是Harbor Harbor的特性 Harbor的构成 Docker harbor私有仓库部署 Harbor.cfg配置文件中的参数 维护管理Harbor 总结 搭建本地私有仓库 #首先下载 registry 镜像 docker pull registry#在 daemon.json …...

解决虚拟机联网问题

虚拟机开机后发现右上角缺少联网标志(下面有正常联网标志)&#xff0c;这样就是连不上网的 不信你可以打开Ubuntu里面的浏览器或ping www.baidu.com 1.编辑虚拟机设置-->网络适配器-->如图所示 2.选择编辑-->虚拟网络编辑器 3.更改设置 4此处可以选择还原默认设置&am…...

Unity 自定义小地图

最近工作做了个小地图&#xff0c;再此记录下思路。 1、准备所需素材 显示为地图&#xff08;我们取顶视图&#xff09;。创建一个Cube&#xff0c;缩放到可以把实际地图包住。实际地图的尺寸和偏移量 。我这里长宽都是25&#xff0c;偏移量&#xff08;1&#xff0c;0&…...

力扣每日一题66:加一

题目描述&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输…...

项目管理工具ConceptDraw PROJECT mac中文版自定义列功能

ConceptDraw PROJECT Mac是一款专业的项目管理工具&#xff0c;适用于MacOS平台。它提供了成功规划和执行项目所需的完整功能&#xff0c;包括任务和资源管理、报告和变更控制。 这款软件可以与ConceptDraw office集成&#xff0c;利用思维导图和数据可视化的强大功能来改进项目…...

Kafka-Java二:Spring实现kafka消息发送的ack机制

写在前面 如果只有一个kafka实例的话&#xff0c;那么文章中提到kafka集群kafka实例 一、什么是消息发送者端的ack机制 ack机制&#xff1a;消息确认发送成功的标识 由谁发起该标识&#xff1a;kafka集群 发起该标识的场景&#xff1a;kafka集群确认已经收到了消息。 由谁接收…...

Go代码解密:理解byte和int8的边界行为

今天看到一个很有意思的 Golang 代码&#xff0c;最后的输出结果为 4&#xff1a; func main() {count : 0for i : range [256]struct{}{} {m, n : byte(i), int8(i)if n -n {count}if m -m {count}}fmt.Println(count) // 输出为 4 }原因如下 当 i 0 时&#xff0c;n -n …...

Mac M1下使用Colima替代docker desktop搭建云原生环境

文章目录 为什么不使用docker desktop1.docker desktop卸载2.docker、docker compose安装3.colima安装3.1获取镜像地址3.2将下载好的iso文件放到colima指定路径3.3重新执行colima start 4.minikukekubernetes安装5.关闭minikube Mac M1下使用Colima替代docker desktop搭建云原生…...

Non-constant range: argument must be an integer literal

更新 Xcode IDE 后 ForEach 方法抛出了如下异常 Non-constant range: argument must be an integer literal 新增了指向性 id 参数 init(_:content:) 原始方法 ForEach(0 ..< pickerTitleColors.count) {Text(self.pickerTitleColors[$0]).tag($0).foregroundColor(self.…...

TCP网络通信

TCP通信的 实现发1收1 package TCP1;//完成TCP通信的 实现发1收1import java.io.DataOutputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;public class Client {public static void main(S…...

echarts中,X轴名称过长隐藏,鼠标hove显示全称

echarts中&#xff0c;X轴名称过长隐藏&#xff0c;鼠标hove显示全称&#xff1a; <div id"main" :style"{ width: 100%, height: 100% }"></div>option: {title: {text: 重点物料库存预警,left: center},tooltip: {trigger: axis,axisPointer…...

laravel框架介绍(二) 打开站点:autoload.php报错

Laravel&#xff1a;require..../vendor/autoload.php错误的解决办法 打开站点&#xff1a;http://laraveltest.com:8188/set_api-master/public/ set_api-master\public\index.php文件内容为&#xff1a; 解决办法&#xff1a; 1. cd 到该引用的根目录&#xff0c;删除 compo…...

reactNative导入excel文件

组件内导入 import {TouchableOpacity,PermissionsAndroid} from react-native; import RNFS from react-native-fs; import XLSX from xlsx; import DocumentPicker from react-native-document-picker; import {Buffer} from buffer;// 需要安装一下三个,Buffer和react-nati…...

mysql 命令行安装

一、安装包下载 1、下载压缩包 &#xff08;1&#xff09;公众号获取 关注微信公众号【I am Walker】&#xff0c;回复“mysql”获取 &#xff08;2&#xff09;官网下载 安装地址MySQL :: Download MySQL Community Server ​ ​ 二、解压 下载完之后进行解压&…...

JAVA基础知识Fundamental

JAVA基础知识 Java开发环境名词解释 八大基本类型整型长整型双精度浮点型布尔型字符型类型间的转换 运算符&#xff08;Operator&#xff09;算术运算符关系运算符逻辑运算符赋值运算符字符串连接运算符条件运算符 分支结构循环结构数组方法方法的重载&#xff08;overloading&…...

民宿如何经营与管理?【民宿小程序】

随着旅游业的快速发展&#xff0c;越来越多的人选择经营民宿&#xff0c;将自己的房屋开放给旅客入住。然而&#xff0c;要成功经营一家民宿&#xff0c;并保持良好的运营状态&#xff0c;需要有效的管理和营销策略。在这个过程中&#xff0c;民宿小程序能够发挥重要作用。 民宿…...

用 Rust 和 cURL 库制作一个有趣的爬虫

目录 一、介绍 二、准备工作 三、代码实现 四、解析 HTML 并提取特定元素示例 总结 本文将介绍如何使用 Rust 编程语言和 cURL 库制作一个有趣的网络爬虫。我们将通过实例代码来展示如何抓取网页内容、处理数据和解析 HTML 结构。同时&#xff0c;还将探讨爬虫技术的原理、…...

华为OD 走方格的方案数(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应往年部分考题以及新出的题目。 我将持续更新最新题目 我精选了一部分题目免费分享给大家,可前往夸克网盘转存,请点击以下链接进入: 我用夸克网盘分享了「华为OD题库J…...

postgresql|数据库|序列Sequence的创建和管理

前言&#xff1a; Sequence也是postgresql数据库里的一种对象&#xff0c;其属性如同索引一样&#xff0c;但通常Sequence是配合主键来工作的&#xff0c;这一点不同于MySQL&#xff0c;MySQL的主键自增仅仅是主键的属性做一个更改&#xff0c;而postgresql的主键自增是需要序…...

(完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类

文章目录 背景输入点直接输入邻接矩阵 背景 网上倒是有一些关于使用sklearn进行谱聚类的教程&#xff0c;但是这些教程的输入都是一些点的集合&#xff0c;然后根据谱聚类的原理&#xff0c;其会每两个点计算一次亲密度&#xff08;可以认为两个点距离越大&#xff0c;亲密度越…...

Unity中Shader的ShaderLOD

文章目录 前言一、ShaderLOD的使用步骤1、ShaderLOD使用在不同的SubShader中&#xff0c;用于区分SubShader所对应的配置2、在 C# 中使用 Shader.globalMaximumLOD 赋值来选择不同的 SubShader,以达到修改配置对应Shader的效果3、在设置LOD时&#xff0c;是需要和程序讨论统一 …...

图像压缩(4)《数字图像处理》第八章 8.3节 数字图像水印

图像压缩&#xff08;3&#xff09;《数字图像处理》第八章8.3节数字图像水印 一. 前言二.章节引言三.简单综述三.本章小结四.参考文献四. 小结 一. 前言 始于那本深蓝色的大块头&#xff0c;冈萨勒斯的《数字图像处理》&#xff0c;从此走上了图像信号处理的不归路&#xff0…...

C++之lambda匿名函数总结(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...