Unity 使用LineRenderer绘制贝塞尔曲线_unity linerenderer 贝塞尔曲线-程序员宅基地

技术标签: LineRenderer  Unity  

Unity 使用LineRenderer绘制贝塞尔曲线

LineRenderer介绍

LineRenderer线渲染器,在三维空间中渲染线段和曲线段。

贝塞尔曲线介绍

通过很少的控制点,生成复杂的平滑曲线。

一阶贝塞尔曲线
一阶贝塞尔曲线:B(t) = (1 - t) * p0 + t*p1,t ∈[0, 1];

二阶贝塞尔曲线
二阶贝塞尔曲线:B(t) = (1 - t)^2P0 + 2t(1 - t)p1 + t^2p2,t∈ [0, 1];

三阶贝塞尔曲线
三阶贝塞尔曲线:B(t) = P0(1 - t)^3 + 3P1t(1 - t)^2 + 3P2t^2(1 - t) + p3t^3,t∈[0, 1];

四阶贝塞尔曲线

创建LineRenderer渲染线

如图在场景中创建一个Line

在这里插入图片描述
然后挂上自己写的脚本TestLine.cs
在这里插入图片描述

创建TestLine.cs脚本

随着时间的增长,逐渐计算生成贝塞尔曲线上的点,然后绘制出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestLine : MonoBehaviour
{
    
	private LineRenderer lineRenderer;
	private Vector3 p0;
	private Vector3 p1;
	private Vector3 p2;
	private Vector3 result;
	private List<Vector3> resultList = new List<Vector3> ();
	private float time = 0;
	private float timeLerp;
	private float maxTime = 1f;
	void Start() {
    
		lineRenderer = gameObject.GetComponent<LineRenderer> ();
		lineRenderer.startColor = new Color(1f, 1f, 0f, 0.5f);
		lineRenderer.endColor = new Color (0f, 1f, 1f, 0.5f);
		lineRenderer.startWidth = 0.02f;
		lineRenderer.endWidth = 0.02f;
		
		p0 = new Vector3 (-5, 0, 0);
		p1 = new Vector3 (0, 5, 0);
		p2 = new Vector3 (5, 0, 0);
	}
	void FixedUpdate(){
    
		if (time > maxTime) {
    
            		return;
        	}

		CalculatePosition();

		lineRenderer.positionCount = resultList.ToArray ().Length;
		if (lineRenderer.positionCount >= 2) {
    
			lineRenderer.SetPoitions (resultList.ToArray ());
		}
	}
	void CalculatePosition(){
    
		result = new Vector3 ();
		timeLerp = Mathf.Lerp (0, 1, time / maxTime);
		result.x = Mathf.Pow (1 - timeLerp, 2) * p0.x + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.x + Mathf.Pow (timeLerp, 2) * p2.x;
        	result.y = Mathf.Pow (1 - timeLerp, 2) * p0.y + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.y + Mathf.Pow (timeLerp, 2) * p2.y;
        	result.z = Mathf.Pow (1 - timeLerp, 2) * p0.z + 2 * timeLerp * Mathf.Pow (1 - timeLerp, 1) * p1.z + Mathf.Pow (timeLerp, 2) * p2.z;
        	resultList.Add(result);
        	time = time + Time.deltaTime;
	}
}

效果如下:

在这里插入图片描述

使用LineRenderer注意事项

LineRenderer可以设置Color时,可以设置startColor和endColor。
在新建LineRenderer组件的时候,我们可以看到它带有默认的材质球Default-Line,使用这个材质球我们可以轻松的设置开始的颜色和末尾的颜色。

在这里插入图片描述
如果使用自己创建的标准材质球,在设置startColor和endColor的时候就不会生效。
原因在于两个材质球所使用的Shader不一样,
在这里插入图片描述
Default-Line使用的默认Shader是:Legacy Shaders/Particles/Alpha Blended Premultiply
我们使用这个Shader就可以轻松设置startColor和endColor

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

智能推荐

Python模块学习:subprocess模块详解-程序员宅基地

文章浏览阅读974次。args: 要执行的shell命令,默认应该是一个字符串序列,如[‘df’, ‘-Th’]或(‘df’, ‘-Th’),也可以是一个字符串,如’df -Th’,但是此时需要把shell参数的值置为True。shell: 如果shell为True,那么指定的命令将通过shell执行。如果我们需要访问某些shell的特性,如管道、文件名通配符、环境变量扩展功能,这将是非常有用的。_subprocess模块

Springboot + vue 后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案_vue 前端接受long类型数据,不对-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏7次。1前端解决方案:https://juejin.im/post/5c51526fe51d455047338a2a这位大神的方法 获取到jsonlint.js然后导入本地vue项目本地使用import jsonlint from "@/utils/jsonlint.js"// 创建axios实例const service = axios.create({ 在这里重写方法 transformResponse: [function (data) { // Do whatever._vue 前端接受long类型数据,不对

