用GL画出人物的移动路径

注意:用Debug画的线会存在穿透问题

没啥好解释的,直接看代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/*
 * 找不到设置线宽的方法,目前的解决方法就是用画矩形代替画线来实现线的粗细
 */

/// <summary>
/// 必须将此脚本放在摄影机上才能看到绘画内容,DebugDraw可以不用,但DebugDraw画的内容
/// 只能在编辑模式下看得到。
/// </summary>
[RequireComponent(typeof(Camera))]
public class DrawTrack: MonoBehaviour
{
    /// <summary>
    /// 画笔的材质
    /// </summary>
    public Material Material;

    /// <summary>
    /// 绘画该目标的移动路径
    /// </summary>
    public Transform Target;

    /// <summary>
    /// 画笔平滑度
    /// </summary>
    public float Smooth = 1;

    /// <summary>
    /// 是否也在编辑器里绘画出线
    /// </summary>
    public bool DebugDraw = true;

    /// <summary>
    /// 存放移动路径的点的集合
    /// </summary>
    private List<Vector3> path;

    /// <summary>
    /// 目标的最后一个移动点
    /// </summary>
    private Vector3 lastPosition;

    void Start()
    {
        if (Material == null)
        {
            Debug.LogError("请先赋予该脚本 Material !!");
        }

        if (Target == null)
        {
            Debug.LogError("请设置目标");
        }

        path = new List<Vector3>();
        lastPosition = Target.position;
    }

    void Update()
    {
        if (Vector3.Distance(Target.position, lastPosition) > Smooth)
        {
            path.Add(Target.position);
            lastPosition = Target.position;
        }
    }

    /// <summary>
    /// GL绘图必须在这个函数中进行
    /// </summary>
    void OnPostRender()
    {
        GL.PushMatrix();
        Material.SetPass(0);
        // 若要绘制2D线段,则取消注释GL.LoadOrtho();
        //GL.LoadOrtho();
        GL.Begin(GL.LINES);

        /*******在此处进行绘画*********/
        DrawLines(path.ToArray());

        GL.End();
        GL.PopMatrix();
    }

    private void DrawLine(Vector3 start, Vector3 end)
    {
        GL.Vertex3(start.x, start.y, start.z);
        GL.Vertex3(end.x, end.y, end.z);
        if (DebugDraw)
        {
            Debug.DrawLine(start, end, Color.red, 1);
        }
    }

    private void DrawLines(Vector3[] points)
    {
        if (points.Length == 0)
        {
            return;
        }

        for (int i = 0; i < points.Length - 1; ++i)
        {
            var start = points[i];
            var end = points[i + 1];
            GL.Vertex3(start.x, start.y, start.z);
            GL.Vertex3(end.x, end.y, end.z);
            if (DebugDraw)
            {
                Debug.DrawLine(start, end, Color.red, 1);
            }
        }
    }

    public void ClearLine()
    {
        path.Clear();
    }

}
时间: 2024-10-19 23:05:41

用GL画出人物的移动路径的相关文章

[转]html5 Canvas画图教程(9)—canvas中画出矩形和圆形

本文讲一下在canvas中画出矩形和圆形的办法,他们属于基础图形.当然,基础图形本来不止他们,但在canvas中,只有画矩形与圆形不需要用其他方法模拟. canvas画矩形 1,fillRect与strokeRect fillRect可以直接填充出一个矩形,填充样式是你当前设置的样式:同理strokeRect就是直接描边一个矩形 他们的参数是一致的,依次是(起点x坐标,起点y,矩形的宽,矩形的高).这里的起点,注意,是指矩形的左上角那个点. 我们通常用他们来做简单的事,他们也只能做简单的事.为什

教你分分钟画出越南全境的主干路由拓扑

标题党了一次,用一个高大上的的题目先吸引各位看官点进来. 其实原理很简单,我们要做的工作只是做一些数据处理并最终生成kml脚本呈现在Google Earth上. 进入正题: 首先数据来源http://www.caida.org .这是一个英特网数据分析的合作组织,数据比较权威,全球很多网络方面的科研数据都来源于此. 而对本文有用的信息在这里:http://www.caida.org/data/internet-topology-data-kit/  这里面是一些英特网的拓扑信息数据,而且每半年左

H5坦克大战之画出坦克

今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双,其实小托马斯的表现也不遑多让,拿下31分9个助攻,末节一开始便带队打出一波小高潮反超比分,无奈威少爷最后几分钟暴走直接带走比赛,让人直呼精彩.好了,扯完之后我们进入正题. 今天给大家带来的是一个比较好玩的东西--H5坦克大战.这个东西的实现主要用到了H5的canvas以及原生的js,如果你已经是大牛

SVG技术入门:如何画出一条会动的线

我喜欢用图画.图表来演示流程信息或浏览器的操作过程,但大量的图片有时候也会很不方便.在我的一个关于应用缓存和缓存方法的演讲中,我让屏幕首先空白,然后各种图表按照我的演讲内容自己一点一点的画出来.下面就是我如何用SVG技术在浏览器里实现这种效果的. SVG里的路径(path) SVG里用来定义路径的格式堪比正则表达式的怪异: <path fill="none" stroke="deeppink" stroke-width="14" strok

unity3d GL画线/物体跟随/坐标系转换

看见标题的人是不是在想... 一个小小的GL画线难吗? 一个小小的物体跟随难吗? 嗯,的确,一点不难.... 我一开始也是像你们那样想的,但是实际操作起来,还是和理论有区别的 写这个demo起因是这样的: 面试到了一家虚拟现实的公司,因为没有去公司 网上直接谈的,谈妥了hr估计是想看看我能不能胜任 给了我一张效果图,让我去实现画线的功能 咳咳,要求还是比较细致的,这里我们后面说 废话不多说,老规矩,先上效果图,然后直接进入主题 第一张是hr给我的图,第二张是我自己实现的 需求如下: 1.模型是旋

Python3 Tkinter基础 Canvas bind 绑定左键 鼠标左键点击时,在当前位置画出一个椭圆形

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: from tkinter import * root=Tk() w=Canvas(root,width=200,height=200,background='white') w.pack() def paint(event): #event.x 鼠标左键的横坐标

在资源里面画出你的界面

在资源里面画出你的界面.在添加类.然后在视图里定义这个类的指针,DIALOG的指针,还有就是区域对象, 如下Cwindows *tw;  CRect m_cle;CDialogEx *ph;在CPP文件构造函数里初始化ZeroMemory(&m_cle,sizeof(m_cle));tw = new Cwindows(this);:在重写OnCreate(LPCREATESTRUCT lpCreateStruct)函数在里面加上 { if (CView::OnCreate(lpCreateStr

全面总结:MATLAB如何画出漂亮的图

在绘图命令中应该如何确定横坐标和纵坐标的标度尺寸(自己定范围) 如何在一个坐标中绘制多条曲线,并用不同的颜色区别. 希望得到答案,谢谢!!!!!!!!!!! help plot help axis axis ('xlabel','ylabel') a1=plot(); hlod on a2=plot(); legend([a1 a2],'图1名',‘图2名') hold off 还可以更多 x1=-pi:pi/12:pi; x2=-pi:pi/12:pi; y1=sin(x1); y2=cos(

python—networkx:在一张图中画出多个子图

通过plt.subplot能够在一张图中画出多个子图 #coding: utf-8 #!/usr/bin/env python """ Draw a graph with matplotlib. You must have matplotlib for this to work. """ __author__ = """Aric Hagberg ([email protected])"""