【Godot4.2】CanvasItem绘图函数全解析 - 3.绘制纹理

概述

前两节我们讲述了常见几何图形绘制以及对几何图形应用变换的基础知识。
本节我们来讲如何在CanvasItem中绘制纹理。

系列目录

  • 0.概述
  • 1.绘制简单图形
  • 2.设定绘图变换
  • 3.绘制纹理
  • 4.绘制样式盒
  • 5.绘制字符和字符串
  • 6.TextLine和TextParagraph详解
  • 7.自定义节点TextBoard
  • 8.绘制点索引
  • 9.绘制表格

纹理绘制函数

CanvasItem纹理绘制函数有3个,参数以及效果有所差异:

draw_texture()

draw_texture(),在给定的位置以原尺寸绘制纹理。3个参数:

  • texture:要绘制的纹理图片,Texture2D类型
  • position:图片绘制的位置(左上角)
  • modulate:调制颜色,与纹理的颜色相乘,默认为Color(1, 1, 1, 1)
extends Node2Dconst ICON = preload("res://icon.svg")  # Godot图标func _draw() -> void:# 修改绘图坐标原点draw_set_transform(Vector2(200,200))# 直接原样绘制draw_texture(ICON,Vector2())

上面的代码中:

  • 我们首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 接着用draw_texture()直接原样绘制ICON

绘制效果:
image.png

draw_texture_rect()

  • draw_texture_rect(),在给定矩形范围中进行纹理的绘制,会对图片进行缩放,参数如下:
    • texture:要绘制的纹理图片,Texture2D类型
    • rect: Rect2类型,给定绘图的位置和尺寸
    • tile: bool类型,决定图片是否平铺
    • modulate: 调制颜色
    • transpose: bool类型,默认为false,决定是否交换 X 和 Y 坐标
extends Node2Dconst ICON = preload("res://icon.svg")  # Godot图标func _draw() -> void:# 修改绘图坐标原点draw_set_transform(Vector2(200,200))# 在一个给定矩形范围中进行绘制var rect = Rect2(Vector2(200,0),Vector2(200,300))draw_texture_rect(ICON,rect,false)

上面的代码中:

  • 我们同样首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 然后我们用draw_texture_rect()(200,200)为起始点(需要加上绘图原点的(200,200)),尺寸为(200,300)的矩形区域内,绘制ICON

绘制效果如下:
image.png

颠倒X、Y坐标

通过为draw_texture_rect()传入transpose=true,则绘制时图像的XY轴会翻转,类似与将图形逆时针旋转90度效果。

extends Node2Dconst ICON = preload("res://icon.svg")  # Godot图标func _draw() -> void:# 修改绘图坐标原点draw_set_transform(Vector2(200,200))# 在一个给定矩形范围中进行绘制var rect = Rect2(Vector2(0,0),Vector2(200,300))draw_texture_rect(ICON,rect,false,Color.WHITE,true)

绘制效果:
image.png

重复纹理

通过将tile参数设为true,可以开启纹理的重复模式。

extends Node2Dconst ICON = preload("res://icon.svg")  # Godot图标func _draw() -> void:# 修改绘图坐标原点draw_set_transform(Vector2(200,200))# 在一个给定矩形范围中进行绘制var rect = Rect2(Vector2(0,0),Vector2(200,300))draw_texture_rect(ICON,rect,true)

绘制效果:
image.png

draw_texture_rect_region()

  • draw_texture_rect_region(),可以看做是在draw_texture_rect()基础上,用另一个Rect2定义裁切矩形,然后在指定的矩形中绘制指定裁切矩形所定义的纹理的局部。

以下面代码为例:

extends Node2Dconst ICON = preload("res://icon.svg")  # Godot图标func _draw() -> void:# 修改绘图坐标原点draw_set_transform(Vector2(200,200))# 在一个给定的矩形范围内绘制纹理的一个区域var rect = Rect2(Vector2(500,0),Vector2(200,200))var clip_rect = Rect2(Vector2(0,0),Vector2(100,100))draw_texture_rect_region(ICON,rect,clip_rect)

上面的代码中:

  • 我们同样首先加载Godot的图标并存储为ICON常量
  • 然后用draw_set_transform()将绘图的原点设为(200,200)
  • 最后我们用draw_texture_rect_region()(500,0)为起始点(需要加上绘图原点的(200,200)),尺寸为(200,200)的矩形区域内,绘制ICON从左上角(0,0)开始,尺寸为(100,100)区域的纹理。

绘制效果如下:
image.png

纹理绘制函数的应用

借由三个纹理绘制函数,我们将可以在CanvasItem中绘制图形,并与几何图形联合使用。

创建平铺背景纹理

通过使用某些图片,通过平铺就可以创建无缝的背景纹理,可以使用小图片创建大背景。

extends Node2Dconst WL = preload("res://wl.jpg")func _draw() -> void:# 在一个给定的矩形范围内绘制纹理的一个区域var rect = Rect2(Vector2(10,10),Vector2(1100,600))draw_texture_rect(WL,rect,true)

image.png

自定义2D节点显示图片

我们通过设定一个名叫texture的导出变量来接收从文件系统和监视器面板设定的图片。
然后在_draw()中使用draw_texture原样绘制出来。
代码如下:

