Unity涂鸦纹理实现

embedded/2024/10/18 14:16:41/

文章目录

  • 前言
  • 实现过程
    • UV坐标和UI坐标对齐
    • 修改像素代码

前言

心血来潮实现下场景中提供一张纹理进行涂鸦的功能。
最终实现效果:
在这里插入图片描述

实现过程

UV坐标和UI坐标对齐

这里的纹理使用了UGUI的Canvas进行显示,所以这里使用一张RawImage。

在这里插入图片描述
因为Unity的视口坐标是以左下角为(0,0)坐标基准的,所以对RawImage的RectTransform进行调整。锚点改成左下角,Pivot坐标改成(0,0)
在这里插入图片描述
因为使用鼠标进行输入的,所以这里需要获取鼠标后,在对坐标进行偏差计算,这里由视口坐标转换成纹理的UV坐标的格式为:
uvPos = mousePos - rectOffest

rectOffset是RawImage的矩形坐标

修改像素代码

计算出相应的x,y坐标后写入纹理,代码如下

    private RawImage m_rawImage;private Texture2D m_texture2D; private int m_widht = 500, m_height = 500;private Vector2 m_offsetVect = new Vector2(); private void Awake(){m_rawImage = GetComponent<RawImage>();m_texture2D = new Texture2D(m_widht,m_height);Color[] colors = new Color[m_widht * m_height];for (int i = 0; i < colors.Length;i++){colors[i] = Color.white; }m_texture2D.SetPixels(colors);m_texture2D.Apply();m_rawImage.texture = m_texture2D;m_rawImage.SetAllDirty();m_offsetVect = m_rawImage.rectTransform.anchoredPosition;}private void Draw(Vector2 pos){int x = Mathf.FloorToInt(pos.x);int y = Mathf.FloorToInt(pos.y);if (x > 0 && x < m_widht && y >=0 && y< m_height){m_texture2D.SetPixel(x,y,Color.black); m_texture2D.Apply(); }} private void Update(){ if (Input.GetMouseButton(0)){Vector2 mousePos = Input.mousePosition; mousePos -= m_offsetVect;Draw(mousePos);  }} 

这样就可以在纹理上进行涂鸦了,但是这个时候会发现,当我们的鼠标很快的时候涂鸦的像素点之间就会有明显的间隔,那么我们就需要做一下插值运算了。

需要记录上一次帧数的画的坐标进行插值。那么修改Update方法如下:

private void Update(){if (Input.GetMouseButtonDown(0)){m_lastFramePos = (Vector2)Input.mousePosition - m_offsetVect;} if (Input.GetMouseButton(0)){Vector2 mousePos = Input.mousePosition; mousePos -= m_offsetVect;Draw(mousePos); if (m_lastFramePos!=mousePos){float dis = Vector2.Distance(mousePos, m_lastFramePos);if (dis > m_brushLerpSize){Vector2 dir = (mousePos - m_lastFramePos).normalized;int num = (int)(dis / m_brushLerpSize);for (int i = 0; i < num; i++){Vector2 newPoint = m_lastFramePos + dir * (i + 1) * m_brushLerpSize;Draw(newPoint);}}}//保存下上帧数的点m_lastFramePos = mousePos;}} 

http://www.ppmy.cn/embedded/26456.html

相关文章

Python如何连接MySQL数据库

一、引言 在Python中&#xff0c;我们经常需要连接和操作数据库&#xff0c;其中MySQL是最流行的关系型数据库之一。在Python中连接和操作MySQL数据库&#xff0c;我们通常会使用mysql-connector-python或PyMySQL这样的库。本文将介绍如何使用mysql-connector-python库来连接M…

亿图图示使用教程

亿图图示原名&#xff1a;&#xff08;Edraw Max&#xff09; 1. 下载安装&#xff1a;访问亿图图示官网&#xff0c;下载并安装软件。安装完成后&#xff0c;打开软件并注册账号。 2. 选择模板&#xff1a;在软件界面中&#xff0c;可以看到各种类型的模板&#xff0c;如流程图…

C# 中 object.ReferenceEquals 方法

在 C# 中&#xff0c;object.ReferenceEquals 方法用于确定两个对象是否引用同一个内存地址。它是一个静态方法&#xff0c;可以通过 object.ReferenceEquals(obj1, obj2) 的方式调用。 以下是对 object.ReferenceEquals 的详细解释和示例说明&#xff1a; object.ReferenceEq…

SpringCloud——consul

SpringCloud——consul 一、consul安装与运行二、consul 实现服务注册与发现1.引入2.服务注册3.服务发现 三、consul 分布式配置1.基础配置2.动态刷新3.配置持久化 四、参考 Eureka已经停止更新了&#xff0c;consul是独立且和微服务功能解耦的注册中心&#xff0c;而不是单独作…

python序列化、反序列化函数的参数,用于问题复现

python序列化、反序列化函数的参数,用于问题复现 一.代码二.输出 一.背景 1.想dump出pytorch模型所调用基础算子的参数 2.对于Tensor,ndarray。只保存type,shape,不存值 3.之后可通过以上保存的信息,生成算子的参数,运行单算子 二.目前支持以下类型及嵌套 Tensor,ndarray,int,f…

【分享】如何将word格式文档转化为PDF格式

在日常的办公和学习中&#xff0c;我们经常需要将Word文档转换为PDF格式。PDF作为一种通用的文件格式&#xff0c;具有跨平台、易读性高等优点&#xff0c;因此在许多场合下都更为适用。那么&#xff0c;如何实现Word转PDF呢&#xff1f;本文将介绍几种常用的方法&#xff0c;帮…

Ubuntu Linux完全入门视频教程

Ubuntu Linux完全入门视频教程 UbuntuLinux完全入门视频教程1.rar UbuntuLinux亮全入门视频教程10.ra UbuntuLinux亮全入门视频教程11.ra UbuntuLinux完全入门视频教程12.ra UbuntuLinux亮全入门视频教程13.ra UbuntuLinux完全入门视频教程14.rar UbuntuLinux完全入门视频教程…

04 Docker练习赛从0开始到 docker 镜像提交

1.1 本地安装 docker 工具 这里以ubutun下安装docker为例,其他操作系统安装命令略有不同,可自行百度。(建议使用阿里源安装速度快) sudo apt install docker.io如果你本地有gpu,请继续执行如下命令以支持gpu调用: 注意: 英伟达对 docker 支持的 linux 发行版:https:/…