【Godot4.3】基于ShapePoints的Polygon2D扩展

news2024/9/21 16:46:33

概述

这同样是来自2023年7月份的一项实验性工作,基于最初版本的ShapePoints静态函数库,实现了对Polygon2D节点的扩展,用于创建参数化图形的Polygon2D节点。

  • Polygon2D节点本身只能通过顶点绘制工具,创建很随意的多边形。
  • 通过ShapePoints函数库求取对应图形的顶点数据,然后赋值给Polygon2D节点的polygon属性,可以实现特殊几何图形的快速创建。

自定义节点体系

基于ShapePoints函数库所提供的图形,创建了包括矩形、圆、星形等等一些列的参数化图形Polygon2D节点。

image.png

Polygon2DRect(矩形)

# ========================================================
# 名称:Polygon2DRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:07:01
# ========================================================
@tool
class_name Polygon2DRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()
# =================================== 虚函数 ===================================	
func _init():
	update_polygon()		
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.rect(Vector2(width,height))

可以看到省略注释部分,代码相当简单:

  • @tool代表了它可以在编辑器中响应参数(导出变量)的变化,
  • extends Polygon2D代表了这个节点继承自Polygon2D,可以拥有和使用它的全部属性、方法和信号。
  • widthheight两个参数(导出变量)用于控制矩形的大小,在其setter中,修改值后,会调用update_polygon()方法
  • update_polygon()方法中,会根据目前的widthheight参数值,从ShapePoints函数库中求取矩形顶点,然后赋值给Polygon2D节点的polygon属性,从而实现形状的动态更新。

在编辑器中创建和编辑Polygon2DRect节点

Polygon2DCircle(圆形)

# ========================================================
# 名称:Polygon2DCircle
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:25:20
# ========================================================
@tool
class_name Polygon2DCircle extends Polygon2D
# =================================== 参数 ===================================
## 圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================	
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.circle(r)

在编辑器中创建和编辑Polygon2DCircle节点

Polygon2DChamferRect(切角矩形)

# ========================================================
# 名称:Polygon2DChamferRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的切角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:29:14
# ========================================================
@tool
class_name Polygon2DChamferRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()

## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var a:float = 5:
	set(val):
		a = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var b:float = 5:
	set(val):
		b = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var c:float = 5:
	set(val):
		c = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var d:float = 5:
	set(val):
		d = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.chamfer_rect(Vector2(width,height),a,b,c,d)

image.png

Polygon2DRoundRect(圆角矩形)

# ========================================================
# 名称:Polygon2DRoundRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:32:08
# ========================================================
@tool
class_name Polygon2DRoundRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()

## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r1:float = 5:
	set(val):
		r1 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r2:float = 5:
	set(val):
		r2 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r3:float = 5:
	set(val):
		r3 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r4:float = 5:
	set(val):
		r4 = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.round_rect(Vector2(width,height),r1,r2,r3,r4)

image.png

Polygon2DRegular(正多边形)

