【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算

概述

在设计圆角容器时突发奇想:

  • 将圆角矩形的每个顶点坐标除以对应圆角矩形所在Rect2size,就得到了顶点对应的UV坐标。
  • 然后使用draw_colored_polygon,便可以做到用图片填充圆角矩形的效果。
  • 而且这种计算的效果就是图片随着其填充的图像缩放。
  • 这就类似于是在CanvasItem的绘图函数基础上实现了矢量蒙版效果

基础原理

  • 以上面的五角星为例,它的某个顶点P的UV坐标,应该如下计算:
    顶点P的UV坐标 = 点P的坐标 五角星所在轴对齐包围盒Rect2的size 顶点\text{P}的\text{UV}坐标 = \frac{点\text{P}的坐标}{五角星所在轴对齐包围盒\text{Rect2}的\text{size} } 顶点PUV坐标=五角星所在轴对齐包围盒Rect2sizeP的坐标

  • 前提是:五角星Rect2position(0,0)

  • 这是一种类似自适应的填充形式,图片会随图形的缩放进行缩放,大小和位置始终与图形的包围盒Rect2一致

  • 但是在其他情况下,我们或许需要实现一些复杂的填充效果,比如控制图片进行偏移、旋转、缩放等。这时,上面的UV计算方法就不顶用了。

此时,我们需要考虑图片本身和图形两者是独立的,然后考虑通过它们之间偏移关系去映射坐标位置。

测试

编写了一个基础的UI场景进行测试:

# ==========================================================
# UVtest
# 类型:测试
# 概述:实现基于绘图函数的矢量蒙版效果
# 巽星石
# 创建时间:20251322:50:10
# 最后修改时间:20251323:04:28
# ==========================================================@tool
extends Control@export var texture:Texture2D:set(val):texture = valqueue_redraw()@export var texture_position:=Vector2(): ## 纹理的偏移set(val):texture_position = valqueue_redraw()@export var texture_scale:=Vector2.ONE: ## 纹理缩放值set(val):texture_scale = valqueue_redraw()@export_range(-360,360,1) var texture_rotation_degree:=0: ## 纹理旋转set(val):texture_rotation_degree = valqueue_redraw()@export var fill_color:=Color.WHITE:set(val):fill_color = valqueue_redraw()func _draw() -> void:var rect = get_rect() * get_transform()var pots = star(0,5,rect.size.y/2.0,rect.size.y/3.0,rect.get_center())# 绘制背景if texture:var rot = deg_to_rad(texture_rotation_degree)var image_rect = Rect2(texture_position,texture.get_size() * texture_scale)var r:Vector2 = rect.size/image_rect.size  # 比例var uvs:PackedVector2Arrayfor pot in pots: # 计算UV坐标# 进行旋转变换后的坐标var p = (pot - rect.get_center()).rotated(-rot) + rect.get_center()uvs.append(((p - texture_position)/rect.size) * r)# 绘制圆角矩形draw_colored_polygon(pots,fill_color,uvs,texture)else:draw_polygon(pots,[fill_color])pass# 星形
func star(start_angle:int,edges:int,r:float,r2:float = 0,offset:Vector2 = Vector2.ZERO):if r2 == 0:r2 = r/2.0var points:PackedVector2Array# 外部半径var vec  = Vector2.RIGHT.rotated(deg_to_rad(start_angle)) * r# 内部半径var vec2  = Vector2.RIGHT.rotated(deg_to_rad(start_angle + 180/edges)) * r2for i in range(edges):points.append(vec.rotated(2 * PI/edges * i) + offset)points.append(vec2.rotated(2 * PI/edges * i) + offset)return points

效果:

进行偏移、旋转和缩放后的效果:

提示

本例中暂时没有使用几何图形自身的Rect2,而是采用了测试场景控件元素的Rect2,所以带来的实际效果可能不太相同。

也就是说这还是一个未完成的实验版本。后续敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23784.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机-AT24CXX存储器工作原理

1、AT24CXX存储器工作原理 1.1、特点: 与400KHz,I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…