@tool
extends Node2D@export var texture:Texture2D:set(val):texture = valqueue_redraw()func _draw() -> void:# 绘制texture参数指定的纹理if texture:draw_texture(texture,Vector2(0,0))

设定后的效果:
image.png

让纹理中心与原点重合
@tool
extends Node2D@export var texture:Texture2D:set(val):texture = valqueue_redraw()func _draw() -> void:# 绘制texture参数指定的纹理if texture:var img_size = texture.get_size()draw_texture(texture,-img_size/2.0)
  • 通过texture.get_size()获取纹理的尺寸,存储到变量img_size
  • 并将纹理的绘制位置设为-img_size/2.0,来使图片的中心与Node2D的原点重合

绘制后的效果:
image.png

显示图片区域

在上面代码的基础上,我们继续添加纹理区域相关的参数。

@tool
extends Node2D@export var texture:Texture2D:set(val):texture = valqueue_redraw()@export_group("region")## 是否启用显示图形区域
@export var region_enabled:= false:set(val):region_enabled = valqueue_redraw()## 区域的起始点
@export var region_pos:Vector2:set(val):region_pos = valqueue_redraw()## 区域的尺寸		
@export var region_size:Vector2:set(val):region_size = valqueue_redraw()func _draw() -> void:# 绘制texture参数指定的纹理if texture:var img_size = texture.get_size()  # 纹理的尺寸if region_enabled: # 开启了纹理区域var clip_rect = Rect2(region_pos,region_size)var texture_rect = Rect2(-region_size/2.0,region_size)draw_texture_rect_region(texture,texture_rect,clip_rect)else:  # 未开启纹理区域draw_texture(texture,-img_size/2.0)

效果如下:
image.png
只要启用region_enabled,会按照region_posregion_size指定的矩形区域显示图片的局部。
而禁用region_enabled后,则会显示原图:
image.png

总结

  • 本节内容比较简单,主要涉及绘制纹理相关的3个函数。
  • 通过这3个函数,能实现很多自定义节点或绘图时的功能需要。

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

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

相关文章

2024年国内五大企业邮箱是哪些?附最新企业邮箱价格对比

如今,不论是外贸公司或是中小企业,应用企业邮箱解决日常办公的规定都越来越频繁。国内企业邮箱的提供商有很多,排名前五的是Zoho Mail、阿里、腾讯、网易、新浪。他们的功能特点和价格怎么样?小编今天就带您了解一下。 一、Zoho …

人员抽烟AI检测算法原理介绍及实际场景应用

抽烟检测AI算法是一种基于计算机视觉和深度学习技术的先进工具,旨在准确识别并监测个体是否抽烟。该算法通过训练大量图像数据,使模型能够识别出抽烟行为的关键特征,如烟雾、手部动作和口部形态等。 在原理上,抽烟检测AI算法主要…

【Python习题】若一个正整数的逆序数和它自身相等,则该整数称为回文数。编写程序,找出 1000以内的所有回文数。

题干 若一个正整数的逆序数和它自身相等,则该整数称为回文数。编写程序,找出 1000以内的所有回文数。 代码

【尚硅谷最新】一篇文章带你搞懂Maven

目录 一、Maven是什么? 二、Maven安装和配置 2.1 Maven安装 2.2 Maven环境配置 (1)配置MAVEN_HOME (2)配置Path (3)命令测试(cmd窗口) 2.3 Maven功能配置 &…

自动化测试-web

一、自动化测试理论: UI: User Interface (用户接口-用户界面),主要包括:app 和webUI自动化测试:使用工具或代码执行用例的过程什么样的项目适合做自动化: 需要回归测试项目(甲方自…

体验Humane AI:我与可穿戴AI别针的生活

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

PMDM-针对特定口袋的分子扩散生成模型

Pocket based Molecular Diffusion Model (PMDM) 模型 是 腾讯AI lab 2023年发表在预印本上的文章,第一作者为Huang Lei。文章链接:https://www.biorxiv.org/content/10.1101/2023.01.28.526011v1.full.pdf 当前,该文章已经正式发表在nature…

数据结构--循环队列

1.队列的定义: 和栈相反,队列(queue)是一种先进先出(first in first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素. 在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front). 2.循环队列的设计图示: 3.循环队列的结构设计: ty…

OpenHarmony实例应用:【常用组件和容器低代码】

介绍 本篇Codelab是基于ArkTS语言的低代码开发方式实现的一个简单实例。具体实现功能如下: 创建一个低代码工程。通过拖拽的方式实现任务列表和任务信息界面的界面布局。在UI编辑界面实现数据动态渲染和事件的绑定。 最终实现效果如下: 相关概念 低代…

Normalization

Norm介绍 归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年&…

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时,可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…

数字化时代:IT界的致富秘籍 —— 策略×态度×机遇

🌟 数字化时代:IT界的致富秘籍🚀 —— 策略态度机遇 在数字化浪潮中冲浪🏄‍♂️,IT行业犹如一片无限可能的蓝海。想要在这片汹涌的海洋中捕获财富,不是一件轻而易举的事。让我们一起深入探索,如…