Matlab 读写*.xml文件_如何用matlab将图像写入xml格式-程序员宅基地

文章浏览阅读2.7k次。Matlab 读写*.xml文件1.摘要 因为经常使用将图像中的目标标注信息保存在*.xml文件中。在训练深度神经网络是常用这样的训练数据。有时候需要使用原有的数据来扩充数据,而最常用的工具也就是Matlab(这里示例使用的Matlab2016b)。在这篇博文中主要介绍:①Matlab读取*.xml文件信息;②将*.xml文件中的信息显示在对应的图像上,可以简单可视化数据;③将在图像中..._如何用matlab将图像写入xml格式

uniapp中nvue在页面渲染前给数据赋值_uniapp data中的数据可以之前互相赋值吗-程序员宅基地

文章浏览阅读1.8k次。应用场景是,在一个页面初始化的时候要给一个data内数据赋值,这个数据绑定到了页面v-for上,nvue中的所有生命周期都不能实现在渲染前给数据赋值,会报错,解决办法是定义一个常量去设置值,然后在data内把常量赋值给目标数据。..._uniapp data中的数据可以之前互相赋值吗

ROS环境下串口通信_ifr_interface::msg::serialgimbal toros(){ ifr_inte-程序员宅基地

文章浏览阅读1.3w次,点赞5次,收藏67次。1. 环境:操作系统: Ubuntu 14.04ROS版本: ROS Indigo2. 步骤:2.1 下载安装ROS对应版本的工具包(此处为indigo版)输入以下命令安装:sudo apt-get-install ros-indigo-serial重启终端,输入以下命令可以检测到serial包的路径说明已经安装好:(路径为 opt/ros/in..._ifr_interface::msg::serialgimbal toros(){ ifr_interface::msg::serialgimbal m

小样本学习记录————文本中特征空间的数据增强MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification_data augmentation for meta-learning-程序员宅基地

文章浏览阅读2.6k次,点赞2次,收藏6次。MEDA: Meta-Learning with Data Augmentation for Few-Shot Text Classification出发点数据增强球合成器合成模块Synthesis module转换模块Transformation module损失函数球生成器部分损失函数元学习损失训练策略实验数据集结语出发点对于小样本学习文本分类问题中,限制其性能的主要原因之一是因为对于每一个类别有多种的表示方式。所以本文提出了一种数据增强方式来解决样本不足的问题。数据增强原文的数据增强:随机替_data augmentation for meta-learning

随便推点

【Python爬虫教程】基础篇-16 Ajax数据爬取基本原理_ajax抓包-程序员宅基地

文章浏览阅读4.3k次,点赞29次,收藏41次。摘要:什么是Ajax,Ajax基本原理_ajax抓包

spring综合性利用工具-SpringBoot-Scan(一)_springboot漏洞检测工具-程序员宅基地

文章浏览阅读1.8k次。针对SpringBoot的开源渗透框架,以及Spring相关高危漏洞利用工具。_springboot漏洞检测工具

Java拆装箱及128陷阱-程序员宅基地

文章浏览阅读214次。而在Integer的valueOf()方当中,如果数值在-128-127之间,就都存储在一个数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间进行装箱,所以用==比较是不相等的。由于Java中存在自动拆装箱,故Integer包装类型和int基本类型是等价的,所以a == c 以及 c == d 也为True。c == d 一定为True。

【C语言】编译时常见报错#经验分享与解决方法_编译问题的解决思路-程序员宅基地

文章浏览阅读1.2k次,点赞13次,收藏8次。VS编译时常见报错#经验分享与解决方法#断点_编译问题的解决思路

Android-studio与Android常见的Error问题与坑总结_failed to find platform sdk with path: platforms;a-程序员宅基地

文章浏览阅读3.2w次,点赞8次,收藏37次。Android-studio的Error总结1 Error plugin 在某些情况下,比如你的android-studio没有关闭,然后你强制关机,当再次打开android-studio时,会出现这个问题Plugin &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;Google Analytics Uploader&amp_failed to find platform sdk with path: platforms;android-32

ad敷铜后还有部分飞线_告别飞线,南京广推共享充电桩实现居民“充电自由”...-程序员宅基地

文章浏览阅读275次。现代快报讯 近日,全国文明城市创建工作正在如火如荼地进行,“剪飞线、改车棚、添电桩”成为了老旧小区的工作重点。还有“飞线”怎么办?充电桩够不够?装了之后安不安全?8月11日,现代快报记者在南京市的这几个社区得到了回答。南京这些小区已安装上了共享充电桩11日,现代快报记者探访了玄武区下辖的几个小区。在玄武门街道公教一村小区,每隔几栋楼就有一个充电棚,几乎每个充电插口都有电动车在充电。玄武门街道公教一..._ad18 铺铜 地的飞线还在

推荐文章

热门文章

相关标签