Unity TrailRenderer 画出轮胎压痕

2023-11-06

需求:
在车拐弯的时候出现轮胎压痕。

压痕出现条件:
①.轮胎触碰到地板
②.轮胎角度有偏移
③.轮胎在转动


胎痕是断续的,所以每一段胎痕是单独的一个TrailRenderer
轮胎的转动跟角度可以通过wheelCollider来判断
轮胎触碰地板可以通过WheelCollider或者用射线的方式进行判断

压痕组件:

public class TireIndentation : MonoBehaviour
{
  Vehicles car;
  WheelCollider wheel;
  int index;
  public TrailRenderer render;
}  

通过射线检测轮胎是否着地

  bool IsDrawIndentation(out Vector3 indentationPos)
  {
    if (wheel == null)
    {
      indentationPos = Vector3.zero;
      return false;
    }
    Vector3 pos = wheel.transform.position;
    Ray ray = new Ray(pos, Vector3.down);
    RaycastHit hit;
    bool isHit = Physics.Raycast(ray, out hit, wheel.radius + 0.1f, GlobalValue.GroundLayer);
    if (isHit)
    {
      Debug.DrawLine(hit.point, pos);
      indentationPos = hit.point;
      //indentationPos
    }
    else indentationPos = Vector3.zero;
    return isHit;
  }

通过移动TrailRenderer来绘制压痕

  public void OnDrawIndentation()
  {
    Vector3 pos;
    bool isDraw = IsDrawIndentation(out pos);
    if (isDraw)
      render.transform.position = pos;
    else
    {
      OnBreakIndentation();
    }
  }

断开压痕

  public void OnBreakIndentation()
  {
    wheel = null;
    if(car != null) car.indentationComp[index] = null;
    this.transform.parent = null;
  }

外部调用:

//绘制
  virtual protected void ShowIndentationComp()
  {
    CreateIndentationComp();
    for(int i = 0;i < 2; i++)
    {
      indentationComp[i].OnDrawIndentation();
    }
  }

//创建一段新的压痕
  virtual protected void CreateIndentationComp()
  {
    for(int i = 0;i < 2; i++)
    {
      if (indentationComp[i]) continue;
      TireIndentation indentation = 
        TireIndentation.CreateIndentation(i, wheelColliders[i + 2], this);
      indentationComp[i] = indentation;
    }
  }

//是否绘制
  virtual protected bool IsShowIndentation()
  {
    if (!isPlayer) return false;

    Vector3 euler = this.transform.eulerAngles;
    if (euler.y > 180) euler.y -= 360;
    if (Mathf.Abs(euler.y) > GlobalValue.turnSideMaxAngle / 3)
      return true;
    else
      return false;
  }

//每帧执行
  public void Update()
  {
    if (IsShowIndentation())
      ShowIndentationComp();
    else
    {
      for(int i= 0; i < 2; i++)
      {
        if (indentationComp[i] == null) continue;
        else indentationComp[i].OnBreakIndentation();
      }
    }
  }

最终画出来的压痕
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity TrailRenderer 画出轮胎压痕 的相关文章

