unity3d 图形吧 之 场景中画圆

??

孙广东:2015-2-6/2:28  转载请注明出处:http://blog.csdn.net/u010019717

更全的内容请看我的游戏蛮牛地址:http://www.unitymanual.com/space-uid-18602.html

先看一下效果:

   

区别就是一个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;
        }
    }
}

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

时间: 2024-10-10 17:41:12

unity3d 图形吧 之 场景中画圆的相关文章

简单谈谈自己对htm与css中画圆的理解。

近几天,在利用css编辑中,发现不少边框图像要求是矩形圆角或者直接画一个圆的例子,下面和大家一起分享下对画圆的看法. 在这次的分享中,我侧重给大家看一些例子来更好的理解, 我们都明白,画圆时要用到“border-radius:”,而且在每次画圆时,我们都应该先设定一个width和height. 那么我们可以这样理解, 我们的圆是在一个矩形(正方形)中进行裁剪的,而border-radius就是我们要裁剪的尺寸. 给大家一些图片,更好的去理解. 首先,我们设定一个width为100px,高度为10

rem单位border-radius:50%在安卓手机中画圆变形

i{ display: inline-block; width: .08rem; height: .08rem; background-color: #D0021B; border-radius: 50%; /*border-radius: .08rem;*/ }; 使用border-radius:50%,或者border-radius的值与宽高相等,都可实现一个完美的圆形,但是在不同的安卓手机中,会有不同程度的变形(有的扁圆,有的大,有的小):当使用px做为宽高的单位,border-radiu

如何在PS中画圆

有两种: 用直线工具里的椭圆工具. 这是用路径来画.按住Shift键,拉出正圆形. 点击"路径",点下面的"用前景色描绘路径". 删除工作路径. 这种画法的圆型线宽度只有1像素.如果要加宽,要用"描边"来做.适合细线圆形图像.   另一种是用"选框工具"里的"椭圆选框工具"来做.先拉出水平和垂直两条参考线.点"视图",勾选"对齐". 用椭圆选框工具,按住Shift键,

中点画线法画圆

中点画线法已经在画直线的时候详细讲过了,画圆时我们也可以用这种方法.画一个圆心为坐标原点的1/4圆,然后对其进行简单几何变换,平移对称,就可以得到任意圆. 类似的用中点画线法,从(0,r)点开始,每次要么向右走,要么向右下走,直到x==y,即到达四分之一圆处: (1)当d<0时,中点在圆内,则取正右方的点,(x+1,y+0.5),此时d=d+2*x+3; (2) 当d>=0时,中点在圆外,则取右下方的点,(x+1,y-1),此时d=d+2*(x-y)+5; (3) d0=1-r,即点(0,r)

iOS:quartz2D绘图(画一些简单的图形,如直线、三角形、圆、矩形、文字等)

前一篇几乎已经详细介绍了Quartz2D的所有知识,这一篇以及后面就不废话了,主要是用具体的实例来演示绘图效果. 这里我们先来绘制一些简单的图形(如直线.三角形.圆.矩形.文字.图像),它有两种方式可以绘制,一种是通过上下文绘制,另一种是通过路径绘制.下面对绘制三角形做了一个两种方式绘制的演示. 绘制基本的图形,需要在操作的视图类中重写- (void)drawRect:(CGRect)rect方法,并在在该方法中绘制图形.绘制图像既可以重写该方法绘制,也可以不用重写该方法,它有封装好的方法.这里

计算机图形学中的中点画线,中点画圆,Bresenham画线与画圆算法

#include<iostream>#include<graphics.h>  // 这样引用 EasyX 图形库#include<conio.h>#include<time.h>#include<math.h>#include<stdlib.h>using namespace std; //Bresenham画线void Bresenham_line(int x0,int y0,int x1,int y1){ int x,y,dx,

12864 显示画圆多种图形

/*******************************************************************************************************/ //程序说明:本程序为12864(st7920)驱动程序,只实现了最简单的显示功能 /*****************************************************************************************************

创建如Unity3D中Scene场景中的编辑轴

问题分析: 最近在搞软件底层开发,将一些工具或者底层脚本打成dll导入unity使用,有这样一需求,就是编辑功能,需要像Scene场景一样,实现那种编辑轴 实现方式: 创建Mesh,构建编辑轴,这个地方这么几步: 1.线(轴) 2.圆(旋转线) 3.正方形(轴面) 4.圆锥(轴方向) 具体步骤: 1.创建线Mesh: 代码: 1 /// <summary> 2 /// 创建线Mesh 3 /// </summary> 4 /// <param name="start

Assignment 3 在OpenGL中使用Bresenham算法画圆

一.      任务目标 利用OpenGL,实现Bresenham算法画圆. 二.      任务要求 使用整数来确定点的位置. 标出圆心.(不太明白show的含义,于是我在圆心处画了一个点来表示.) 使用至少16个点表示一个圆. 三.      使用平台 Windows 8.1 Visual Studio 2012 四.      实现简述 与Bresenham直线算法类似,采用的是中点画圆算法. 定义圆的一个函数 可根据f(x, y)符号判断点(x, y)的位置: 于是假设点pi(xi, y