1. 程式人生 > >Unity中利用貝塞爾曲線來實現3D中的曲線運動

Unity中利用貝塞爾曲線來實現3D中的曲線運動

下面是在理解後寫的2階三階曲線

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

public class TestCurve : MonoBehaviour
{

    public float Timer = 0;
    public float Time1 = 2f;
    public List<Vector3> Points = new List<Vector3>();
    public List<Transform> Game_Trans;
    public float MoveSpeed = 2f;
    public GameObject Ball;
    int i = 0;

    void Awake()
    {
        ThirdOrder();
    }

    void Update()
    {
        Timer += Time.deltaTime;
        if (Timer > Time1)
        {
            i++;
            if (i >= Points.Count - 1)
                i = 0;
            Timer = 0;
            Ball.transform.position = Vector3.Lerp(Points[i], Points[i + 1], 1);
           
        }
    }

    /// <summary>
    /// 二階貝塞爾曲線
    /// </summary>
    public void SecondOrder()
    {
        Points = new List<Vector3>();
        for (int i = 0; i < 200; i++)//for迴圈計算200個點,
        {
            Vector3 v1 = Vector3.Lerp(Game_Trans[0].position, Game_Trans[1].position, i / 100f);//注意:這裡差值運算時間t必須相同
            Vector3 v2 = Vector3.Lerp(Game_Trans[1].position, Game_Trans[2].position, i / 100f);

            var find = Vector3.Lerp(v1, v2, i / 100f);
            Points.Add(find);
        }
    }

    /// <summary>
    /// 三階貝塞爾曲線
    /// </summary>
    public void ThirdOrder()
    {
        Points = new List<Vector3>();
        for (int i = 0; i < 200; i++)//for迴圈計算200個點,
        {
            Vector3 v1 = Vector3.Lerp(Game_Trans[0].position, Game_Trans[1].position, i / 100f);//注意:這裡差值運算時間t必須相同
            Vector3 v2 = Vector3.Lerp(Game_Trans[1].position, Game_Trans[2].position, i / 100f);
            Vector3 v3 = Vector3.Lerp(Game_Trans[2].position, Game_Trans[3].position, i / 100f);

            var v1_1 = Vector3.Lerp(v1, v2, i / 100f);
            var v1_2 = Vector3.Lerp(v2, v3, i / 100f);

            var find = Vector3.Lerp(v1_1, v1_2, i / 100f);
            Points.Add(find);
        }
    }
    //4階5階同理

    public void OnDrawGizmos()
    {
        ThirdOrder();

        Gizmos.color = Color.yellow;
        for (int i = 0; i < Points.Count - 1; i++)
        {
            Gizmos.DrawLine(Points[i], Points[i + 1]);
        }
    }
}
下面的程式碼是使用貝塞爾通用公式來實現的三階曲線,
public class DrawLineTest : MonoBehaviour
{
	public Transform[] m_Trans;
	[SerializeField]
	public List<Vector2> m_Points;
	// Use this for initialization
	void Start()
	{
		BezierLine(200);
	}

	public void BezierLine(int _points)
	{
		m_Points = new List<Vector2>();
		Vector2 pointA = cubeBezier(m_Trans[0].position, m_Trans[1].position, m_Trans[2].position, m_Trans[3].position, 0f);
		m_Points.Add(pointA);
		for(int i = 0; i < _points; i++)
		{
			var vector = cubeBezier(m_Trans[0].position, m_Trans[1].position, m_Trans[2].position, m_Trans[3].position, i / (float)_points);
			m_Points.Add(vector);
		}
	}

	int i = 0;

	void OnDrawGizmos()
	{
		BezierLine(200);
		Gizmos.color = Color.yellow;
		while(i < m_Points.Count - 2)
		{
			Gizmos.DrawLine(m_Points[i], m_Points[i + 1]);
			i++;
		}
		i = 0;
		
	}

	private static Vector2 cubeBezier(Vector2 s, Vector2 st, Vector2 e, Vector2 et, float t)
	{
		float num = 1f - t;
		return num * num * num * s + 3f * num * num * t * st + 3f * num * t * t * et + t * t * t * e;
	}
}



相關推薦

Unity利用曲線實現3D曲線運動

下面是在理解後寫的2階三階曲線 using UnityEngine; using System.Collections; using System.Collections.Generic; public class TestCurve : MonoBehaviour

Unity遊戲使用曲線

str net 順序 復雜 讓我 創建 函數 高程 gin 孫廣東 2015.8.15比方在3D rpg遊戲中。我們想設置彈道,不同的軌跡類型!目的:這篇文章的主要目的是要給你關於在遊戲怎樣使用貝塞爾曲線的基本想法。 貝塞爾曲線是最主要的曲線,一般用

【Unity3d遊戲開發】遊戲曲線以及其在Unity實現

轉載收藏:原文連結https://www.cnblogs.com/msxh/p/6270468.html 閱讀目錄 一、簡介 二、公式 三、實現與應用   RT,馬三最近在參與一款足球遊戲的開發,其中涉及到足球的各種運動軌跡和路徑,比如射門的軌跡,高吊球

025.自定義View應用曲線

之前一直看QQ的未讀訊息拖拽消失設計得很好,我一直覺得那個設計很好,他們的UI是真心強,於是,我也一直想寫個一樣的玩意來玩玩。最近剛好在複習View相關的知識,就拿這個來練手,下面先來看實現的效果圖: 這是我希望實現的效果,這個效果的實現在第二個圖能看出一點端倪。這裡面的曲線繪製,

Canvas繪製曲線