随机推荐

  • Redis——缓存击穿、穿透、雪崩

    Redis的缓存击穿 穿透 雪崩 这几个概念是设计大流量接口时所需要考虑的问题 也是面试常问的Redis相关的基础知识 本篇捋一下这几个概念 做一个小结 大家都知道 计算机的瓶颈之一就是IO 为了解决内存与磁盘速度不匹配的问题 产生了缓存
  • 操作系统作业 - 内存管理 - 请求分页分配方式模拟

    内存管理 请求分页分配方式 设计方案报告 文末有源码 文章目录 内存管理 请求分页分配方式 设计方案报告 1 项目需求 1 1 基本任务 1 2 功能描述 1 3 项目目的 2 开发环境 3 项目结构 4 操作说明 5 系统分析 5 1 置
  • 洛谷题单 算法1-7 搜索

    USACO08FEB Meteor Shower S 题目描述 Bessie hears that an extraordinary meteor shower is coming reports say that these meteor
  • 【千律】C++基础:宽窄字节字符串的相互转换与控制台输出

    方案1 include
  • 怎么调节手机的刷新率_二分钟科普:手机上的“高刷新率”

    上回粗略带过屏幕刷新率 这篇将会以更简单的叙述 介绍手机屏幕刷新率和插帧 本期关键词 屏幕刷新率 FPS 插帧 正文 不纠结这是谁带节奏 进步是必然的 屏幕刷新率 通常单位为Hz 是一个硬件固定数值 例如一部手机的屏幕刷新率为120Hz 那
  • Conditional DETR spatial attention & content attention可视化(二)

    就是将attention图通过加权叠加 叠加到原图上 要通过cv2 applyColorMap 将attention的单通道图转为三通道图 将attention中一些小的值置0 不然叠加之后会干扰原图 产生色差 至于蓝色 是通过cv2 ap
  • tcp retransmission 出现的原因_TCP 协议快被淘汰了,UDP 协议才是新世代的未来?

    公众号关注 运维之美 设为 星标 每天带你玩转 Linux TCP 协议可以说是今天互联网的基石 作为可靠的传输协议 在今天几乎所有的数据都会通过 TCP 协议传输 然而 TCP 在设计之初没有考虑到现今复杂的网络环境 当你在地铁上或者火车
  • 多线程:什么是同步与异步?二者的区别

    今天看到一道面试题 同步与异步有什么区别 同步 异步 这个在我们学习多线程的时候 会接触到这个概念 后面所学的一系列多线程知识运用也是以这两个点开展的 由于学习的时候囫囵吞枣 导致我对这两个概念没法准确说出定义及其区别 现在记录一下 如果光
  • 修改主机名(/etc/hostname和/etc/hosts区别)

    ubuntu永久修改主机名 1 查看主机名 在Ubuntu系统中 快速查看主机名有多种方法 其一 打开一个GNOME终端窗口 在命令提示符中可以看到主机名 主机名通常位于 符号后 其二 在终端窗口中输入命令 hostname或uname n
  • Visual Stdio 2017 Community 中文版哪里下载方便

    嫌官网不好用的话 推荐先下一个腾讯电脑管家 腾讯电脑管家自带了软件下载中心 可以去那里获取Visual Stdio 2017 Community 具体步骤如下 1 安装腾讯电脑管家 2 打开腾讯电脑管家 点击软件管理 如图 3 搜索Visu
  • 寻找环——指针法

    一 在一条链中找环 bool judge int a 存在返回ture 否则返回false int slow 0 fast 0 do slow a slow fast a a fast while slow fast a fast 1 if
  • 嵌入式数据库-SQLite3的基本指令及用C语言操作数据库

    SQLite简介 轻量化 易用的嵌入式数据库 用于设备端的数据管理 可以理解成单点的数据库 传统服务器型数据 库用于管理多端设备 更加复杂 SQLite是一个无服务器的数据库 是自包含的 这也称为嵌入式数据库 这意味着数据库引擎作为应用程序
  • DEMO:修改外向交货单BAPI_OUTB_DELIVERY_CHANGE_SAP刘梦_新浪博客

    简单demo 交货单数量 1 然后维护上序列号 有的公司没有启用序列号就不需要了 REPORT zdemo vl02n TABLES likp lips PARAMETERS p vbeln TYPE vbeln vl PARAMETER
  • 若依源码DataScopeAspect数据权限

    目录 源代码 使用场景 代码解析 源代码 从这里可以看出 表sys role dept 的用途 之前一起不清楚 role dept关联表的含义 自定义数据权限时 DATA SCOPE CUSTOM 通过角色 可以管理哪几个部门 来实现的 A
  • qt中的setStyleSheet的基本用法(按钮的几种状态)

    参考博客 https blog csdn net qq 42250189 article details 105199339 https blog csdn net weixin 38169769 article details 99894
  • 在打印ASCII值是26的字符的时候,输出的结果不认识

    现象 解决办法 32其实是一种转义字符 后面的32是8进制的 8进制的32代表的就是2 8 0 3 8 1 结果为十进制的26 在ASCII表里边0 31个字符 开头的32个字符 以及第127个字符 最后一个字符 都是不可见的 无法显示 但
  • 封装 x-spreadsheet 带样式导入导出

    接上两篇 vue 下使用 exceljs x spreadsheet 带样式导入Excel vue 下使用 exceljs x spreadsheet 带样式导出Excel 下面封装好一个组件
  • gan与dcgan训练自己的数据集

    gan https blog csdn net weixin 50113231 article details 122959899 dcgan 源码地址 https github com carpedm20 DCGAN tensorflow
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • Unity TrailRenderer 画出轮胎压痕

    需求 在车拐弯的时候出现轮胎压痕 压痕出现条件 轮胎触碰到地板 轮胎角度有偏移 轮胎在转动 胎痕是断续的 所以每一段胎痕是单独的一个TrailRenderer 轮胎的转动跟角度可以通过wheelCollider来判断 轮胎触碰地板可以通过W