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

Unity常用内置变换矩阵

Unity引擎提供了一系列内置的变换矩阵,这些矩阵在着色器中用于处理物体、摄像机和光照的坐标变换,是游戏开发中不可或缺的工具。它们帮助开发者在顶点着色器和片段着色器中实现坐标转换、光照计算等功能。


主要变换矩阵类型

模型矩阵 (Model Matrix)

// 在着色器中访问
unity_ObjectToWorld  // float4x4
UNITY_MATRIX_M // 宏定义

作用:将顶点从模型空间转换到世界空间(World Space)。

用法:将物体的局部坐标转换为世界坐标,便于在世界空间中进行计算。

组成部分

  • 前3×3部分包含旋转和缩放
  • 第4列包含位移信息
  • 第4行通常为(0,0,0,1)

代码示例

// 顶点着色器中的应用
float4 worldPos = mul(unity_ObjectToWorld, float4(vertexPosition, 1.0));
// 或
float4 worldPos = mul(UNITY_MATRIX_M, float4(vertexPosition, 1.0));

应用场景:适用于需要世界坐标的场景,例如光照计算、物理模拟或与其他物体交互。

视图矩阵 (View Matrix)

// 在着色器中访问
unity_MatrixV  // float4x4
UNITY_MATRIX_V // 宏定义

作用:将顶点从世界坐标空间转换到相机的视图空间。

用法:将世界坐标转换到摄像机坐标系。

实际形式:

[ Rx Ry Rz -dot(R, Eye) ]
[ Ux Uy Uz -dot(U, Eye) ]
[ Fx Fy Fz -dot(F, Eye) ]
[ 0  0  0        1      ]

其中R、U、F分别是相机的右、上、前方向向量,Eye是相机位置。

访问相机位置:

float3 cameraPos = _WorldSpaceCameraPos;
// 或
float3 cameraPos = UNITY_MATRIX_V[3].xyz;

代码示例

float4 viewPos = mul(UNITY_MATRIX_V, worldPos);

应用场景:用于需要摄像机视角坐标的场景,如计算摄像机空间的光照或实现自定义摄像机效果。

投影矩阵 (Projection Matrix)

// 在着色器中访问
unity_MatrixP  // float4x4
UNITY_MATRIX_P // 宏定义

作用:将视图空间中的顶点转换到裁剪空间(也称为齐次裁剪空间)。

用法:在顶点着色器中执行最终的裁剪和透视变换。

类型:

  1. 透视投影矩阵:用于模拟真实世界的视角,远处物体较小
  1. 正交投影矩阵:用于2D渲染或工程视图,保持物体大小不变

透视投影矩阵形式:

[ 2n/(r-l)   0        (r+l)/(r-l)   0         ]
[ 0          2n/(t-b) (t+b)/(t-b)   0         ]
[ 0          0        -(f+n)/(f-n)  -2fn/(f-n)]
[ 0          0        -1            0         ]

其中n、f为近平面和远平面距离,r、l、t、b为视锥体边界。

应用场景:常用于自定义投影模式或后处理效果。

模型-视图-投影矩阵 (MVP Matrix)

// 在着色器中访问
UNITY_MATRIX_MVP // 宏定义

作用:将顶点从局部坐标空间直接转换到裁剪空间,是前三个矩阵的组合。

用法:在顶点着色器中,通过此矩阵将模型的顶点坐标转换为裁剪空间,用于裁剪和透视除法。

计算方式:

MVP = P * V * M

代码示例

// 顶点着色器中的应用 - 最常见的变换
float4 clipPos = mul(UNITY_MATRIX_MVP, float4(vertexPosition, 1.0));
// 或
float4 clipPos = UnityObjectToClipPos(vertexPosition);

应用场景:这是最常用的变换矩阵,用于将物体从局部坐标系转换到屏幕上的最终位置。

世界到对象矩阵 (World to Object Matrix)

// 在着色器中访问
unity_WorldToObject  // float4x4

功能:将点从世界坐标空间转换回物体的局部坐标空间(Model矩阵的逆)。

应用:

// 计算物体局部空间中的光照方向
float3 localLightDir = mul(unity_WorldToObject, float4(_WorldSpaceLightPos0.xyz, 0)).xyz;

特殊用途矩阵

法线变换矩阵

