Unity Mesh实现图片切割(一)- 线与顶点_unity图形切片polygon-程序员宅基地

技术标签: 技术分享  Unity3D  

Unity Mesh实现图片切割(一)- 线与顶点

Unity Mesh实现图片切割 github博客链接

一、 PolygonCollider2D获取顶点和线段

在这里插入图片描述
PolygonCollider2D中有points属性,对应和图形的顶点,PolygonCollider2D的顶点可以手动添加或者删除,右键Element X可选择删除这个点。由于Unity
中所有图片都是连个三角面组成的矩形,在此需要手动拖动点勾勒出图片的有效切割范围。points属性的点顺序如图逆时针从Element0到Element3。

1. 顶点的获取方式
// 通过Collider获取顶点的世界坐标,根据gameObject的缩放和位置重新计算
Vector2[] GetVerticesFromPolygonCollider(){
	SpriteRenderer sr = gameObject.GetComponent<SpriteRenderer>();
	Sprite sprite = sr.sprite;
	PolygonCollider2D collider = gameObject.GetComponent<PolygonCollider2D>();
	Vector2[] vertices = collider.points;
	for (int i = 0; i < vertices.Length; i++)
	{
		Vector2 ver = vertices[i];
		// 根据缩放重算顶点坐标
		ver = new Vector2(ver.x * transform.localScale.x, ver.y * transform.localScale.y);
		// 根据位置重算顶点坐标
		ver = new Vector2(ver.x + transform.position.x, ver.y + transform.position.y);
		vertices[i] = ver;
	}
	return vertices;
}
2. 线段的获取方式

通过两个顶点算出线段的直线方程存放到linesList<Line>中。
Line类中需要有以下几个属性、方法,为接下来运算做准备:
1. 起点坐标
2. 终点坐标
3. 计算直线方程参数 k b(两点确定直线方程,y = kx + b)
4. 获取两条线段的交点(求直线交点,再判断是否再线段上)
5. 根据直线将点集分区域(分三部分:在线上、线的上方、线的下方 )

二、 LineRenderer画线

画的线也属于直线,应记录起始点,在画线结束时候生成Line的实例。
实现画线的功能:

LineRenderer lr;
Vector2 startPos;
Vector2 endPos;
void DrawLine(){
	if (startPos == null || endPos == null)
		return;
	points = new Vector3[2]{startPos, endPos};		
	if (lr){
		lr.startWidth = lineWidth; 
		lr.endWidth = lineWidth;
		lr.useWorldSpace = false;
		lr.sortingLayerID = sortingLayer;
		lr.sortingOrder = orderInLayer;
		lr.positionCount = points.Length;
		lr.material = lineMaterial;
		lr.SetPositions (points);
	}
}

在Update中实时更新endPos值,并实时画线。注意坐标转换为:

Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10))

下一遍博客将讲解交点坐标的求解以及为创建新的mesh顶点坐标的预处理:
Unity Mesh实现图片切割(二)- 顶点计算

全文链接: Unity Mesh实现图片切割 - 概述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YuAnHandSome/article/details/103016024

智能推荐

35款 SpringBoot/SpringCloud 开源项目,用来接私活挣钱真爽!-程序员宅基地

文章浏览阅读327次。简介SpringBoot 是一个非常流行的 Java 框架,它可以帮助开发者快速构建应用程序。他不仅继承了 Spring 框架原有的优秀特性,而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程。最近,小编蹲点各大开源网站、社区等,终于被我找到了35款基于 SpringBoot/ SpringCloud 技术体系的一些开源框架。这些项目大都具备一些很完善的功能,并且均采用了当下..._java api商业管理系统

RF-Adaboost 基于随机森林的Adaboost的时间序列预测算法,集成学习/增强学习MATLAB程序...-程序员宅基地

文章浏览阅读26次。作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。????个人主页:Matlab科研工作室????个人信条:格物致知。???? 内容介绍在机器学习领域,时间序列预测一直是一个重要的研究方向。随着大数据时代的到来,时间序列数据的规模和复杂性不断增加,传统的预测方法面临着挑战。为了提高预测准确性和稳定...