# ========================================================
# 名称:Polygon2DRegular
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的正多边形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:40:39
# ========================================================
@tool
class_name Polygon2DRegular extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(0,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()

## 角数
@export_range(3,1000,1,"suffix:边") var edges:int=5:
	set(val):
		edges = val
		update_polygon()

## 圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.regular_polygon(start_angle,edges,r)
  • 上面基于Godot4.3的@export_range提供的单位提示功能进行了改进,你可以在参数中看到度数和边数等单位的提示。

image.png

Polygon2DStar(星形)

# ========================================================
# 名称:Polygon2DStar
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的星形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:44:28
# ========================================================
@tool
class_name Polygon2DStar extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(0,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()

## 角数
@export_range(3,1000,1,"suffix:边") var edges:int=5:
	set(val):
		edges = val
		update_polygon()

## 外部圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()

## 内部圆半径
@export var r2:float = 20:
	set(val):
		r2 = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.star(start_angle,edges,r,r2)

image.png

Polygon2DSector(扇形)

# ========================================================
# 名称:Polygon2DSector
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的扇形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217:48:32
# ========================================================
@tool
class_name Polygon2DSector extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(-360,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()

## 结束角度
@export_range(-360,360,1,"degrees") var end_angle:int = 90:
	set(val):
		end_angle = val
		update_polygon()

## 半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()

# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.sector(start_angle,end_angle,r)

image.png

组合创建复杂形状

简单饼图

image.png

嵌套的形状

image.png

创建简单游戏原型

image.png

总结

  • 基于ShapePoints静态函数库对Polygon2D节点的扩展,可以用于创建参数化图形的Polygon2D节点,补足Polygon2D本身的绘制限制。
  • 通过结合多个参数化图形的Polygon2D节点,可以创建一些简单的几何图形和它们的组合形式,甚至是创建简单几何游戏的原型
  • 它让Godot拥有了一种简便的内置矢量图形功能。

未来展望

  • 和很多其他的工作一样,这是一个被简单试验,然后长期搁置的工作。本篇通过初步整理,总结了基础的实现原理和用法。后期可能会进行大量改进。
  • 因为对ShapePoints静态函数库的依赖,可能会导致一些问题,尤其是对ShapePoints静态函数库的破坏性重写之后,可能会带来一些问题,所以好的方法是将图形点求取函数放置到各个参数化图形的Polygon2D节点中,降低依赖的同时,还可以使用新的代码或做特定的修改。
  • 基于Godot4.3的新特性,可以对导出变量部分做更好的设计,诸如上面提到的添加单位等
  • 可以创建更多的图形

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库管理系统下载安装

一. MySQL概述: 1.数据库相关概念 数据库:存储数据的仓库,数据是有组织地进行存储(DataBase 简DB)数据库管理系统:操纵和管理数据库的大型软件 (DataBase Management System 简DBMS)SQL:操…

一分钟创建自己的分班查询系统,家长扫码即可进群

开学后,老师们的忙碌也达到了顶峰。整理教材、准备课程计划、布置教室,这些工作已经让人应接不暇,更别提还要处理分班事宜。以往,老师们需要一个个通知家长分班结果,这不仅耗时耗力,还容易出错。家长们也常…

​数字IC设计基本概念之多时钟设计​

当设计中使用了多个时钟时,这些时钟域之间的关系可能是synchronous、asynchronous或者exclusive的。如下所示: Synchronous: Asynchronous: Exclusive: 需要人为地指定设计中时钟之间的关系,EDA工具才能正…

燃油车淘汰倒计时开始了?

文 | AUTO芯球 作者 | 璇子 新能源车要取代燃油车了? 油车车主先别喷啊 就在上个月 新能源乘用车月销量数据一经公布 我一看 渗透率居然达到了惊人的51% 啥概念啊 如果卖100台车 51台都是新能源 其他49台才是燃油车 看到这数据 有好多看热闹的人就在说 …

Vue组件:创建组件、注册组件、使用组件

1、创建组件 组件(component)是 Vue.js 最强大的功能之一。通过开发组件可以封装可服用的代码,将封装好的代码注册成标签,扩展 HTML 元素的功能。几乎任意类型应用的界面都可以抽象为一个组件树,而组件树可以用独立可…

【完-移动云-基础】移动云架构和ECS

一、移动云产品架构 产品架构分为IaaS、PaaS、SaaS 我司使用的是IaaS,仅托管了服务器资源。软件则由浪潮提供。 一图理解三者区别 二、云主机ECS 是一种弹性按需提供的云端服务器,可选择不同的配置 基础服务: 虚拟化、镜像、云硬盘、云…

autoware整体架构的分析

autoware framework sensinglidar driver(lidar驱动)PointCloud Preprocessing(点云预处理)Detection(检测)GNSS (全球导航卫星系统)IMU (惯性测量单元) Localization(定位)Pose Ini…

产品需求过程管理重要性

产品需求过程管理重要性 背景 以下都是真实事项经历回顾,在产品开发过程中,产品经理与研发团队之间的沟通至关重要。然而,沟通不畅或信息缺失常常导致需求无法准确传达,最终影响产品的成功。以下是一些常见的问题: 1.需…

Qt插件开发总结6--插件间依赖

文章目录 一、前言二、基本策略三、效果展示四、关键代码4.1、主程序4.2、插件管理器4.3、插件A 一、前言 插件大致可分为:功能性插件、界面插件;一个软件由一堆插件堆起来,必然难以避免插件间相互引用,例如:插件A调用…

安防监控/视频汇聚EasyCVR视频监控平台级联上级,无法播放是什么原因?

EasyCVR视频监控平台,作为一款智能视频监控综合管理平台,凭借其强大的视频融合汇聚能力和灵活的视频能力,在各行各业的应用中发挥着越来越重要的作用。EasyCVR视频汇聚平台采用先进的图像处理技术和传输协议,能够确保高清、稳定的…

Qt (13)【Qt窗口 —— 颜色对话框 QColorDialog】

阅读导航 引言一、颜色对话框 QColorDialog简介二、常用方法介绍⭕参数说明 三、使用示例 引言 在深入探讨了Qt的QMessageBox之后,我们现在转向QColorDialog,一个让用户轻松选择颜色的实用对话框,为Qt应用增添色彩选择的便捷性。 一、颜色对…

Java语言程序设计基础篇_编程练习题题目:17.16 (字符的頻率)

题目:17.16 (字符的頻率) 编写一个程序,提示用户输入一个 ASCII 文本文件名,然后显示文件中每个字符出现的频率。 代码示例 编程练习题17_16FrequencyOfCharacters.java package chapter_17;import java.io.DataInputStream; import java…

【HarmonyOS 4.0】网络请求 - axios

axios 相当于鸿蒙应用项目的一个第三方库,鸿蒙应用项目使用ohpm管理(包括安装,卸载等)第三方库。除了axios,还有很多其他的第三方库可供开发者使用,所有的第三方库都收录在OpenHarmony三方库中心仓。 1. 安…

以低代码技术加速推动企业数字创新

在数字化转型的浪潮中,企业面临着前所未有的挑战和机遇。随着技术的不断进步,企业需要快速适应市场变化,创新产品和服务,以保持竞争力。低代码技术作为一种新兴的开发模式,正逐渐成为企业数字创新的重要推动力。 低代码…

电比例流量泵放大器

电比例泵控制是一种精准的液压传动控制系统,利用输入的电信号按比例来调制液压参数,以实现对流量、压力和方向的连续且成比例的控制。这种控制在现代工业中的应用非常广泛,尤其在需要精确控制的场合。 按控制元件分类:电液比例控…

无人机培训机构必备运营合格证及驾驶员训练机构合格证详解

无人机培训机构在运营过程中,必须持有必要的运营合格证及驾驶员训练机构合格证,以确保其培训活动的合法性、规范性和安全性。以下是对这两种合格证的详细解析: 无人机培训机构运营合格证 无人机培训机构运营合格证是国家或地区民航管理部门…

【软考中级攻略站】-软件设计师(1)-数值及其转换和数据表示

进制转换 n进制->十进制 步骤说明: 识别基数:首先确认你正在处理的是n进制数,这里的n就是该数的基数。 数位权重:从右向左数,每个位置上的数字都有一个权重,最右边的位置权重为0,依次向左…

【JUC】10-Java内存模型JMM

1. JMM 通过JMM来实现和主内存之间的抽象关系。屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。 三大特性:原子性:互斥,同时成功或失败。有序性:指令重排序后有序。可见性&a…

MySQL递归获取商品分类以及所有下级分类商品

现在就是我们有一张商品表,还有一张分类表,商品表有一个字段用来记录当前商品分类id的,然后查询时候因为分类是有层级的,如果我们想通过顶层分类获取到它和所有子类的商品时就会需要用到MySQL的递归查询了。 首先是针对 MySQL 8.…

NCMMSC-CNVSRC 2024视觉语音识别竞赛圆满落幕

8月16日上午,NCMMSC-CNVSRC 2024 学术研讨会在乌鲁木齐召开的第十九届全国人机语音通讯学术会议(NCMMSC 2024)上举行。会上公布了本次视觉语音识别竞赛 CNVSRC 2024 的最终结果,并举行了颁奖仪式。 本次竞赛由 NCMMSC 2024 组委会…