// 计算方法
float3x3 normalMatrix = transpose(inverse(mat3(unity_ObjectToWorld)));

功能:将法线从局部空间变换到世界空间,考虑非均匀缩放的影响。

为什么需要特殊处理:法线需要使用模型矩阵的逆转置矩阵变换,以保持垂直性。

应用:

float3 worldNormal = normalize(mul(normalMatrix, v.normal));
// 或使用Unity内置函数
float3 worldNormal = UnityObjectToWorldNormal(v.normal);

纹理变换矩阵

// 访问方式
unity_MatrixVP   // 视图投影矩阵
_Object2World    // 对象到世界矩阵的旧名称
_World2Object    // 世界到对象矩阵的旧名称

纹理投影矩阵:用于投影纹理,如阴影贴图。

// 阴影投影矩阵
unity_WorldToShadow[0] // 从世界空间到阴影贴图空间

矩阵操作和技巧

从矩阵提取信息

// 从模型矩阵提取缩放
float3 objectScale = float3(length(unity_ObjectToWorld._m00_m10_m20),length(unity_ObjectToWorld._m01_m11_m21),length(unity_ObjectToWorld._m02_m12_m22)
);// 从模型矩阵提取位置
float3 worldPos = unity_ObjectToWorld._m03_m13_m23;// 从视图矩阵提取相机位置
float3 cameraPos = -mul(UNITY_MATRIX_V, float4(0, 0, 0, 1)).xyz;

矩阵分量访问

Unity使用行主序存储矩阵,但在HLSL中使用列主序数学。这导致了一些混淆:

// 访问矩阵元素
float m11 = unity_ObjectToWorld[0][0]; // 第1行第1列
float m23 = unity_ObjectToWorld[1][2]; // 第2行第3列// 使用特殊语法访问
float m11 = unity_ObjectToWorld._m00;
float m23 = unity_ObjectToWorld._m12;// 按行访问
float4 firstRow = unity_ObjectToWorld[0];
// 按列访问需要额外处理
float4 firstColumn = float4(unity_ObjectToWorld._m00,unity_ObjectToWorld._m10,unity_ObjectToWorld._m20,unity_ObjectToWorld._m30
);

坐标空间转换示例

完整的渲染管线变换流程

float4 TransformVertexToClip(float3 vertex)
{// 1. 从物体空间到世界空间float4 worldPos = mul(unity_ObjectToWorld, float4(vertex, 1.0));// 2. 从世界空间到视图空间float4 viewPos = mul(UNITY_MATRIX_V, worldPos);// 3. 从视图空间到裁剪空间float4 clipPos = mul(UNITY_MATRIX_P, viewPos);// 替代方案:直接从物体空间到裁剪空间// float4 clipPos = mul(UNITY_MATRIX_MVP, float4(vertex, 1.0));// 或// float4 clipPos = UnityObjectToClipPos(vertex);return clipPos;
}

屏幕空间计算

float2 WorldToScreenPos(float3 worldPos)
{// 世界到裁剪空间float4 clipPos = mul(UNITY_MATRIX_VP, float4(worldPos, 1.0));// 透视除法float3 ndc = clipPos.xyz / clipPos.w;// NDC到屏幕空间 [0,1]float2 screenPos = float2(ndc.x * 0.5 + 0.5, ndc.y * 0.5 + 0.5);// Y轴翻转(DirectX到OpenGL)screenPos.y = 1.0 - screenPos.y;return screenPos;
}

Unity内置矩阵的脚本访问

