纳金网

标题: unity3d 图形吧 之 场景中画圆 [打印本页]

作者: tianhett    时间: 2015-2-7 22:52
标题: unity3d 图形吧 之 场景中画圆

先看一下效果:

   

区别就是一个2d一个3d.

2d就不介绍了,相对简单一些,对于3d的内容,我们先来看一看数学中的一个题和答案,这样就很容易理解程序了。

这样就好办了!    直接看下面几个脚本吧。


using UnityEngine;  
using System.Collections;  
using SunGuangDong.Math;  
  
[ExecuteInEditMode]  
public class DrawCircleMono : MonoBehaviour {  
    private Vector3 m_Normal ;  
  
    // Use this for initialization  
    void Start () {  
        m_Normal = new Vector3 (0, 1, 0);  
    }  
      
    void OnDrawGizmos()  
    {  
        Circle2d circle2 = new Circle2d(transform.position, 5);  
        DrawCircle(ref circle2, Color.red);  
  
        Vector3 center = new Vector3 (transform.position.x, transform.position.y + 0.2f, transform.position.z);  
        Circle3d circle3 = new Circle3d(ref center,ref m_Normal, 5);  
        DrawCircle (circle3, Color.red, 40);  
    }  
  
  
    protected void DrawCircle(ref Circle2d circle, Color color)  
    {  
        int count = 40;  
        float delta = 2f * Mathf.PI / count;  
        Vector3 prev = circle.Eval(0);  
  
        Color tempColor = Gizmos.color;  
        Gizmos.color = color;  
  
        for (int i = 1; i <= count; ++i)  
        {  
            Vector3 curr = circle.Eval(i * delta);  
            Gizmos.DrawLine(prev, curr);  
            prev = curr;  
        }  
  
        Gizmos.color = tempColor;  
    }  
      
    protected void DrawCircle(Vector2 center, float radius, Color color)  
    {  
        Circle2d circle = new Circle2d(ref center, radius);  
        int count = 40;  
        float delta = 2f * Mathf.PI / count;  
        Vector3 prev = circle.Eval(0);  
  
        Color tempColor = Gizmos.color;  
        Gizmos.color = color;  
  
        for (int i = 1; i <= count; ++i)  
        {  
            Vector3 curr = circle.Eval(i * delta);  
            Gizmos.DrawLine(prev, curr);  
            prev = curr;  
        }  
  
        Gizmos.color = tempColor;  
    }  
      
    protected void DrawCircle(Circle3d circle, Color color, int count = 20)  
    {  
        float delta = 2f * Mathf.PI / count;  
        Vector3 prev = circle.Eval(0);  
  
        Color tempColor = Gizmos.color;  
        Gizmos.color = color;  
  
        for (int i = 1; i <= count; ++i)  
        {  
            Vector3 curr = circle.Eval(i * delta);  
            Gizmos.DrawLine(prev, curr);  
            prev = curr;  
        }  
  
        Gizmos.color = tempColor;  
    }  
}  

上面这个脚本在 挂到场景中的任意对象上,如Cube

namespace SunGuangDong.Math  
{  
    using System;  
    using System.Collections.Generic;  
    using System.Runtime.InteropServices;  
    using UnityEngine;  

    [StructLayout(LayoutKind.Sequential)]  
    public struct Circle2d  
    {  
        public Vector2 Center;  
        public float Radius;  
        public Circle2d(ref Vector2 center, float radius)  
        {  
            this.Center = center;  
            this.Radius = radius;  
        }  

        public Circle2d(Vector2 center, float radius)  
        {  
            this.Center = center;  
            this.Radius = radius;  
        }  

        public float CalcPerimeter()  
        {  
            return (6.283185f * this.Radius);  
        }  

        public float CalcArea()  
        {  
            return ((3.141593f * this.Radius) * this.Radius);  
        }  

        public Vector2 Eval(float t)  
        {  
            return new Vector2(this.Center.x + (this.Radius * Mathf.Cos(t)), this.Center.y + (this.Radius * Mathf.Sin(t)));  
        }  

        public Vector2 Eval(float t, float radius)  
        {  
            return new Vector2(this.Center.x + (radius * Mathf.Cos(t)), this.Center.y + (radius * Mathf.Sin(t)));  
        }  
        public bool Contains(ref Vector2 point)  
        {  
            Vector2 vector = point - this.Center;  
            return (vector.magnitude <= (this.Radius * this.Radius));  
        }  

        public bool Contains(Vector2 point)  
        {  
            Vector2 vector = point - this.Center;  
            return (vector.magnitude <= (this.Radius * this.Radius));  
        }  