Linux网络 网络层

IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节,4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…

Unity百游修炼(1)——FootBall详细制作全流程

一、引言 游玩测试: Football 游玩测试 1.项目背景与动机 背景:在学习 Unity 的过程中,希望通过实际项目来巩固所学知识,同时出于对休闲小游戏的喜爱,决定开发一款简单有趣的小游戏加深自己的所学知识点。 动机&#…

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构,顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考: C语言(11)------------->while循…

【1】VS Code 新建上位机项目---C#基础语法

VS Code 新建上位机项目---C#基础语法 1 基本概念1.1 准备工具1.2 新建项目2 C#编程基础2.1 命名空间和类2.2 数据类型2.3 控制台输入输出2.3.1 输入输出: write 与 read2.3.2 格式化 : string.Foramt() 与 $2.3.3 赋值与运算2.4 类型转换2.4.1 数值类型之间的转换:(int)2.4…

SQL:DQL数据查询语言以及系统函数(oracle)

SQL Structured Query Language,结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL(Data Query Language):数据查询语言 DDL(Data Definition Language):数据…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析:HAL_GPIO_Init 前言 我们终于到达了熟悉的地方,对GPIO的初始化。经过漫长的铺垫,我们终于历经千辛万苦,来到了这里。关于GPIO的八种模式等更加详细的细节,由于只是点个灯&am…

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志,面向运筹调控、算法特征、分析报表、诊断监控等应用场景,进行了品牌数仓能力建设。随着业务发展,基于Lambda架构的数仓开发模式,缺陷日益突出:…

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…

基于Docker的前端环境管理:从开发环境到生产部署的实现方案

# 基于Docker的前端环境管理:从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台,可以将应用程序及其依赖项打包为一个容器,提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程,提高…

连锁管理系统的五大核心设计及 PHP 源码分享

在当今竞争激烈的连锁商业领域,高效的管理系统是企业脱颖而出的关键。商淘云连锁管理系统凭借其卓越的功能和灵活的架构,为连锁企业提供了强大的运营支持。在这里详细介绍其五大核心设计,并分享相关的 PHP 源码示例。 一、总部进销存管理 &a…

C语言基本知识------指针(4)

1. 回调函数是什么? 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。 void qsort(void base,//指针…

MTK-Android13-包安装器PackageInstaller 静默安装实现

目的 我们最终是为了搞明白安装的整个流程。一方面通过安卓系统自带的包安装器来了解PMS 安装流程;另一方面熟悉框架层Framework 针对Android apk 安装流程。 前两篇文章分析了PackagerInstaller 安装流程。 Android13-包安装器PackageInstaller-之apk安装跳转 An…

qt-C++笔记之创建和初始化 `QGraphicsScene` 和 `QGraphicsView` 并关联视图和场景的方法

qt-C++笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法 code review! 参考笔记 1.qt-C++笔记之创建和初始化 QGraphicsScene 和 QGraphicsView 并关联视图和场景的方法 2.qt-C++笔记之QGraphicsScene和 QGraphicsView中setScene、通过scene得到vie…

《一起打怪兽吧》——自制一款Python小游戏

《一起消灭怪兽吧》——在深夜的屏幕前,你是指引光明的勇者。键盘化作利剑,用方向键在像素战场游走,发射吧,每次击杀都有代码绽放的烟火。这款由Python与Pygame铸就的小游戏,让0与1的世界生长出童真的浪漫。 文章目录…

IDEA中查询Maven项目的依赖树

在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端&#xff…

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验,包括如何根据版本号决定推送到 releases 或 snapshots 仓库,如何在构建过程中跳过测试,父项目如何控制子项目依赖版本,父项目依赖是否能传递到子项目,如何跳过 Maven dep…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题,多层循环、分支语句练习,难度★✮☆☆☆。 题目题解详见:https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题,多层循环、分…

uniapp在app下使用mqtt协议!!!支持vue3

什么?打包空白?分享一下我的解决方法! 第一步 找大师算过了,装4.1版本运气好! 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法! // utils/mqtt.js import mqt…