开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1773

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1946|回复: 15

[伊利丹·怒风] Unity3D 绘制矩形(DrawRect)及可视化调试

[复制链接]  [移动端链接]
排名
1723
昨日变化
7

49

主题

281

帖子

1922

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
16
蛮牛币
2966
威望
0
注册时间
2014-7-21
在线时间
624 小时
最后登录
2017-7-26

专栏作家

发表于 2016-12-21 08:53:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 wind2006 于 2016-12-21 08:53 编辑

背景

由于要做Native2D的A* 算法寻路,所以必须进行Scene的网格划分,而进行了网格划分需要进行可视化的调试,需求就是这个逻辑。具体是实现如下效果,这里绿色的区域就是角色不能进入的区域(或者是走不进去的地方,大家玩网游都遇到过吧)

3

按照这个思路基本是两个问题,1、Unity如何实现可视化调试;2、Unity如何绘制网格

实现

1、Unity如何实现可视化调试

本文的实现完全围绕需求来走,就是需要在2D环境中实现可配置网格显示。先按照背景中的思路学习轮子,百度下基本下篇大牛的总结比较好,比较全

【风宇冲】图形化调试 http://blog.sina.com.cn/s/blog_471132920101gxzf.html

这里可耻的转载一下

Unity中图形化调试主要4种
Debug.Draw
Gizmos.Draw
Graphic.DrawMesh
GL
只需在Scene窗口显示的调试图像
     一直显示的 OnDrawGizmos + Gizmos.Draw
     选中显示的 OnDrawGizmosSelected + Gizmos.Draw
     脚本控制的 Update + Debug.Draw
需要在实际设备屏幕显示的调试图像
    Update+Graphic.DrawMesh
    OnRenderObject+GL
 
Graphic.DrawMesh和Debug.Draw   调用一致,都是在Update系里
Graphic.DrawMesh和GL       显示类似,都在各个窗口显示,并且可以设置材质。

 

这里根据我自己的要求,只要能在Editor模式下的Scene和Game中显示就可以了。

2、Unity如何绘制网格

在1中 大牛已经给出了方向和简单的列子,下面就是自己实现了,刚开始比较懒,还是想一步到位,直接找到一个类似DrawRect的函数直接在中绘制矩形,结果果然失败,找了很久也没有这样的函数和或者别人分享的。下面分享下自己搜集的方案

A、使用Mesh网格进行绘制

Mesh

说实话我觉得这种方法对于我的需求是没什么实际作用的,而且看起来有些虚,最主要的问题是网格不可控制。