go学习之 简单的web开发_go web网页交互-程序员宅基地

文章浏览阅读406次。Go语言基础之net/httpGo语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。相对于一些简单的请求,我们不用框架,直接使用net包就可以完成web的交互了啊哈哈哈哈哈,来试试看服务器端package mainimport ( "fmt" "io/ioutil" "net/http")// 使用net/http这个包来进行开发 server端func f1(w http.ResponseWriter, r *http.Request) {_go web网页交互

ssh代理-程序员宅基地

文章浏览阅读7.2k次,点赞3次,收藏9次。ssh功能还是很强大的,提供了三种代理功能-L参数,正向代理-R参数,反向代理-D参数,socks5代理说的通俗易懂点就是我有 hostA,hostB,hostC#mermaid-svg-o500HVE8uv90TAF7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-o500HVE8uv90TAF7 .error-icon{fill:#552222;}#me_ssh代理

zsh: command not found: brew 报错解诀办法-程序员宅基地

文章浏览阅读1.9w次,点赞31次,收藏34次。项目场景:在使用命令行安装东西的时候提示错误提示:zsh: command not found: brew解决方案:Mac安装 homebrew使用一下命令安装,/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"使用中科大的。..._zsh: command not found: brew

org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。...-程序员宅基地

文章浏览阅读495次。Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may exist in com/qianfeng/bean/PetsMapper.xml### C..._nested exception: org.xml.sax.saxparseexception; linenumber: 2; columnnumber

随便推点

关于STM32 PWM输出详解——想要分享的小白_void tim3_pwm_init(u16 arr,u16 psc){ gpio_inittype-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏22次。本次博客主要参考STM32战舰例程。脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制 。在本文中,小白将向大家介绍如何用通用定时器通道来输出PWM。定时器的工作过程如下图所示,在上一次博客“STM通用定时器详解”中,小白已经介绍了关于时基单元,并完成了对通用定时器的配置以及定时器中断的使用。如果没有对定时器知识小伙伴,可以先去看一下小白的上一次博客。**PWM工作过程**在PWM 输出中,输出信号由TIMx_ARR寄存器确定频率、由TIMx__void tim3_pwm_init(u16 arr,u16 psc){ gpio_inittypedef gpio_initstructure; t

一文看懂arm架构和x86架构有什么区别_arm架构和x86架构区别-程序员宅基地

文章浏览阅读10w+次,点赞97次,收藏669次。本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了arm架构和x86架构的区别,具体的跟随小编一起来了解一下.什么叫arm架构ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachin..._arm架构和x86架构区别

(课堂讨论)关于软件过程模型(部分摘自老师PPT及其他网站)_软件开发模型ppt-程序员宅基地

文章浏览阅读910次。软件开发过程模型主要有:51Testing软件测试网@$H5K2K2e0x/k8O 瀑布模型(V模型、喷泉模型 )51Testing软件测试网 tQ5e8r8E#E 螺旋模型51Testing软件测试网'E,g#YO!e^Z!R  原型模型(锯齿模型、快速原型)51Testing软件测试网(A'L0y*{8F`~�R"j"a  构件组装模型 (增量模型_软件开发模型ppt

css 弹性盒子space-between两端对齐,最后一列数量不够时,最后一列左对齐。_css space-between-程序员宅基地

文章浏览阅读8.4k次。代码:<!DOCTYPE html><html><head> <title>测试</title> <style> .container{ width: 200px; height:200px; border:2px solid red; } .box { display: flex; fle_css space-between

连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represe...-程序员宅基地

文章浏览阅读1.1k次。在使用spring boot操作数据库的时候,莫名其妙抛了一个错误:mysql6.0.6时间区域时差问题ava.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure ei..._sqlexception@3060

Leetcode189: Peeking Iterator_// **do not** save a copy of nums and manipulate i-程序员宅基地

文章浏览阅读206次。Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be _// **do not** save a copy of nums and manipulate it directly. // you shoul