// C#中访问变换矩阵
using UnityEngine;public class MatrixExample : MonoBehaviour
{void Update(){// 局部到世界矩阵Matrix4x4 localToWorld = transform.localToWorldMatrix;// 世界到局部矩阵Matrix4x4 worldToLocal = transform.worldToLocalMatrix;// 视图矩阵Matrix4x4 viewMatrix = Camera.main.worldToCameraMatrix;// 投影矩阵Matrix4x4 projMatrix = Camera.main.projectionMatrix;// MVP矩阵Matrix4x4 mvp = projMatrix * viewMatrix * localToWorld;// 提取位置信息Vector3 position = localToWorld.GetColumn(3);// 提取旋转信息(不考虑缩放)Quaternion rotation = Quaternion.LookRotation(localToWorld.GetColumn(2),localToWorld.GetColumn(1));// 提取缩放信息Vector3 scale = new Vector3(localToWorld.GetColumn(0).magnitude,localToWorld.GetColumn(1).magnitude,localToWorld.GetColumn(2).magnitude);Debug.Log($"Position: {position}, Scale: {scale}");}
}

注意事项

  • 坐标系:Unity的矩阵采用列主序(Column-Major),在Shader中矩阵乘法顺序为mul(matrix, vector)。
  • 向量乘法顺序:矩阵乘法不满足交换律,M*v 和 v*M 有不同的结果。在Unity的HLSL中,使用 mul(M,v)。
  • 矩阵类型混淆:将点变换和向量变换混淆。顶点变换时使用float4(position, 1.0),法线变换时使用float4(normal, 0.0),以避免平移影响。
  • 法线变换错误:直接使用模型矩阵变换法线是错误的,应使用逆转置矩阵。
  • 透视除法遗漏:从裁剪空间到NDC空间需要进行透视除法(除以w分量)。
  • 忘记归一化:变换后的向量(如法线、切线)通常需要重新归一化。
  • 性能:矩阵乘法在Shader中较常见,但应尽量减少不必要的计算以优化性能。
  • // 避免不必要的矩阵乘法
    // 而不是:
    float4 worldPos = mul(unity_ObjectToWorld, float4(vertex, 1.0));
    float4 viewPos = mul(UNITY_MATRIX_V, worldPos);
    float4 clipPos = mul(UNITY_MATRIX_P, viewPos);// 使用组合矩阵:
    float4 clipPos = mul(UNITY_MATRIX_MVP, float4(vertex, 1.0));

 

相关文章:

Unity常用内置变换矩阵

Unity引擎提供了一系列内置的变换矩阵,这些矩阵在着色器中用于处理物体、摄像机和光照的坐标变换,是游戏开发中不可或缺的工具。它们帮助开发者在顶点着色器和片段着色器中实现坐标转换、光照计算等功能。 主要变换矩阵类型 模型矩阵 (Model Matrix) /…...

算法题-图论

图的表示 207.课程表 127.单词接龙 图的遍历 DFS 递归。。。 200.岛屿数量 239.矩阵中的最长递增路径 BFS 102.二叉树的层序遍历 看到最短,首先想到的是BFS 542.01矩阵 207.课程表 127.单词接龙 拓扑排序 对于一个有向无环图G进行拓扑排序,是将G中…...

Java 8(Ubuntu 18.04.6 LTS)安装笔记

一、前言 本文与【MySQL 8(Ubuntu 18.04.6 LTS)安装笔记】同批次:先搭建数据库,再安装JVM,后面肯定就是部署Web应用了——典型的单机部署,真可谓“麻雀虽小五脏俱全”。 二、准备 (1&#xff…...

unity编辑器的json验证及格式化

UNITY编辑器的json格式化和验证工具资源-CSDN文库https://download.csdn.net/download/qq_38655924/90676188?spm1001.2014.3001.5501 反复去别的网站验证json太麻烦了 用这个工具能方便点 # Unity JSON工具 这是一个Unity编辑器扩展,用于验证、格式化和压缩JSO…...

C语言中小写字母转大写字母

一、题目引入 这一题运行结果是什么? 二、代码分析 在这个代码中 首先 -> 定义了一个字符数组空间内存是80 里面存储的是字符串123abcdEFG*& 接着 -> 定义了一个整型变量j 后面的循环会用到 然后 -> 使用了<stdio.h>中的库函数puts(ch)原样打印…...

深度学习--卷积神经网络调整学习率

文章目录 前言一、学习率1、什么学习率2、什么是调整学习率3、目的 二、调整方法1、有序调整1&#xff09;有序调整StepLR(等间隔调整学习率)2&#xff09;有序调整MultiStepLR(多间隔调整学习率)3&#xff09;有序调整ExponentialLR (指数衰减调整学习率)4&#xff09;有序调整…...

桥接模式:分离抽象与实现的独立进化

桥接模式&#xff1a;分离抽象与实现的独立进化 一、模式核心&#xff1a;解耦抽象与实现的多层变化 在软件设计中&#xff0c;当抽象&#xff08;如 “手机品牌”&#xff09;和实现&#xff08;如 “操作系统”&#xff09;都可能独立变化时&#xff0c;使用多层继承会导致…...

配置kafka与spark连接

一、配置kafka 首先进到software目录当中&#xff0c;如下图所示&#xff1a; 安装包上传/解压/重命名/解压过后的目录如下图所示&#xff1a; 修改配置&#xff1a; cd config vi server.properties 全部修改语句如下所示&#xff08;以node01为样例&#xff09;&#xff1…...

WebXR教学 05 项目3 太空飞船小游戏

准备工作 自动创建 package.json 文件 npm init -y 安装Three.js 3D 图形库&#xff0c;安装现代前端构建工具Vite&#xff08;用于开发/打包&#xff09; npm install three vite 启动 Vite 开发服务器&#xff08;推荐&#xff09;&#xff08;正式项目开发&#xff09; …...

【leetcode】3524 求出数组的X值1

题目链接 题目描述 给你一个正整数数组 nums 和一个正整数 k。 你可以对数组执行一次操作&#xff1a;移除不重叠的前缀和后缀&#xff08;可以为空&#xff09;&#xff0c;留下一个连续非空子数组。 对于每一种留下的子数组&#xff0c;计算&#xff1a; (该子数组的乘积…...

配电室安全用电漏电保护装置的安全用电措施

配电室作为电力分配与控制的关键场所&#xff0c;其安全用电装置的重要性不言而喻。 防触电、防漏电、防火灾、安全防护、保障生命财产&#xff1b; 当用电设备发生短路、过载或漏电等异常时能迅速切断电源&#xff0c;精准定位问题。及时报警&#xff0c;防止触电 在配电室中…...

数据库-基本概述 和 SQL 语言

标题目录 基本概述DB和DBMS关系数据库库与表的概念表库 数据库在项目中的角色如何操作数据库 SQL 语言SQL 分类DDL 语言数据库操作创建数据库查看数据库删除数据库切换数据库 表的操作创建表查看表修改表名删除表修改表结构 DML 语言插入数据修改数据删除数据 基本概述 DB和DB…...

C语言中的递归1.0

一、递归函数概念引入 简单来说就是自己调用自己 递归函数满足的两个条件: 1.每次调用函数本身,必须一次又一次接近最终结果 2.必须有停止条件 二、代码展示 用递归求1到4的和 代码如下 三、代码分析 首先进入main主函数入口 int sum getsum(4); 就这个具体题目来看 我…...

解锁webpack:对html、css、js及图片资源的抽离打包处理

面试被问到webpack&#xff0c;可别只知道说 HtmlWebpackPlugin 了哇。 前期准备 安装依赖 npm init -y npm install webpack webpack-cli --save-dev配置打包命令 // package.json {"scripts": {// ... 其他配置信息"build": "webpack --mode pr…...

[特殊字符] 大模型对话风格微调项目实战——模型篇 [特殊字符]✨

&#x1f4dc; 目录 &#x1f3af; 背景介绍 &#x1f50d; 这篇文章的任务 &#x1f916; 模型选型 &#x1f4ca; 模型评测 ⚙️ 模型训练 &#x1f504; 模型转换 &#x1f9ea; 模型训练效果评估 &#x1f389; 总结 &#x1f3af; 背景介绍 本文是《大模型对话风…...

lerobot[act解析]

ACT是具身智能模仿学习中重要的一个算法&#xff0c;本文会先从这个算法是是什么&#xff0c;这个算法如何工作的&#xff0c;到这个算法为什么有效&#xff0c;也就是what->how->why的这么一个顺序来进行解析 ACT 是什么&#xff1f;&#xff08;What&#xff09; 核心…...

使用Python创建带边框样式的Word表格

引言 在生成Word文档时&#xff0c;表格的边框样式是提升专业度的重要细节。本文将通过一个实例&#xff0c;展示如何使用python-docx库为表格添加上下边框加粗和内部边框隐藏的复杂样式。代码将实现以下效果&#xff1a; 表格位于页面底部表格首行和末行的上下边框加粗隐藏内…...

GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)

今天偶然发现天梯赛的代码还保存着&#xff0c;于是决定写下这篇题解&#xff0c;也算是复盘一下了 L1本来是打算写的稳妥点&#xff0c;最后在L1-6又想省时间&#xff0c;又忘记了insert&#xff0c;replace这些方法怎么用&#xff0c;也不想花时间写一个文件测试&#xff0c…...

基于SpringBoot的课程管理系统

前言 今天给大家分享一个基于SpringBoot的课程管理系统。 1 系统介绍 课程管理系统是一种专门为学校设计的软件系统&#xff0c;旨在帮助学校高效地管理和组织各类课程信息。 该系统通常包括学生、教师和管理员三大角色。 他们可以通过系统进行选课、查看课程表、考试、进…...

新品发布 | 6 秒全谱成像,VIX-N320 内置推扫式高光谱相机重磅发布

深圳市中达瑞和科技有限公司正式发布全新一代VIX-N320内置推扫式可见光近红外高光谱相机&#xff0c;一款集高速成像、高精度光谱分析与便携性于一体的革命性产品。以突破性技术重新定义光谱成像效率与精度&#xff0c;开启智能感知新纪元。作为国内唯一同时掌握凝采式、推扫式…...

手写深拷贝函数

在 JavaScript 中&#xff0c;深拷贝是指创建一个对象或数组的完全独立副本&#xff0c;包括其嵌套的对象或数组。这意味着修改副本不会影响原始对象。 以下是手写一个通用的深拷贝函数的实现&#xff1a; 深拷贝函数实现 function deepClone(target, map new WeakMap()) {//…...

智能电网第3期 | 配电房巡检机器人通信升级方案

随着电力系统智能化发展&#xff0c;配电房巡检机器人是保障电力设备安全稳定运行的重要工具&#xff0c;其通信稳定性关乎巡检效率与质量。配电房巡检智能化升级面临着多项挑战&#xff1a; 电磁干扰大&#xff1a;配电房电气设备密集&#xff0c;电磁干扰强&#xff0c;易造成…...

阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索

——已获知乎作者【小小将】授权转载 最近AI圈的变化可谓是日新月异&#xff0c;随着大模型的技术突飞猛进&#xff0c;大模型的能力日益增强。这些都驱动着我们的搜索技术快速演进到了下一代&#xff0c;也就是 AI 搜索的技术。大模型的快速发展不仅重塑了搜索技术的基础&…...

同z科技面经

同z科技-2025-4-23 1.自我介绍 个人信息 校园经历 实习经历 项目经历 个人技能掌握 目前学习技术 2.封装缓存工具类怎么封装的 先介绍使用缓存的问题 解决的逻辑 封装的逻辑 应用 缓存穿透&#xff1a; 缓存雪崩&#xff1a; 缓存击穿&#xff1a; https://www…...

制作一款打飞机游戏19:碰撞检测

在这一章中&#xff0c;我们致力于解决碰撞检测问题&#xff0c;但它并不如我们所愿工作。 碰撞检测问题 今天我想解决的是碰撞检测问题&#xff0c;这个令人畏惧的碰撞检测。我理解&#xff0c;这里有很多复杂的if语句&#xff0c;但我们可以做到。 不过&#xff0c;在此之…...

python后端程序部署到服务器 Ubuntu并配合 Vue 前端页面运行

将 PyCharm 研发的 Web 后端系统程序部署到 Ubuntu 24.04 服务器并配合 Vue 前端页面运行&#xff0c;可按以下步骤操作&#xff1a; 1. 服务器环境准备 在开始部署之前&#xff0c;需要在 Ubuntu 24.04 服务器上安装必要的软件。 # 更新系统软件包 sudo apt update sudo ap…...

9N60-ASEMI无人机专用功率器件9N60

编辑&#xff1a;LL 9N60-ASEMI无人机专用功率器件9N60 型号&#xff1a;9N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;9A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;1.00Ω …...

Java单例模式详解:实现线程安全的全局访问点

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff…...

【无人机】无人机光流模块Optical Flow设置(三),光流测距一体传感器的配置。凌启科技的光流测距一体模块的测试。

目录 1、光流测距一体模块的配置&#xff0c;详细步骤 1.1、连接 1.2、上位机使用 1.3、切换为PX4协议 2、适配PX4飞控&#xff0c;QGC上参数配置 2.0、安装连接 2.1、串口配置&#xff1a; 2.2、启用光流辅助功能 2.3、启用测距辅助功能 2.4、高度参考设置 2.5、重…...

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?

目录 1 DGND、GROUND、GROUND_REF的区别 1.1 DGND&#xff08;Digital Ground&#xff09; 1.2 GROUND&#xff08;Ground&#xff09; 1.3 GROUND_REF&#xff08;Ground Reference&#xff09; 1.4 区别 2 VREF、VCC、VDD、VEE和VSS的区别 2.1 VREF&#xff08;Refere…...

VSFTPD+虚拟用户+SSL/TLS部署安装全过程(踩坑全通)

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置虚拟用户1.创建虚拟用户列表文件2.生成数据库文件3.设置虚拟用户独立访问权限 配置PAM认证1.创建PAM配置文件2.测试PAM认证 创建虚拟用户映射的系统用户生成SSL/TLS证书配置VSFTPD服务1…...

Java-File类详解(一篇讲透)

一&#xff1a;File类的实例化及常用方法 1.1 定义 1.2 构造器 &#xff08;1&#xff09;File(String pathname) 文件的路径表示方式 测试&#xff1a; &#xff08;2&#xff09;File(String parent,String child) 在父路径下创建子文件&#xff08;没后缀是目录&#xff0c…...

Representation Flow for Action Recognition论文笔记

原文笔记&#xff1a; What&#xff1a; 在本文中&#xff0c;我们提出了一种受光流算法启发的CNN层&#xff0c;用于学习动作识别的运动表示&#xff0c;而无需计算光流。我们的表示流层是一个完全可微分的层&#xff0c;旨在捕获模型中任何表示通道的“流”。其迭代流量优化…...

云计算领域需掌握的核心技术

云计算作为现代信息技术的核心基础设施&#xff0c;涵盖从基础资源管理到上层应用开发的完整技术栈。它依靠强大的计算能力&#xff0c;使得成千上万的终端用户不担心所使用的计算技术和接入的方式等都能够进行有效的依靠网络连接起来的硬件平台的计算能力来实施多种应用。 一、…...

Android仿今日头条Kotlin版本

软件信息 gradle-8.0Sdk信息 //编译版本 compileSdk33 //最小版本 minSdk24 //目标版本 targetSdk31Android Studio Giraffe | 2022.3.1 Patch 2&#xff08;建议版本不要太低&#xff09;MVVMAndroid Jetpack 项目注意 没有服务器&#xff0c;用的是Apifox模拟服务器返回&a…...

Javashop新零售电商系统:构建智能零售生态的终极解决方案

JavaShop Javashop新零售电商系统&#xff1a;构建智能零售生态的终极解决方案引言&#xff1a;数字化转型浪潮中的零售业变革Javashop新零售系统核心优势1. 全渠道融合&#xff1a;打破线上线下壁垒2. 智能化门店管理&#xff1a;赋能传统零售3. 智慧营销与会员运营 系统功能模…...

vscode如何多行同时编辑,vscode快速选中多行快捷键

目录 vscode如何多行同时编辑&#xff0c;vscode快速选中多行快捷键 一、实践情景 二、不同多选情景的操作方案 1、使用 Alt 鼠标点击选择任意行的任意位置 2、使用快捷键 Shift Alt 鼠标拖动 3、使用快捷键添加多行光标 4、结合正则表达式批量编辑 5、使用扩展插件&…...

珈和科技助力“农险提效200%”!“遥感+”技术创新融合省级示范项目荣登《湖北卫视》!

近日&#xff0c;湖北卫视《湖北十分》栏目报道了珈和科技遥感赋能农业保险创新&#xff0c;典型项目入选十大省级卫星应用示范标杆事迹&#xff0c;系统展示了珈和科技在卫星遥感与农业保险融合领域的创新成果。 作为空天农业领域的领军企业&#xff0c;珈和科技依托创新构建…...

UIAutomator 与 Playwright 在 AI 自动化中的界面修改对比

UIAutomator 与 Playwright 在 AI 自动化中的界面修改对比 在 AI 驱动的 UI 自动化中,Playwright(主要用于 Web)和 UIAutomator(用于 Android)的设计定位不同,对界面修改的支持也截然不同。下面从界面修改能力、API 设计、替代方案和实践建议等方面进行分析,对比两者在…...

Redisson Watchdog实现原理与源码解析:分布式锁的自动续期机制

引言 在分布式系统中&#xff0c;Redis分布式锁是解决资源竞争问题的常用方案。然而&#xff0c;当持有锁的客户端因GC、网络延迟或处理时间过长导致锁过期时&#xff0c;可能引发数据一致性问题。Redisson的Watchdog&#xff08;看门狗&#xff09;机制通过自动续期解决了这一…...

在C#串口通信中,一发一收的场景,如何处理不同功能码的帧数据比较合理,代码结构好

在 C# 串口通信的一发一收场景里&#xff0c;处理不同功能码的帧数据可采用以下合理的代码结构&#xff0c;它能让代码更具可读性、可维护性和可扩展性。 实现思路 定义帧结构&#xff1a;创建一个类来表示通信帧&#xff0c;其中包含功能码、数据等信息。功能码处理逻辑&…...

easypoi 实现word模板导出

特此非常致谢&#xff1a;easypoi实现word模板 基础的可以参考上文&#xff1b; 但是我的需求有一点点不一样。 这是我的模板&#xff1a;就是我的t.imgs 是个list 但是很难过的是easy poi 我弄了一天&#xff0c;我都没有弄出来嵌套list循环怎么输出显示&#xff0c;更难过…...

集结号海螺捕鱼服务器调度与房间分配机制详解:六

本篇围绕服务器调度核心逻辑进行剖析&#xff0c;重点讲解用户连接过程、房间分配机制、服务端并发策略及常见性能瓶颈优化。适用于具备中高级 C 后端开发经验的读者&#xff0c;覆盖网络会话池、逻辑服调度器与房间生命周期管理等关键模块。 一、服务器结构概览 整体系统采用…...

opencv--图像滤波

图像滤波 含义 方法 噪声是怎么产生的 线性滤波 概念 利用窗口对图像中的像素进行加权求和的滤波方式。 图像来源于小虎教程。 图像的滤波是二维滤波的过程。 滤波器窗口&#xff1a; 滤波器窗口&#xff08;也称为卷积核或模板&#xff09;是一个小的矩阵&#xff08;通常为…...

uniapp返回上一页接口数据更新了,页面未更新

注意&#xff1a;不是组件套组件可以不使用setTimeout延时 返回上一页一般会走onshow&#xff0c;但是接口更新了页面未更新 onShow(() > {// 切换城市后重新调用数据if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…...

redis 使用 Docker 部署 简单的Redis 集群(包括哨兵机制)

目录 环境准备 步骤 1&#xff1a;创建 Docker Compose 配置文件 步骤 2&#xff1a;创建配置文件 主节点配置文件 (redis.conf) 从节点配置文件 (slave.conf) 哨兵配置文件 (sentinel.conf) 步骤 3&#xff1a;启动 Redis 集群 步骤 4&#xff1a;验证集群状态 1. 检…...

私有知识库 Coco AI 实战(三):摄入 Elasticsearch 官方文档

相信经常使用 Elasticsearch 的小伙伴&#xff0c;难免要到 ES 官网查找资料&#xff0c;文档内容多难以查找不说&#xff0c;还有很多个版本&#xff0c;加上各种生态工具如 Filebeat、Logstash 头就更大了。今天我来介绍如何使用 Coco AI 快速搜索 Elasticsearch 官方文档。在…...

12-DevOps-Gitlab托管Jenkinsfile

前面通过执行脚本的方式&#xff0c;完成了pipline流水线的构建。脚本是保存在Jenkins中的&#xff0c;这种方式不利于迁移&#xff0c;也不利于查找脚本的历史变更信息。 通过把脚本放到GitLab中&#xff0c;然后在Jenkins中引用的方式来解决上述的问题。 创建Jenkinsfile文件…...

CSS3 基础(边框效果)

一、边框效果 属性功能示例值说明border-radius创建圆角border-radius: 20px;设置元素的圆角半径&#xff0c;支持像素&#xff08;px&#xff09;或百分比&#xff08;%&#xff09;。值为 50% 时可变为圆形。box-shadow添加阴影box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.5)…...

使用 VSCode 编写 Markdown 文件

目录 一、安装 Markdown 插件二、新建 Markdown 文档三、Markdown 基本语法目录和标题文本样式列表图片链接代码表格注脚与注释符号表情 四、将 Markdown 文档导出为 PDF 一、安装 Markdown 插件 参考文章&#xff1a;【[Markdown] 使用vscode开始Markdown写作之旅】 打开 VSco…...