① 什麼是貝塞爾曲線?     在數學的數值分析領域中,貝濟埃曲線(英語:Bézier curve,亦作“貝塞爾”)是計算機圖形學中相當重要的引數曲線。更高維度的廣泛化貝濟埃曲線就稱作貝濟埃曲面,其中貝濟埃三角是一種特殊的例項。     貝濟埃曲線於1962年,由

專案開發曲線

本文由鄒啟文授權網易雲社群釋出。 郵箱大師PC版中,設計師提出了一個很妙的想法: 發信時,出現一個飛機,從寫信中央飛往進度目的地。  附加要求: 1,飛行曲線,飛機先加速,然後減速抵達終點 2,飛行途中,需要轉換飛機朝向 3,飛行途中,飛機漸漸變小 

Unity__如何在遊戲體現曲線

一、簡介 貝塞爾曲線是最基本的曲線,一般用在計算機 圖形學和 影象處理。貝塞爾曲線可以用來建立平滑的曲線的道路、 彎曲的路徑就像 祖瑪遊戲、 彎曲型的河流等。         一條貝塞爾曲線是由一組定義的控制點 P0到 P

CSS動畫

介紹篇: 貝塞爾曲線,法國數學家Pierre Bézier製造。 一種繪製曲線的方法,配有詳細的計算公式,按照這樣的公式繪製出來的曲線是為貝塞爾曲線。 其在計算機圖形中的應用相當廣泛,幾乎有曲線的地方,就少不了它的身影,如在Photoshop,Flash,Corel

DX雜記之細分著色器和利用曲面平滑模型

細分著色器的構成 細分著色器是為了將一大塊的區域繼續劃分,劃分成很多的小塊 大體上由三部分構成,但也會涉及一些其它階段的內容。 這三個階段分別為 Hull Shader Stage, Tesslator Stage, Domain Shader Stage,他們需要一起

Android -- 自定義ViewGroup++屬性動畫實現仿QQ點贊效果

private void init(final Context context) { mStarDrawable = new ArrayList<>(); mInterpolators = new ArrayList<>(); mSt

函式法實現束控加權

使用貝塞爾函式法對各個頻率點的權值進行計算調整,實現恆定波束的形成,演算法的效果不是很好,應該是演算法的應用場景上有限制。本質上這就是一種時域內通過濾波器組實現恆定波束的方法。 clc clear close all M = 5; d = 0.043; c = 343;

多個曲線在同一個animate動畫的實踐

貝塞爾曲線(Bézier curve): 又稱貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程式的數學曲線。一般的向量圖形軟體通過它來精確畫出曲線,貝茲曲線由線段與節點組成,節點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種向量曲線的。貝塞爾曲線是計算機圖形學中相

三次曲線關於點與長度在C++實現

三階貝塞爾曲線只能計算近似解,由於使用時對長度的精度要求不高,因此用部落格 【Unity】貝塞爾曲線關於點、長度、切線計算在 Unity中的C#實現 中提供的C#方法改寫為C++的,只是替換了一個結構體,因為並不懂原文中的Vector3類的使用而已。 定義一個POINT結構體,用

在 egret 利用 tween 實現 二次運動

這篇文章使用了一個 javascript 的小技巧,結合 egret.Tween ,實現了 貝塞爾曲線。 記錄如下.   在製作遊戲的過程中,經常有些需求要求我們實現一個二次貝塞爾曲線的運動,比如子彈的飛行軌跡之類的 那麼如何使用egret來實現這類需求呢?其實非常簡單,首先我

unity 實現物體沿指定的平滑曲線移動(通過曲線實現

在實際專案開發中,為了實現某種動畫或者特效,策劃都會要求讓物體實現沿編輯的軌跡進行移動,今天這裡就講一下如何讓物體沿可編輯的路線進行移動,這裡主要是通過貝塞爾曲線實現。 首先要了解貝塞爾曲線的基礎知識及原理,具體可參考改連結: 這裡的思路就是首先就是把關鍵節點儲存起來

Android 控制元件沿曲線運動

看了Android貝塞爾曲線屬性動畫(上)是不是在罵我SB,換個貝塞爾曲線的起始點,控制點,終點,控制元件還是按原來路徑運動,So.... 下面我實現了控制元件在隨機的一個貝塞爾曲線上的運動 package com.example.propertyanimsecdemo;

利用GDI+、曲線繪製一個帶曲線的矩形

{     const int splitHeigtSeg = 8;     const int splitWidthSeg = 5;     Graphics graphics(pDC->GetSafeHdc());     GraphicsPath  path;     CPoint ptCurve

unity 曲線的製作

通過傳入Vector3[]值,返回座標點陣列 public Vector3[] CreatPath(Vector3[] path,int SmoothSens) { Vector3[] vector3s = PathControlPointGenerator(path

曲線在Android的應用

       今天要講解的內容是Android中貝塞爾曲線的應用。可能很多人對貝塞爾曲線不甚瞭解,這裡先對它的概念做一下簡單介紹。        貝塞爾曲線由多個點組成:起始點、終止點以及0到n個相互分離的中間點。根據中間點的不同,可以分為線性貝塞爾曲線、二階貝塞爾曲線

使用Unity畫一條平滑曲線曲線)並使小球沿曲線運動

這裡直接講解在U3D中的實現方式 直接拿三階貝塞爾曲線為例,首先觀察下圖: 從圖中可以看出,只有四個點是保持不變的,分別是P0,P1,P2,P3,這四個點兩兩相連得到三個線段 (1)在上四點構成的三個線段中,p0-p1上有到一個點,p1