        public void Include(ref Circle2d circle)  
        {  
            Vector2 vector = circle.Center - this.Center;  
            float num = vector.magnitude;  
            float num2 = circle.Radius - this.Radius;  
            float num3 = num2 * num2;  
            if (num3 >= num)  
            {  
                if (num2 >= 0f)  
                {  
                    this = circle;  
                }  
            }  
            else  
            {  
                float num4 = Mathf.Sqrt(num);  
                if (num4 > 1E-05f)  
                {  
                    float num5 = (num4 + num2) / (2f * num4);  
                    this.Center += (Vector2) (num5 * vector);  
                }  
                this.Radius = 0.5f * ((num4 + this.Radius) + circle.Radius);  
            }  
        }  

        public void Include(Circle2d circle)  
        {  
            this.Include(ref circle);  
        }  
    }  
}  


namespace SunGuangDong.Math  
{  
    using System;  
    using System.Runtime.InteropServices;  
    using UnityEngine;  

    [StructLayout(LayoutKind.Sequential)]  
    public struct Circle3d  
    {  
        public Vector3 Center;  
        public Vector3 Axis0;  
        public Vector3 Axis1;  
        public Vector3 Normal;  
        public float Radius;  

        public Circle3d(ref Vector3 center, ref Vector3 normal, float radius)  
        {  
            this.Center = center;  
            this.Normal = normal;  
            Vector3ex.CreateOrthonormalBasis(out this.Axis0, out this.Axis1, ref this.Normal);  
            this.Radius = radius;  
        }  

        public Circle3d(Vector3 center, Vector3 normal, float radius)  
        {  
            this.Center = center;  
            this.Normal = normal;  
            Vector3ex.CreateOrthonormalBasis(out this.Axis0, out this.Axis1, ref this.Normal);  
            this.Radius = radius;  
        }  

        public float CalcPerimeter()  
        {  
            return (6.283185f * this.Radius);  
        }  

        public float CalcArea()  
        {  
            return ((3.141593f * this.Radius) * this.Radius);  
        }  

        public Vector3 Eval(float t)  
        {  
            return (this.Center + ((Vector3) (this.Radius * ((Mathf.Cos(t) * this.Axis0) + (Mathf.Sin(t) * this.Axis1)))));  
        }  

        public Vector3 Eval(float t, float radius)  
        {  
            return (this.Center + ((Vector3) (radius * ((Mathf.Cos(t) * this.Axis0) + (Mathf.Sin(t) * this.Axis1)))));  
        }  
    }  
}  



namespace SunGuangDong.Math  
{  
    using System;  
    using System.Collections.Generic;  
    using System.Runtime.CompilerServices;  
    using System.Runtime.InteropServices;  
    using UnityEngine;  

    public static class Vector3ex  
    {  
        public static readonly Vector3 Zero = new Vector3(0f, 0f, 0f);  

        public static void CreateOrthonormalBasis(out Vector3 u, out Vector3 v, ref Vector3 w)  
        {  
            if (Mathf.Abs(w.x) >= Mathf.Abs(w.y))  
            {  
                float num = Mathfex.InvSqrt((w.x * w.x) + (w.z * w.z));  
                u.x = -w.z * num;  
                u.y = 0f;  
                u.z = w.x * num;  
                v.x = w.y * u.z;  
                v.y = (w.z * u.x) - (w.x * u.z);  
                v.z = -w.y * u.x;  
            }  
            else  
            {  
                float num2 = Mathfex.InvSqrt((w.y * w.y) + (w.z * w.z));  
                u.x = 0f;  
                u.y = w.z * num2;  
                u.z = -w.y * num2;  
                v.x = (w.y * u.z) - (w.z * u.y);  
                v.y = -w.x * u.z;  
                v.z = w.x * u.y;  
            }  
        }  
    }  
}  



namespace SunGuangDong.Math  
{  
    using System;  
    using System.Runtime.InteropServices;  
    using UnityEngine;  

    public static class Mathfex  
    {  
        public const float Pi = 3.141593f;  

        public static float InvSqrt(float value)  
        {  
            if (value != 0f)  
            {  
                return (1f / Mathf.Sqrt(value));  
            }  
            return 0f;  
        }  
    }  
}  


最后附上一些其他图片吧。






1.png (136.41 KB, 下载次数: 371)

1

1

2.png (186.11 KB, 下载次数: 363)

2

2

3.png (386.62 KB, 下载次数: 373)

3

3

4.png (98.09 KB, 下载次数: 387)

4

4


作者: HIDEOKOJIMA    时间: 2015-2-7 23:29
Thanks for sharing this one !
作者: myonkyo    时间: 2015-2-8 11:19
感谢分享,谢谢提供下载




欢迎光临 纳金网 (http://go.narkii.com/club/) Powered by Discuz! X2.5