[C#] 纯文本查看 复制代码
public class Grid : MonoBehaviour
{
    [ SerializeField ] private Transform _transform;
    [ SerializeField ] private Material _material;
    [ SerializeField ] private Vector2 _gridSize;
    [ SerializeField ] private int _rows;
    [ SerializeField ] private int _columns;
    void Start()
    {
        UpdateGrid();
    }
    public void UpdateGrid()
    {
        _transform.localScale = new Vector3( _gridSize.x, _gridSize.y, 1.0f );
        _material.SetTextureScale( \"_MainTex\", new Vector2( _columns, _rows ) );
    }
}

B、第二个方法就是使用GL

GL

这种方法其实还是比较底层的,竟然还用到了传说中的Shader,用于拔高也是不错的列子,而且看起来也不虚,但最主要的问题是网格不可控制。再说我也觉得用GL有点杀鸡用牛刀的感觉。

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
//http://answers.unity3d.com/questions/482128/draw-grid-lines-in-game-view.html?page=2&pageSize=5&sort=votes


public class ShowGrid : MonoBehaviour {

    public bool showMain = true;
    public bool showSub = false;

    public float gridSizeX;
    public float gridSizeY;

    public float smallStep;
    public float largeStep;

    public float startX;
    public float startY;

    public float offsetY;
    public float offsetX;

    private Material lineMaterial;

    private Color mainColor = new Color(0f, 1f, 0f, 1f);
    private Color subColor = new Color(0f, 0.5f, 0f, 1f);

    void Start()
    {

        gridSizeX *= smallStep;
        gridSizeY *= smallStep;
    }

    void Update()
    {
    }

    void CreateLineMaterial()
    {

        if (!lineMaterial)
        {
            lineMaterial = new Material(\"Shader \\"Lines/Colored Blended\\" {\" +
                \"SubShader { Pass { \" +
                \"    Blend SrcAlpha OneMinusSrcAlpha \" +
                \"    ZWrite Off Cull Off Fog { Mode Off } \" +
                \"    BindChannels {\" +
                \"      Bind \\"vertex\\", vertex Bind \\"color\\", color }\" +
                \"} } }\");
            lineMaterial.hideFlags = HideFlags.HideAndDontSave;
            lineMaterial.shader.hideFlags = HideFlags.HideAndDontSave;
        }
    }

    void OnRenderObject()
    {
        CreateLineMaterial();
        // set the current material
        lineMaterial.SetPass(0);
        GL.Begin(GL.LINES);

        if (showSub)
        {
            GL.Color(subColor);

            //Layers
            for (float j = 0; j <= gridSizeY; j += smallStep)
            {
                //X axis lines
                GL.Vertex3(startX + offsetX, j + offsetY, 0);
                GL.Vertex3(gridSizeX + offsetX, j + offsetY, 0);
            }

            //Y axis lines
            for (float k = 0; k <= gridSizeX; k += smallStep)
            {
                GL.Vertex3(startX + k + offsetX, startY + offsetY, 0);
                GL.Vertex3(startX + k + offsetX, gridSizeY + offsetY, 0);
            }

        }

        if (showMain)
        {
            GL.Color(mainColor);

            //Layers
            for (float j = 0; j <= gridSizeY; j += largeStep)
            {
                //X axis lines
                GL.Vertex3(startX + offsetX, j + offsetY, 0);
                GL.Vertex3(gridSizeX + offsetX, j + offsetY, 0);
            }

            //Y axis lines
            for (float k = 0; k <= gridSizeX; k += largeStep)
            {
                GL.Vertex3(startX + k + offsetX, startY + offsetY, 0);
                GL.Vertex3(startX + k + offsetX, gridSizeY + offsetY, 0);
            }
        }
        GL.End();
    }
}

C、第三个方法Gizmos.Draw

这也是我最终使用的方法,实现效果如下所示,其实Gizmos的功能很强大,可以绘制Mesh和Cude,在3D调试中用处不能小视。

drawGrid

这里主要遇到的问题是Gizmos没有提供DrawRect函数需要自己实现,这里其实本身没有什么技术难度,因为已经提供了DrawLine函数。自己比较懒,本来想看是否有现成的直接剽窃下,后来Seach未果,只能自己实现了,下面是实现函数,同时提供DrawPath和DrawLine函数这里是从itween里提取出来的

[C#] 纯文本查看 复制代码
/// 
   /// When called from an OnDrawGizmos() function it will draw a curved path through the provided array of Vector3s.
   /// 
   /// 
   /// A 
   /// 
   /// 
   /// A 
   ///  
   public static void DrawPath(Vector3[] path, Color color)
   {
       if (path.Length > 0)
       {
           DrawPathHelper(path, color, \"gizmos\");
       }
   }

   /// 
   /// When called from an OnDrawGizmos() function it will draw a line through the provided array of Vector3s.
   /// 
   /// 
   /// A 
   /// 
   /// 
   /// A 
   ///  
   public static void DrawLine(Vector3[] line, Color color)
   {
       if (line!=null && line.Length > 0)
       {
           DrawLineHelper(line, color, \"gizmos\");
       }
   }

   public static void DrawRect( Rect rect, Color color)
   {
       Vector3[] line =new Vector3[5];
       line[0] = new Vector3(rect.x,rect.y,0);
       line[1] = new Vector3(rect.x+rect.width, rect.y, 0);
       line[2] = new Vector3(rect.x + rect.width, rect.y + rect.height, 0);
       line[3] = new Vector3(rect.x, rect.y + rect.height, 0);
       line[4] = new Vector3(rect.x, rect.y, 0);
       if (line != null && line.Length > 0)
       {
           DrawLineHelper(line, color, \"gizmos\");
       }
   }   

   private static void DrawLineHelper(Vector3[] line, Color color, string method)
   {
       Gizmos.color = color;
       for (int i = 0; i < line.Length - 1; i++)
       {
           if (method == \"gizmos\")
           {
               Gizmos.DrawLine(line[i], line[i + 1]); ;
           }
           else if (method == \"handles\")
           {
               Debug.LogError(\"iTween Error: Drawing a line with Handles is temporarily disabled because of compatability issues with Unity 2.6!\");
               //UnityEditor.Handles.DrawLine(line[i], line[i+1]);
           }
       }
   }

   private static void DrawPathHelper(Vector3[] path, Color color, string method)
   {
       Vector3[] vector3s = PathControlPointGenerator(path);

       //Line Draw:
       Vector3 prevPt = Interp(vector3s, 0);
       Gizmos.color = color;
       int SmoothAmount = path.Length * 20;
       for (int i = 1; i <= SmoothAmount; i++)
       {
           float pm = (float)i / SmoothAmount;
           Vector3 currPt = Interp(vector3s, pm);
           if (method == \"gizmos\")
           {
               Gizmos.DrawLine(currPt, prevPt);
           }
           else if (method == \"handles\")
           {
               Debug.LogError(\"iTween Error: Drawing a path with Handles is temporarily disabled because of compatability issues with Unity 2.6!\");
               //UnityEditor.Handles.DrawLine(currPt, prevPt);
           }
           prevPt = currPt;
       }
   }
   /// 
   /// 三点计算抛物线.
   /// 
   /// 组成抛物线的点.
   /// 确定抛物线的三个点或者更多的点的数组.
   public static List DrawPathHelper(Vector3[] path)
   {
       List array = new List(177);
       Vector3[] vector3s = PathControlPointGenerator(path);
       //Line Draw:
       Vector3 prevPt = Interp(vector3s, 0);
       int SmoothAmount = path.Length * 20;
       for (int i = 1; i <= SmoothAmount; i++)
       {
           float pm = (float)i / SmoothAmount;
           Vector3 currPt = Interp(vector3s, pm);
           array.Add(currPt);
           prevPt = currPt;
       }
       return array;
   }
   private static Vector3[] PathControlPointGenerator(Vector3[] path)
   {
       Vector3[] suppliedPath;
       Vector3[] vector3s;
       //create and store path points:
       suppliedPath = path;
       //populate calculate path;
       int offset = 2;
       vector3s = new Vector3[suppliedPath.Length + offset];
       System.Array.Copy(suppliedPath, 0, vector3s, 1, suppliedPath.Length);
       //populate start and end control points:
       //vector3s[0] = vector3s[1] - vector3s[2];
       vector3s[0] = vector3s[1] + (vector3s[1] - vector3s[2]);
       vector3s[vector3s.Length - 1] = vector3s[vector3s.Length - 2] + (vector3s[vector3s.Length - 2] - vector3s[vector3s.Length - 3]);
       //is this a closed, continuous loop? yes? well then so let's make a continuous Catmull-Rom spline!
       if (vector3s[1] == vector3s[vector3s.Length - 2])
       {
           Vector3[] tmpLoopSpline = new Vector3[vector3s.Length];
           System.Array.Copy(vector3s, tmpLoopSpline, vector3s.Length);
           tmpLoopSpline[0] = tmpLoopSpline[tmpLoopSpline.Length - 3];
           tmpLoopSpline[tmpLoopSpline.Length - 1] = tmpLoopSpline[2];
           vector3s = new Vector3[tmpLoopSpline.Length];
           System.Array.Copy(tmpLoopSpline, vector3s, tmpLoopSpline.Length);
       }
       return (vector3s);
   }
   //andeeee from the Unity forum's steller Catmull-Rom class ( http://forum.unity3d.com/viewtopic.php?p=218400#218400 ):
   private static Vector3 Interp(Vector3[] pts, float t)
   {
       int numSections = pts.Length - 3;
       int currPt = Mathf.Min(Mathf.FloorToInt(t * (float)numSections), numSections - 1);
       float u = t * (float)numSections - (float)currPt;
       Vector3 a = pts[currPt];
       Vector3 b = pts[currPt + 1];
       Vector3 c = pts[currPt + 2];
       Vector3 d = pts[currPt + 3];
       return .5f * (
           (-a + 3f * b - 3f * c + d) * (u * u * u)
           + (2f * a - 5f * b + 4f * c - d) * (u * u)
           + (-a + c) * u
           + 2f * b
           );
   }

总结

程序员都懒总想找现成的,这次我提供个现成的给你哦。如果真对你有用别忘记给我投一票。

2016年度游戏蛮牛最受欢迎专栏作家评选,为他们投票! 别忘记我是恶魔猎手哦(wind2006)

3.jpg

回复

使用道具 举报

4四处流浪
419/500
排名
6625
昨日变化
4

0

主题

74

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-26
发表于 2016-12-21 09:55:01 | 显示全部楼层
主楼您好,能不能提供个工程文件看看效果,代码我不知道怎么用,谢谢

回复 支持 反对

使用道具 举报

5熟悉之中
663/1000
排名
2889
昨日变化
2

2

主题

100

帖子

663

积分

Rank: 5Rank: 5

UID
45645
好友
2
蛮牛币
2259
威望
0
注册时间
2014-9-19
在线时间
191 小时
最后登录
2017-7-25
发表于 2016-12-21 09:59:04 | 显示全部楼层
貌似很厉害,很厉害。真的很棒!

回复 支持 反对

使用道具 举报

排名
1723
昨日变化
7

49

主题

281

帖子

1922

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
16
蛮牛币
2966
威望
0
注册时间
2014-7-21
在线时间
624 小时
最后登录
2017-7-26

专栏作家

 楼主| 发表于 2016-12-21 10:05:47 | 显示全部楼层
1115803755 发表于 2016-12-21 09:55
主楼您好,能不能提供个工程文件看看效果,代码我不知道怎么用,谢谢

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class DrawRectTest : MonoBehaviour {

    private float GridSize = 0.2f; //单位格子大小
    List<Rect> lst = new List<Rect>();

    void Awake() {
 
        //构建障碍物
        for (int y = 13; y <= 28; y++)
        {
            for (int x = 0; x <= 7; x++)
            {
                //障碍物在矩阵中用0表示

                //Matrix[x, y] = 0;

                Rect rect = new Rect();
                rect.width = GridSize;
                rect.height = GridSize;
                rect.x = x*GridSize;
                rect.y = 6- y* GridSize;

                lst.Add(rect);
            }

        }

        int move = 0;

        for (int x = 8; x <= 15; x++)
        {
            for (int y = 13; y <= 19; y++)
            {
                Rect rect = new Rect();
                rect.width = GridSize;
                rect.height = GridSize;
                rect.x = x * GridSize;
                rect.y = 6-(y - move) * GridSize;

                lst.Add(rect);
            }

            move = x % 2 == 0 ? move + 1 : move;
        }

        int start_y = 4;

        int end_y = 10;

        for (int x = 16; x <= 23; x++)
        {
            for (int y = start_y+1; y <= end_y+1; y++)
            {
                Rect rect = new Rect();
                rect.width = GridSize;
                rect.height = GridSize;
                rect.x = x * GridSize;
                rect.y = 6-(y + move) * GridSize;

                lst.Add(rect);
            }
            start_y = x % 3 == 0 ? start_y + 1 : start_y;
            end_y = x % 3 == 0 ? end_y - 1 : end_y;
        }
    }
    void OnDrawGizmos()
    {
        lst.ForEach((r) =>
        {
            otherTest.DrawRect(r, Color.yellow);
        });
    
    }

}


用法很简单 (这么用otherTest.DrawRect(r, Color.yellow);),就是刚开始需要 初始化那些格子,正常那个是 游戏的 地图编辑器干的事情。所以我没有贴出来
http://www.cnblogs.com/alamiye010/archive/2009/09/25/1574284.html 这个你可以参考。
不知道我说明白了吗

回复 支持 反对

使用道具 举报

4四处流浪
419/500
排名
6625
昨日变化
4

0

主题

74

帖子

419

积分

Rank: 4

UID
115241
好友
2
蛮牛币
136
威望
0
注册时间
2015-7-26
在线时间
208 小时
最后登录
2017-7-26
发表于 2016-12-21 10:40:01 | 显示全部楼层
wind2006 发表于 2016-12-21 10:05
[mw_shl_code=csharp,true]using UnityEngine;
using System.Collections;
using System.Collections.Gen ...

明白了,谢谢

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1141/1500
排名
2233
昨日变化
3

3

主题

310

帖子

1141

积分

Rank: 6Rank: 6Rank: 6

UID
25330
好友
0
蛮牛币
1766
威望
0
注册时间
2014-5-16
在线时间
353 小时
最后登录
2017-2-27
发表于 2016-12-21 10:41:28 | 显示全部楼层
顶!d=====( ̄▽ ̄*)b

回复 支持 反对

使用道具 举报

7日久生情
1871/5000
排名
361
昨日变化

0

主题

70

帖子

1871

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
57557
好友
1
蛮牛币
4720
威望
0
注册时间
2014-11-25
在线时间
476 小时
最后登录
2017-5-18
QQ
发表于 2016-12-21 12:03:57 | 显示全部楼层
楼主,能否提供一份源码,感激不尽

回复 支持 反对

使用道具 举报

排名
1723
昨日变化
7

49

主题

281

帖子

1922

积分

Rank: 9Rank: 9Rank: 9

UID
35466
好友
16
蛮牛币
2966
威望
0
注册时间
2014-7-21
在线时间
624 小时
最后登录
2017-7-26

专栏作家

 楼主| 发表于 2016-12-21 13:18:33 | 显示全部楼层
扯蛋超神 发表于 2016-12-21 12:03
楼主,能否提供一份源码,感激不尽

[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

//iTween里抄来的
public class otherTest : MonoBehaviour
{
    /// <summary>
    /// When called from an OnDrawGizmos() function it will draw a curved path through the provided array of Vector3s.
    /// </summary>
    /// <param name="path">
    /// A <see cref="Vector3s[]"/>
    /// </param>
    /// <param name="color">
    /// A <see cref="Color"/>
    /// </param> 
    public static void DrawPath(Vector3[] path, Color color)
    {
        if (path.Length > 0)
        {
            DrawPathHelper(path, color, "gizmos");
        }
    }

    /// <summary>
    /// When called from an OnDrawGizmos() function it will draw a line through the provided array of Vector3s.
    /// </summary>
    /// <param name="line">
    /// A <see cref="Vector3s[]"/>
    /// </param>
    /// <param name="color">
    /// A <see cref="Color"/>
    /// </param> 
    public static void DrawLine(Vector3[] line, Color color)
    {
        if (line!=null && line.Length > 0)
        {
            DrawLineHelper(line, color, "gizmos");
        }
    }

    public static void DrawRect( Rect rect, Color color)
    {
        Vector3[] line =new Vector3[5];
        line[0] = new Vector3(rect.x,rect.y,0);
        line[1] = new Vector3(rect.x+rect.width, rect.y, 0);
        line[2] = new Vector3(rect.x + rect.width, rect.y + rect.height, 0);
        line[3] = new Vector3(rect.x, rect.y + rect.height, 0);
        line[4] = new Vector3(rect.x, rect.y, 0);
        if (line != null && line.Length > 0)
        {
            DrawLineHelper(line, color, "gizmos");
        }
    }	

    private static void DrawLineHelper(Vector3[] line, Color color, string method)
    {
        Gizmos.color = color;
        for (int i = 0; i < line.Length - 1; i++)
        {
            if (method == "gizmos")
            {
                Gizmos.DrawLine(line[i], line[i + 1]); ;
            }
            else if (method == "handles")
            {
                Debug.LogError("iTween Error: Drawing a line with Handles is temporarily disabled because of compatability issues with Unity 2.6!");
                //UnityEditor.Handles.DrawLine(line[i], line[i+1]);
            }
        }
    }

    private static void DrawPathHelper(Vector3[] path, Color color, string method)
    {
        Vector3[] vector3s = PathControlPointGenerator(path);

        //Line Draw:
        Vector3 prevPt = Interp(vector3s, 0);
        Gizmos.color = color;
        int SmoothAmount = path.Length * 20;
        for (int i = 1; i <= SmoothAmount; i++)
        {
            float pm = (float)i / SmoothAmount;
            Vector3 currPt = Interp(vector3s, pm);
            if (method == "gizmos")
            {
                Gizmos.DrawLine(currPt, prevPt);
            }
            else if (method == "handles")
            {
                Debug.LogError("iTween Error: Drawing a path with Handles is temporarily disabled because of compatability issues with Unity 2.6!");
                //UnityEditor.Handles.DrawLine(currPt, prevPt);
            }
            prevPt = currPt;
        }
    }
    /// <summary>
    /// 三点计算抛物线.
    /// </summary>
    /// <returns>组成抛物线的点.</returns>
    /// <param name="path">确定抛物线的三个点或者更多的点的数组.</param>
    public static List<Vector3> DrawPathHelper(Vector3[] path)
    {
        List<Vector3> array = new List<Vector3>(177);
        Vector3[] vector3s = PathControlPointGenerator(path);
        //Line Draw:
        Vector3 prevPt = Interp(vector3s, 0);
        int SmoothAmount = path.Length * 20;
        for (int i = 1; i <= SmoothAmount; i++)
        {
            float pm = (float)i / SmoothAmount;
            Vector3 currPt = Interp(vector3s, pm);
            array.Add(currPt);
            prevPt = currPt;
        }
        return array;
    }
    private static Vector3[] PathControlPointGenerator(Vector3[] path)
    {
        Vector3[] suppliedPath;
        Vector3[] vector3s;
        //create and store path points:
        suppliedPath = path;
        //populate calculate path;
        int offset = 2;
        vector3s = new Vector3[suppliedPath.Length + offset];
        System.Array.Copy(suppliedPath, 0, vector3s, 1, suppliedPath.Length);
        //populate start and end control points:
        //vector3s[0] = vector3s[1] - vector3s[2];
        vector3s[0] = vector3s[1] + (vector3s[1] - vector3s[2]);
        vector3s[vector3s.Length - 1] = vector3s[vector3s.Length - 2] + (vector3s[vector3s.Length - 2] - vector3s[vector3s.Length - 3]);
        //is this a closed, continuous loop? yes? well then so let's make a continuous Catmull-Rom spline!
        if (vector3s[1] == vector3s[vector3s.Length - 2])
        {
            Vector3[] tmpLoopSpline = new Vector3[vector3s.Length];
            System.Array.Copy(vector3s, tmpLoopSpline, vector3s.Length);
            tmpLoopSpline[0] = tmpLoopSpline[tmpLoopSpline.Length - 3];
            tmpLoopSpline[tmpLoopSpline.Length - 1] = tmpLoopSpline[2];
            vector3s = new Vector3[tmpLoopSpline.Length];
            System.Array.Copy(tmpLoopSpline, vector3s, tmpLoopSpline.Length);
        }
        return (vector3s);
    }
    //andeeee from the Unity forum's steller Catmull-Rom class ( http://forum.unity3d.com/viewtopic.php?p=218400#218400 ):
    private static Vector3 Interp(Vector3[] pts, float t)
    {
        int numSections = pts.Length - 3;
        int currPt = Mathf.Min(Mathf.FloorToInt(t * (float)numSections), numSections - 1);
        float u = t * (float)numSections - (float)currPt;
        Vector3 a = pts[currPt];
        Vector3 b = pts[currPt + 1];
        Vector3 c = pts[currPt + 2];
        Vector3 d = pts[currPt + 3];
        return .5f * (
            (-a + 3f * b - 3f * c + d) * (u * u * u)
            + (2f * a - 5f * b + 4f * c - d) * (u * u)
            + (-a + c) * u
            + 2f * b
            );
    }
}


文章中涉及到一共两个类,上一个回复中已经给出,这是另一个。 由于我所有文章都用了一个工程,里面东西太多了,也乱,就不上传了。 谢谢支持

回复 支持 反对

使用道具 举报

7日久生情
2544/5000
排名
2233
昨日变化
7

2

主题

1642

帖子

2544

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182740
好友
0
蛮牛币
3977
威望
0
注册时间
2016-11-10
在线时间
424 小时
最后登录
2017-7-26
发表于 2016-12-21 13:22:33 | 显示全部楼层
谢谢分享!!!!

回复

使用道具 举报

5熟悉之中
688/1000
排名
3362
昨日变化
11

7

主题

169

帖子

688

积分

Rank: 5Rank: 5

UID
158249
好友
1
蛮牛币
1894
威望
0
注册时间
2016-7-22
在线时间
194 小时
最后登录
2017-7-26
发表于 2016-12-21 13:40:45 | 显示全部楼层
看着效果挺炫的,支持支持

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1216/1500
排名
1332
昨日变化
6

0

主题

154

帖子

1216

积分

Rank: 6Rank: 6Rank: 6

UID
31591
好友
0
蛮牛币
759
威望
0
注册时间
2014-6-27
在线时间
368 小时
最后登录
2017-7-26
QQ
发表于 2016-12-21 14:18:30 | 显示全部楼层
收藏学习下~

回复

使用道具 举报

7日久生情
2970/5000
排名
83
昨日变化

0

主题

387

帖子

2970

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
239
好友
3
蛮牛币
5371
威望
0
注册时间
2013-6-6
在线时间
603 小时
最后登录
2017-7-26
发表于 2016-12-22 10:10:05 | 显示全部楼层
good!!!!!!!!!!!!!

回复

使用道具 举报

5熟悉之中
511/1000
排名
11341
昨日变化
3

1

主题

81

帖子

511

积分

Rank: 5Rank: 5

UID
1944
好友
1
蛮牛币
957
威望
0
注册时间
2013-8-13
在线时间
375 小时
最后登录
2017-7-20
发表于 2016-12-22 14:20:47 | 显示全部楼层
markmarkmarkmark

回复 支持 反对

使用道具 举报

排名
48607
昨日变化
116

0

主题

6

帖子

11

积分

Rank: 1

UID
25289
好友
0
蛮牛币
3
威望
0
注册时间
2014-5-15
在线时间
3 小时
最后登录
2017-5-31
发表于 2016-12-23 03:18:06 | 显示全部楼层
thanks for share!!

回复

使用道具 举报

2初来乍到
100/150
排名
17621
昨日变化
14

0

主题

50

帖子

100

积分

Rank: 2Rank: 2

UID
34253
好友
0
蛮牛币
84
威望
0
注册时间
2014-7-14
在线时间
30 小时
最后登录
2017-6-21
发表于 2016-12-30 14:36:46 | 显示全部楼层
收藏学习下~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表