日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

卐 4-3D图形的数学

發(fā)布時間:2024/1/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卐 4-3D图形的数学 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

          • Vectors(向量)
          • Common Vector Operators(常用的向量操作)
          • Dot Product(點(diǎn)積)
          • Cross Product(叉積)
          • Length of a Vector(向量的長度)
          • Reflection and Refraction(反射和折射)
          • Matrices(矩陣)
          • Matrix Construction and Operators(矩陣的構(gòu)建與操作)
          • Understanding Transformations(理解變換)
          • Coordinate Spaces in OpenGL(OpenGL中的坐標(biāo)空間)
          • Object Coordinates(對象坐標(biāo)系)
          • World Coordinates(世界坐標(biāo)系)
          • View Coordinates(視圖坐標(biāo)系)
          • Clip and Normalized Device Space(裁剪與歸一化設(shè)備空間)
          • Coordinate Transformations(坐標(biāo)轉(zhuǎn)換)
          • The Identity Matrix(單位矩陣)
          • The Translation Matrix(平移矩陣)
          • The Rotation Matrix(旋轉(zhuǎn)矩陣)
          • Euler Angles(歐拉角)
          • The Scaling Matrix(縮放矩陣)
          • Concatenating Transformations(串聯(lián)變換)
          • Quaternions(四元數(shù))
          • The Model-View Transform(模型-視圖變換)
          • The Lookat Matrix(Lookat矩陣)
          • Projection Transformations(投影變換)
          • Perspective Matrices(透視矩陣)
          • Orthographic Matrices(正交矩陣)
          • Interpolation,Lines,Curves,and Splines(插值、直線、曲線和樣條曲線)
          • Curves(曲線)
          • Splines(樣條曲線)
          • Summary(總結(jié))

Vectors(向量)

一個xyz三元組可以用一個向量來表示(事實(shí)上,對于數(shù)學(xué)上純粹的心來說,一個位置實(shí)際上也是一個向量)。當(dāng)涉及到操作三維幾何體時,向量可能是需要理解的最重要的基礎(chǔ)概念。這三個值(x、y和z)組合表示兩個重要值:方向和幅值。

向量是OpenGL操作的基礎(chǔ),因此各種大小的向量都是GLSL中的一級類型,并被命名為vec3和vec4(分別表示三元素向量和四元素向量)。向量可以表示的第二個量是大小。向量的大小是向量的長度。對于x軸向量(1, 0, 0),向量的長度是1。長度為1的向量稱為單位向量。如果一個向量不是一個單位向量,我們想把它縮放成一個,我們稱之為歸一化。對向量進(jìn)行歸一化會對其進(jìn)行縮放,使其長度變?yōu)?,然后稱該向量為歸一化向量。當(dāng)我們只想表示一個方向而不是一個大小時,單位向量很重要。

此外,如果向量長度出現(xiàn)在我們將要使用的方程中,當(dāng)這些長度為1時,它們會變得簡單得多!幅值也很重要;例如,它可以告訴我們在給定的方向上需要走多遠(yuǎn),我們需要離鱷魚多遠(yuǎn)。向量(和矩陣)是3D圖形中非常重要的概念,它們是GLSL語言(編寫著色器的語言)中的頭等公民。然而,在C++語言中,情況并非如此。為了允許你在C++程序中使用它們,vmath庫,它包含可以表示類似于它們的GLSL對應(yīng)的向量和矩陣的類。例如,vmath::vec3可以表示三分量浮點(diǎn)向量(x, y, z),vmath::vec4可以表示四分量浮點(diǎn)向量(x, y, z, w),依此類推。添加w坐標(biāo)以使向量齊次(homogeneous),但通常設(shè)置為1.0。稍后,x、y和z值可能會除以w,當(dāng)它為1.0時,實(shí)際上只剩下xyz值。vmath中的類實(shí)際上是具有類型定義的模板類,用于表示常見類型,例如單精度和雙精度浮點(diǎn)值以及有符號和無符號整數(shù)變量。

vmath::vec3與vmath::vec4的定義如下:

typedef Tvec3<float> vec3; typedef Tvec4<float> vec4;

定義一個三元素向量簡單如下:

vmath::vec3 vVector;

所有vmath類都定義了大量構(gòu)造函數(shù)和復(fù)制運(yùn)算符,這意味著您可以按如下方式聲明和初始化向量:

vec3 vmath::vVertex1(0.0f, 0.0f, 1.0f); vec4 vmath::vVertex2 = vec4(1.0f, 0.0f, 1.0f, 1.0f); vec4 vmath::vVertex3(vVertex1, 1.0f);vec3 vmath::vVerts[] = { vmath::vec3(-0.5f, 0.0f, 0.0f),vmath::vec3(0.5f, 0.0f, 0.0f),vmath::vec3(0.0f, 0.5f, 0.0f) };

vmath庫還包括許多與數(shù)學(xué)相關(guān)的函數(shù),并覆蓋其類上的大多數(shù)運(yùn)算符,以允許向量和矩陣進(jìn)行加、減、乘、轉(zhuǎn)置等操作。

在這里我們需要小心,不要過分地掩飾第四個w分量。大多數(shù)情況下,當(dāng)您使用頂點(diǎn)位置指定幾何體時,只需存儲一個三分量頂點(diǎn)并將其發(fā)送到OpenGL即可。對于許多方向向量,例如曲面法線(垂直于用于照明計算的曲面的向量),三分量向量就足夠了。但是,我們將很快深入研究矩陣世界,要變換3D頂點(diǎn),必須將其乘以4×4變換矩陣。規(guī)則是你必須將一個四分量向量乘以一個4×4矩陣;如果你嘗試使用一個4×4矩陣的三分量向量,鱷魚會吃掉你!更多關(guān)于這一切意味著什么。本質(zhì)上,如果你要對向量做你自己的矩陣運(yùn)算,那么在很多情況下你可能需要四個分量向量。

Common Vector Operators(常用的向量操作)

向量的行為與加法、減法、一元求反等運(yùn)算的預(yù)期相同。這些運(yùn)算符執(zhí)行每個分量的計算,并生成與其輸入大小相同的向量。vmath向量類重載加法、減法和一元求反運(yùn)算符以及其他幾個運(yùn)算符,以提供此類功能。

vmath::vec3 a(1.0f, 2.0f, 3.0f); vmath::vec3 b(4.0f, 5.0f, 6.0f); vmath::vec3 c;c = a + b; c = a - b; c += b; c = -c;

然而,在下面的小節(jié)中,從數(shù)學(xué)角度解釋了更多關(guān)于向量的操作。它們在vmath庫中也有實(shí)現(xiàn),下面將對其進(jìn)行概述。

Dot Product(點(diǎn)積)

設(shè)有兩向量V1(x1,y1,z1)和V2(x2,y2,z2),則有:
V1V2 = |V1||V2|cosθ = x1x2 + y1y2 + z1z2
其中,θ是向量V1V2的夾角。

vmath::vec3 a(...); vmath::vec3 b(...);float c = a.dot(b); float d = dot(a, b);

一對單位向量之間的點(diǎn)積是一個值(介于?1.0和+1.0),表示它們之間夾角的余弦。一個稍微高級一點(diǎn)的函數(shù)vmath::angle實(shí)際上返回這個角度(弧度)。

float angle(const vmath::vec3& u, const vmath::vec3& v);
Cross Product(叉積)

V1 × V2 = |V1||V2|sinθ×n = (y1z2 - z1y2, z1x2 - x1z2, x1y2 - y1x2)
其中,θ是向量V1V2的夾角;n是一個單位向量,它的方向由V1V2按右手定則產(chǎn)生(如下圖中V3)。

vec3 a(...); vec3 b(...);vec3 c = a.cross(b); vec3 d = cross(a, b);

叉積的應(yīng)用很多,從尋找三角形的曲面法線到構(gòu)造變換矩陣。

Length of a Vector(向量的長度)

設(shè)有向量V(x, y, z),則它的長度為√(x2 + y2 + z2)。它的長度也等于√(VV)。
vmath庫中也包含計算這個長度的函數(shù):

template <typename T, int len> static inline T length(const vecN<T, len>& v) { ... }
Reflection and Refraction(反射和折射)


上圖中,入射光線Rin,反射光線Rreflect,折射光線Rrefract。其中, η是折射因子。
反射光計算公式:Rreflect = Rin - (2N●Rin)N
折射光計算公式:
k = 1 - η2(1 - (N●R)2)
當(dāng)k<0時,Rrefract = 0;
當(dāng)k>=0時,Rrefract = ηR - (η(N●R) + √k)N
其中,R和N都是單位長度的向量。

vmath庫有兩個函數(shù)完成上述方程式,它們的源代碼如下:

template <typename T, const int len> static inline vecN<T,len> reflect(const vecN<T,len>& I, const vecN<T,len>& N) {return I - 2 * dot(N, I) * N; }template <typename T, const int len> static inline vecN<T,len> refract(const vecN<T,len>& I, const vecN<T,S>& N, T eta) {T d = dot(N, I);T k = T(1) - eta * eta * (T(1) - d * d);if (k < 0.0)return vecN<T,N>(0);elsereturn eta * I - (eta * d + sqrt(k)) * N; }
Matrices(矩陣)

如果在空間中有一個點(diǎn)由x、y和z坐標(biāo)表示,并且如果圍繞某個任意點(diǎn)和方向旋轉(zhuǎn)若干度,則需要知道該點(diǎn)的位置,就使用矩陣。為什么?因?yàn)樾碌膞坐標(biāo)不僅取決于舊的x坐標(biāo)和其他旋轉(zhuǎn)參數(shù),而且還取決于y和z坐標(biāo)是什么。變量和解之間的這種依賴關(guān)系正是矩陣擅長解決的問題。

我們可以把一些矩陣看作是列向量表。

矩陣可以相乘和相加,但也可以與向量和標(biāo)量值相乘。將一個點(diǎn)(由向量表示)乘以一個矩陣(表示變換)得到一個新的變換點(diǎn)(另一個向量)。矩陣變換實(shí)際上不太難理解,對矩陣變換的理解是許多3D任務(wù)的基礎(chǔ)。

vmath::mat2 m1;// 2×2 matrix vmath::mat3 m2;// 3×3 matrix vmath::mat4 m3;// 4×4 matrix

與GLSL中一樣,vmath中的矩陣類定義了常見的運(yùn)算符,如加法、減法、一元求反、乘法和除法,以及構(gòu)造函數(shù)和關(guān)系運(yùn)算符。同樣,vmath中的矩陣類是使用模板構(gòu)建的,包括單精度和雙精度浮點(diǎn)以及有符號和無符號整數(shù)矩陣類型的類型定義。

Matrix Construction and Operators(矩陣的構(gòu)建與操作)

對于一個4×4矩陣,OpenGL不是用一個二維數(shù)組存儲矩陣的浮點(diǎn)值,而是用一個包含16個元素的一維數(shù)組表示。默認(rèn)OpenGL是以列為主(column-major or column-primary)布局的。也就是說,對于一個4×4矩陣,前4個元素代表矩陣的第一列,接下來的4個元素代表矩陣的第二列,以此類推。

GLfloat matrix[16];// Nice OpenGL-friendly matrix GLfloat matrix[4][4];// Not as convenient for OpenGL programmers

OpenGL可以使用第二種變體,但第一種變體更有效。

下面的數(shù)組代表上圖的矩陣:

static const float A[] = {A00,A01,A02,A03, A10,A11,A12,A13,A20,A21,A22,A23, A30,A31,A32,A33 }

事實(shí)上,vmath庫在內(nèi)部將矩陣表示為它自己的向量類的數(shù)組,每個向量包含一列矩陣。

假設(shè)有矩陣A和B,以及向量V,則有:
A·(B·V) = (A·B)·V (矩陣乘法滿足結(jié)合律)
我們可以用我們喜歡的任何方式將變換序列組合在一起,因?yàn)榫仃嚦朔ㄊ窍嗦?lián)的,但是矩陣在乘法中出現(xiàn)的順序很重要,因?yàn)榫仃嚦朔ú粷M足交換律。

旋轉(zhuǎn)與平移執(zhí)行的先后順序?qū)ξ矬w的影響:

圖(a)中正方形先繞z軸相對于原點(diǎn)旋轉(zhuǎn)θ角,然后沿著旋轉(zhuǎn)后的新x軸(即x1軸)平移,圖(b)中相同的正方形先沿x軸平移,然后繞z軸相對于新原點(diǎn)旋轉(zhuǎn)θ角。正方形的最終位置不同是因?yàn)?strong>每次變換都是相對于最后一次執(zhí)行的變換執(zhí)行的。在圖(a)中,正方形首先相對于原點(diǎn)旋轉(zhuǎn)。在圖(b)中,正方形平移后,圍繞新平移的原點(diǎn)進(jìn)行旋轉(zhuǎn)。

Understanding Transformations(理解變換)

仔細(xì)想想,大多數(shù)3D圖形都不是真正的3D。我們使用3D概念和術(shù)語來描述事物的外觀;然后這些3D數(shù)據(jù)被“擠壓”到2D電腦屏幕上。我們稱之為將三維數(shù)據(jù)壓縮成二維數(shù)據(jù)投影的過程。每當(dāng)我們想要描述頂點(diǎn)處理期間發(fā)生的變換類型(正交(orthographic)或透視(perspective))時,我們都會提到投影(projection),但投影只是OpenGL中發(fā)生的變換類型之一。變換還允許旋轉(zhuǎn)對象;移動它們;甚至拉伸、收縮和扭曲它們。

Coordinate Spaces in OpenGL(OpenGL中的坐標(biāo)空間)
坐標(biāo)空間代表的含義
Model spacePositions relative to a local origin.Also sometimes known as object space.
World spacePositions relative to a global origin(i.e.,their location within the world).
View spacePositions relative to the viewer.Also sometimes called camera or eye space.
Clip spacePositions of vertices after projection into a nonlinear homogeneous coordinate.
Normalized device coordinate(NDC) spaceVertex coordinates are said to be in NDC after their clip space coordinates have been divided by their own w component.
Window spacePositions of vertices in pixels, relative to the origin of the window.
Object Coordinates(對象坐標(biāo)系)

大多數(shù)頂點(diǎn)數(shù)據(jù)通常在對象空間(object space)(也稱為模型空間(model space))中開始使用。在對象空間中,頂點(diǎn)的位置相對于局部原點(diǎn)進(jìn)行解釋。考慮一個宇宙飛船模型。模型的起源可能會在某個合乎邏輯的地方,比如飛行器的鼻尖、重心或飛行員可能坐的位置。在3D建模程序中,返回原點(diǎn)并充分縮小應(yīng)顯示整個宇宙飛船。模型的原點(diǎn)通常是可以旋轉(zhuǎn)模型以將其放置到新方向的點(diǎn)。將原點(diǎn)放置在遠(yuǎn)離模型的位置是沒有意義的,因?yàn)閲@該點(diǎn)旋轉(zhuǎn)對象將應(yīng)用顯著的平移和旋轉(zhuǎn)。

World Coordinates(世界坐標(biāo)系)

世界空間,它相對于固定的全局原點(diǎn)存儲坐標(biāo)的位置。繼續(xù)宇宙飛船的類比,這可能是一個運(yùn)動場或其他固定物體的中心,如附近的行星。一旦進(jìn)入世界空間,所有對象都存在于一個公共框架中。通常,這是執(zhí)行照明和物理計算的空間。

View Coordinates(視圖坐標(biāo)系)

本章中的一個重要概念是視圖坐標(biāo),通常也稱為相機(jī)(camera)或眼睛(eye)坐標(biāo)。視圖坐標(biāo)相對于觀察者的位置(因此稱為“相機(jī)”和“眼睛”),而不考慮可能發(fā)生的任何變換;你可以將它們視為“絕對”坐標(biāo)。因此,眼睛坐標(biāo)表示一個虛擬的固定坐標(biāo)系,用作公共參考系。下圖顯示了兩個視點(diǎn)的視圖坐標(biāo)系。在左側(cè),視圖坐標(biāo)表示為場景的觀察者所看到的坐標(biāo)(即,垂直于監(jiān)視器)。在右側(cè),視圖坐標(biāo)系稍微旋轉(zhuǎn),以便更好地查看z軸的關(guān)系。從觀察者的角度來看,正x和y分別指向右側(cè)和上方。正z值從原點(diǎn)向用戶移動,負(fù)z值從視點(diǎn)向屏幕移動。屏幕位于z坐標(biāo)0處。

使用OpenGL在3D空間繪制時,使用笛卡爾坐標(biāo)系。在沒有任何變換的情況下,使用剛才描述的眼睛坐標(biāo)系(eye coordinate system)。

Clip and Normalized Device Space(裁剪與歸一化設(shè)備空間)

裁剪空間是OpenGL執(zhí)行裁剪的坐標(biāo)空間。當(dāng)頂點(diǎn)著色器寫入gl_Position時,該坐標(biāo)被視為在裁剪空間(clip space)中。這始終是一個四維齊次坐標(biāo)(four-dimensional homogenous coordinate)。退出剪輯空間后,頂點(diǎn)的所有四個組件將被w分量相除。顯然,在此之后,w等于1.0。如果在此除法之前w不是1.0,則x、y和z分量將通過w的倒數(shù)進(jìn)行有效縮放。這允許透視縮短和投影等效果。將除法結(jié)果視為在歸一化設(shè)備坐標(biāo)空間(NDC空間)中。顯然,如果裁剪空間坐標(biāo)的結(jié)果w分量為1.0,則裁剪空間和NDC空間將變得相同。

Coordinate Transformations(坐標(biāo)轉(zhuǎn)換)


如前所述,通過將坐標(biāo)的向量表示乘以變換矩陣,可以將坐標(biāo)從一個空間移動到另一個空間。變換用于操縱模型及其內(nèi)的特定對象。這些變換將對象進(jìn)行移動、旋轉(zhuǎn)和縮放。上圖說明了將應(yīng)用于對象的三種最常見的建模轉(zhuǎn)換。圖(a)顯示了平移,其中對象沿給定軸移動。圖(b)顯示了一個旋轉(zhuǎn),一個對象圍繞其中一個軸旋轉(zhuǎn)。最后,圖?顯示了縮放的效果,對象的尺寸增加或減少了指定的量。縮放可以不均勻地進(jìn)行(不同的尺寸可以按不同的量進(jìn)行縮放),因此可以使用縮放來拉伸和收縮對象。

這些標(biāo)準(zhǔn)變換中的每一個都可以表示為一個矩陣,你可以通過該矩陣乘以頂點(diǎn)坐標(biāo)來計算變換后的位置。接下來小節(jié)討論這些矩陣的構(gòu)造,包括數(shù)學(xué)構(gòu)造和使用vmath庫中提供的函數(shù)。

The Identity Matrix(單位矩陣)

單位矩陣除斜對角線為1其余都為0。所有的單位矩陣都是平方的,如4×4。將頂點(diǎn)乘以單位矩陣等于將其乘以1。所有單位矩陣都是它本身的轉(zhuǎn)置矩陣。

可以這樣構(gòu)建單位矩陣:

// Using a raw array: GLfloat m1[] = { 1.0f, 0.0f, 0.0f, 0.0f, // X Column0.0f, 1.0f, 0.0f, 0.0f, // Y Column0.0f, 0.0f, 1.0f, 0.0f, // Z Column0.0f, 0.0f, 0.0f, 1.0f };// W Column // Or using the vmath::mat4 constructor: vmath::mat4 m2 { vmath::vec4(1.0f, 0.0f, 0.0f, 0.0f), // X Columnvmath::vec4(0.0f, 1.0f, 0.0f, 0.0f), // Y Columnvmath::vec4(0.0f, 0.0f, 1.0f, 0.0f), // Z Columnvmath::vec4(0.0f, 0.0f, 0.0f, 1.0f) };// W Column // use vmath library functions vmath::mat2 m2 = vmath::mat2::identity(); vmath::mat3 m3 = vmath::mat3::identity(); vmath::mat4 m4 = vmath::mat4::identity();
The Translation Matrix(平移矩陣)


實(shí)際上,位置向量幾乎總是使用四個分量編碼,其中w分量為1.0,而方向向量要么簡單地使用三個分量編碼,要么使用四個分量編碼,其中w為0。因此,將四分量方向向量乘以平移矩陣根本不會改變它。
vmath庫包含兩個函數(shù),它們將使用三個單獨(dú)的組件或三維向量為您構(gòu)建4×4轉(zhuǎn)換矩陣:

template <typename T> static inline Tmat4<T> translate(T x, T y, T z) { ... }template <typename T> static inline Tmat4<T> translate(const vecN<T, 3>& v) { ... }
The Rotation Matrix(旋轉(zhuǎn)矩陣)


可以將這三個矩陣相乘生成一個復(fù)合變換矩陣,然后在單個矩陣-向量相乘運(yùn)算中圍繞三個軸中的每個軸旋轉(zhuǎn)給定的量。

template <typename T> static inline Tmat4<T> rotate(T angle_x, T angle_y, T angle_z);template <typename T> static inline Tmat4<T> rotate<T angle, T x, T y, T z);template <typename T> static inline Tmat4<T> rotate<T angle, const vecN<T, 3>& axis);

注意angle的單位是度數(shù)而非弧度。此函數(shù)在內(nèi)部將度轉(zhuǎn)換為弧度,因?yàn)榕c計算機(jī)不同,許多程序員更喜歡用度來思考。

Euler Angles(歐拉角)

歐拉角是一組表示空間方向的三個角。每個角度表示圍繞定義幀的三個正交向量之一的旋轉(zhuǎn)(例如,x、y和z軸)。如前所述,矩陣變換的執(zhí)行順序很重要,因?yàn)橐圆煌捻樞驁?zhí)行某些變換(如旋轉(zhuǎn))將產(chǎn)生不同的結(jié)果。這是由于矩陣乘法的非交換性質(zhì)(non-commutative nature)。

設(shè)定xyz-軸為參考系的參考軸。稱xy-平面與XY-平面的相交為交點(diǎn)線,用英文字母(N)代表。zxz順規(guī)的歐拉角可以靜態(tài)地這樣定義:

α 是x-軸與交點(diǎn)線的夾角,β 是z-軸與Z-軸的夾角,γ 是交點(diǎn)線與X-軸的夾角。

繞X軸旋轉(zhuǎn):

繞Y軸旋轉(zhuǎn):

繞Z軸旋轉(zhuǎn):

將方向表示為一組三個角度有一些優(yōu)點(diǎn)。例如,這種類型的表示相當(dāng)直觀,如果你計劃將角度連接到用戶界面,這一點(diǎn)很重要。另一個好處是,插值角度、在每個點(diǎn)構(gòu)造旋轉(zhuǎn)矩陣以及在最終動畫中看到平滑一致的運(yùn)動非常簡單。

然而,歐拉角也有一個嚴(yán)重的陷阱——萬向鎖(gimbal lock)。
當(dāng)旋轉(zhuǎn)一個角度使一個軸重新定向以與另一個軸對齊時,會發(fā)生萬向節(jié)鎖定。任何圍繞兩個現(xiàn)在共線的軸的進(jìn)一步旋轉(zhuǎn)都將導(dǎo)致模型的相同變換,從而從系統(tǒng)中移除自由度。因此,歐拉角不適合串聯(lián)變換或累積旋轉(zhuǎn)。
為了避免這種情況,我們的vmath::rotate函數(shù)能夠獲取旋轉(zhuǎn)角度和旋轉(zhuǎn)軸。當(dāng)然,將三個旋轉(zhuǎn)疊加在一起(x、y和z軸各一個)可以在必要時使用歐拉角,但最好使用角度軸表示旋轉(zhuǎn),或使用四元數(shù)表示變換并根據(jù)需要將其轉(zhuǎn)換為矩陣。

The Scaling Matrix(縮放矩陣)

縮放變換通過按指定的因子沿三個軸擴(kuò)展或收縮所有頂點(diǎn)來更改對象的大小。

// scale independently in the x,y,z template <typename T> static inline Tmat4<T> scale<T x, T y, T z) { ... } // uses a vec3 vector rather than three separate parameters template <typename T> static inline Tmat4<T> scale<const Tvec3<T>& v) { ... } // scale by the same amount x in all three dimensions template <typename T> static inline Tmat4<T> scale<T x) { ... }

例如,一個10×10×10立方體在x和z軸方向上綻放,如下圖:

Concatenating Transformations(串聯(lián)變換)

正如您所了解的,坐標(biāo)變換可以用矩陣表示,向量從一個空間到另一個空間的變換涉及一個簡單的矩陣-向量乘運(yùn)算。乘以一系列矩陣可以應(yīng)用一系列變換。在每次矩陣-向量相乘之后,不必存儲中間向量。相反,首先將構(gòu)成一組相關(guān)變換的所有矩陣相乘,生成一個表示整個變換序列的矩陣是可能的,并且通常更可取。然后,可以使用該矩陣將向量直接從源坐標(biāo)空間轉(zhuǎn)換到目標(biāo)坐標(biāo)空間。記住,順序很重要。使用vmath或GLSL編寫代碼時,應(yīng)始終將矩陣與向量相乘,并按倒序讀取變換序列。例如,考慮下面的代碼序列:

vmath::mat4 translation_matrix = vmath::translate(4.0f, 10.0f, -20.0f); vmath::mat4 rotation_matrix = vmath::rotate(45.0f, vmath::vec3(0.0f, 1.0f, 0.0f)); vmath::vec4 input_vertex = vmath::mat4(....); vmath::vec4 transformed_vertex = translation_matrix * rotation_matrix * input_vertex;

該代碼首先將模型繞y軸旋轉(zhuǎn)45°,然后將其在x軸上平移4個單位,在y軸上平移10個單位,在z軸上平移負(fù)20個單位。這會將模型放置在特定方向,然后將其移動到位。是先旋轉(zhuǎn),后平移。我們可以將此代碼重寫如下:

vmath::mat4 translation_matrix = vmath::translate(4.0f, 10.0f, -20.0f);vmath::mat4 rotation_matrix = vmath::rotate(45.0f, vmath::vec3(0.0f, 1.0f, 0.0f));vmath::mat4 composite_matrix = translation_matrix * rotation_matrix;vmath::vec4 input_vertex = vmath::vec4(...);vmath::vec4 transformed_vertex = composite_matrix * input_vertex;// 先旋轉(zhuǎn),再平移
Quaternions(四元數(shù))

四元數(shù)是一種四維量,在某些方面類似于復(fù)數(shù)。它有一個實(shí)部和三個虛部(與復(fù)數(shù)的一個虛部相比)。正如復(fù)數(shù)有一個虛部i一樣,四元數(shù)有三個虛部i、j和k。數(shù)學(xué)上,四元數(shù)q表示為
q = (x + yi + zj + wk)
性質(zhì)?:i2 = j2 = k2 = ijk = -1。
性質(zhì)?:i = jk、j = ik、k = ji。

與復(fù)數(shù)一樣,四元數(shù)的乘法是非交換的。四元數(shù)的加法和減法定義為簡單的矢量加減法,各項按分量進(jìn)行加減。其他函數(shù)(如一元否定和幅值)的行為也與四分量向量的預(yù)期相同。雖然四元數(shù)是一個四分量實(shí)體,但通常將四元數(shù)表示為實(shí)標(biāo)量部分和三分量虛矢量部分。這種表述通常書面寫作:q = (r, v)。

好的,很好,但這不是可怕的數(shù)學(xué)章節(jié),對嗎?這是關(guān)于計算機(jī)圖形、OpenGL和所有有趣的東西。這就是四元數(shù)真正有用的地方。回想一下,我們的旋轉(zhuǎn)函數(shù)以一個角度和一個軸為中心旋轉(zhuǎn)。
我們可以將這兩個量表示為四元數(shù),在實(shí)部填充角度,在向量部填充軸,得到一個表示繞任意軸旋轉(zhuǎn)的四元數(shù)。
旋轉(zhuǎn)序列可以由一系列四元數(shù)相乘表示,生成一個四元數(shù),一次編碼整個批次。雖然可以生成一組表示圍繞各個笛卡爾軸旋轉(zhuǎn)的矩陣,然后將它們相乘,這種方法容易受到萬向節(jié)鎖的影響。如果對一系列四元數(shù)執(zhí)行相同的操作,則萬向節(jié)鎖定不會發(fā)生。為了便于編寫代碼,vmath包括vmath::quaternion類,該類實(shí)現(xiàn)了這里描述的大部分功能。

The Model-View Transform(模型-視圖變換)

在一個簡單的OpenGL應(yīng)用程序中,最常見的轉(zhuǎn)換之一是將模型從模型空間(model space)轉(zhuǎn)換到視圖空間(view space),以便對其進(jìn)行渲染。實(shí)際上,我們首先將模型移動到世界空間(即相對于世界原點(diǎn)放置),然后再從那里移動到視圖空間(相對于觀察者放置)。這個過程確定了場景的有利位置。默認(rèn)情況下,透視投影中的觀察點(diǎn)位于原點(diǎn)(0,0,0),看向負(fù)z軸(進(jìn)入監(jiān)視器或屏幕)。該觀察點(diǎn)相對于眼睛坐標(biāo)系(eye coordinate system)移動,以提供特定的有利位置。當(dāng)觀察點(diǎn)位于原點(diǎn)時,如在透視投影中,使用正z值繪制的對象位于觀察者后面。然而,在正交投影中,假定觀察者在正z軸上無限遠(yuǎn),并且可以看到視體(viewing volume)內(nèi)的一切。

由于此變換將頂點(diǎn)從模型空間(有時也稱為對象空間)直接帶入視圖空間,并有效地繞過世界空間,因此通常稱為模型-視圖變換,對此變換進(jìn)行編碼的矩陣稱為模型-視圖矩陣。

模型變換實(shí)質(zhì)上是將對象放置到世界空間中。每個對象都可能有自己的模型變換,通常由一系列縮放、旋轉(zhuǎn)和平移操作組成。將模型空間中頂點(diǎn)的位置乘以模型變換的結(jié)果是世界空間中的一組位置。這種轉(zhuǎn)換有時被稱為模型-世界轉(zhuǎn)換(model-world transform)。

視圖轉(zhuǎn)換允許您將觀察點(diǎn)放置在任意位置,并朝任意方向觀察。確定查看變換類似于將攝影機(jī)放置并指向場景。在總體方案中,必須在任何其他建模轉(zhuǎn)換之前應(yīng)用視圖轉(zhuǎn)換。原因是它似乎相對于眼睛坐標(biāo)系移動了當(dāng)前工作坐標(biāo)系。然后,所有后續(xù)變換都基于新修改的坐標(biāo)系進(jìn)行。將坐標(biāo)從世界空間移動到視圖空間的變換有時稱為世界-視圖變換(world-view transform)。

通過將模型-世界和世界-視圖變換矩陣相乘,將它們連接在一起,得到模型-視圖矩陣(即,從模型到視圖空間獲取坐標(biāo)的矩陣)。這樣做有一些好處。首先,場景中可能有許多模型,每個模型中都有許多頂點(diǎn)。如前所述,使用單復(fù)合變換將模型移動到視圖空間比先將其移動到世界空間,然后再移動到視圖空間更有效。第二個優(yōu)勢更多地與單精度浮點(diǎn)數(shù)字的數(shù)值精度有關(guān):世界可能很大,在世界空間中執(zhí)行的計算將具有不同的精度,具體取決于頂點(diǎn)離世界原點(diǎn)的距離。但是,如果在視圖空間中執(zhí)行相同的計算,則精度取決于頂點(diǎn)離觀察者的距離,這可能是您想要的——對靠近觀察者的對象應(yīng)用了大量的精度,但犧牲了距離觀察者很遠(yuǎn)的精度。

The Lookat Matrix(Lookat矩陣)

如果你在一個已知的位置有一個有利的位置,并且你想看一個東西,你會希望把你的虛擬相機(jī)放在那個位置,然后把它指向正確的方向。要正確定位相機(jī),您還需要知道它向上的方向;否則,相機(jī)可能會繞著它的前向軸旋轉(zhuǎn),即使從技術(shù)上講它仍然指向正確的方向,這幾乎肯定不是你想要的。因此,給定一個原點(diǎn)、一個感興趣點(diǎn)和一個我們認(rèn)為要上升的方向,我們想要構(gòu)造一系列變換,理想地烘烤成一個矩陣,這將表示一個旋轉(zhuǎn),它將指向一個攝像機(jī)在正確的方向上,一個將原點(diǎn)移動到攝像機(jī)中心的平移。該矩陣稱為lookat矩陣(lookat matrix),可僅使用本章迄今為止所述的數(shù)學(xué)知識構(gòu)建。

首先,我們知兩個位置相減會得到一個向量,這個向量會將一個點(diǎn)從第一個位置移動到第二個位置,而對向量結(jié)果進(jìn)行歸一化會得到它的方向。因此,如果我們?nèi)∫粋€關(guān)注點(diǎn)的坐標(biāo),從中減去我們相機(jī)的位置,然后歸一化得到的向量,我們就有了一個新的向量,表示從相機(jī)到關(guān)注點(diǎn)的視角方向。我們稱之為前向向量(forward vector)。

接下來,我們知道,如果我們?nèi)蓚€向量的叉積,我們將得到與兩個輸入向量正交(成直角)的第三個向量。我們有兩個矢量,我們剛才計算的前向矢量(forward vector),和向上矢量(up vector),它代表我們認(rèn)為向上的方向。取這兩個向量的叉積,得到第三個向量,該向量與它們中的每一個向量正交,并且相對于我們的相機(jī)指向側(cè)面。我們稱之為側(cè)向向量(sideways vector)。然而,上方向向量和前方向向量不一定相互正交,我們需要第三個正交向量來構(gòu)造旋轉(zhuǎn)矩陣。為了得到這個向量,我們可以簡單地再次應(yīng)用相同的過程,取前向向量和側(cè)向向量的叉積,得到第三個向量,這第三個向量與前向向量和側(cè)向向量正交,表示相對于相機(jī)的上方向(up)。

這三個向量具有單位長度,并且彼此正交,因此它們形成一組正交基向量并表示我們的視圖框架。給定這三個向量,我們可以構(gòu)造一個旋轉(zhuǎn)矩陣,它將在標(biāo)準(zhǔn)笛卡爾基礎(chǔ)上取一個點(diǎn),并將其移動到相機(jī)的基礎(chǔ)上。在下面的數(shù)學(xué)中,e是眼睛(或相機(jī))的位置,p是關(guān)注點(diǎn),u是上方向向量。

首先,構(gòu)造我們的前向向量f:
f = (p - e) / |p - e|
然后,構(gòu)造側(cè)向向量s:
s = f×u
在相機(jī)參考中構(gòu)造一個新的上方向向量u′:
u′ = s×f
最后,構(gòu)造一個旋轉(zhuǎn)矩陣,表示重新定向到我們新構(gòu)造的正交基中:

要將對象轉(zhuǎn)換為攝影機(jī)的幀,不僅需要正確確定所有對象的方向,還需要將原點(diǎn)移動到攝影機(jī)的位置。我們通過簡單地將結(jié)果向量轉(zhuǎn)換為相機(jī)位置的負(fù)數(shù)來實(shí)現(xiàn)這一點(diǎn)。還記得平移矩陣是如何通過將偏移量放入矩陣最右邊的列中來構(gòu)造的嗎?我們也可以在這里這樣做:

終于,我們得到lookat矩陣,就是上面的矩陣T。

template <typename T> static inline Tmat4<T> lookat(const vecN<T,3>& eye, const vecN<T,3>& center, const vecN<T,3>& up) { ... }

由vmath::lookat函數(shù)生成的矩陣可以用作相機(jī)矩陣的基礎(chǔ)——表示相機(jī)位置和方向的矩陣。換句話說,這可以是你的視圖矩陣。

Projection Transformations(投影變換)

投影變換將在模型-視圖變換后應(yīng)用于頂點(diǎn)。該投影實(shí)際上定義了視體并建立了剪裁平面。剪裁平面是三維空間中的平面方程,OpenGL使用它來確定觀察者是否可以看到幾何體。更具體地說,投影變換指定如何將完成的場景(完成所有建模后)投影到屏幕上的最終圖像。你將了解有關(guān)正交投影(orthographic)和透視投影(perspective)兩種類型的詳細(xì)信息。

在正交或平行投影中,所有多邊形都以指定的相對尺寸精確地繪制在屏幕上。直線和多邊形使用平行線直接映射到2D屏幕,這意味著無論某物離屏幕有多遠(yuǎn),它仍然繪制為相同大小,只是在屏幕上展平。這種類型的投影通常用于渲染二維圖像,如藍(lán)圖(blueprints)中的正面、頂部和側(cè)面立面,或二維圖形(如文本或屏幕菜單)。

透視投影顯示的場景更多的是真實(shí)生活中的場景,而不是藍(lán)圖。透視投影的特點(diǎn)是縮短(foreshortening),這使得遠(yuǎn)處的物體看起來比同樣大小的附近物體小。三維空間中可能平行的線并不總是與觀察者平行。例如,對于鐵路軌道,軌道是平行的,但使用透視投影,它們似乎在某個遙遠(yuǎn)的點(diǎn)會聚。透視投影的好處是,你不必知道直線在哪里會聚,也不必知道遠(yuǎn)處的物體有多小。您只需使用模型-視圖變換指定場景,然后應(yīng)用透視投影矩陣。線性代數(shù)為你帶來了所有的魔力。

下圖比較了兩個不同場景上的正交投影和透視投影。

正如你在左側(cè)顯示的正交投影中所看到的,立方體在遠(yuǎn)離查看器時,其大小似乎不會發(fā)生變化。然而,在右側(cè)顯示的透視投影中,立方體隨著距離觀察者越來越遠(yuǎn)而變得越來越小。

正交投影最常用于二維繪圖目的,其中需要像素和繪圖單位之間的精確對應(yīng)。您可以將它們用于原理圖布局、文本或二維圖形應(yīng)用程序。如果渲染深度與距視點(diǎn)的距離相比具有非常小的深度,則也可以使用正交投影進(jìn)行三維渲染。透視投影用于渲染包含需要應(yīng)用縮短的開闊空間或?qū)ο蟮膱鼍啊T诖蠖鄶?shù)情況下,透視投影是典型的三維圖形。事實(shí)上,用正交投影觀察3D對象可能會有點(diǎn)令人不安。

Perspective Matrices(透視矩陣)

一旦頂點(diǎn)在視圖空間中,我們需要將它們放入裁剪空間,我們可以通過應(yīng)用投影矩陣來實(shí)現(xiàn)這一點(diǎn),投影矩陣可以表示透視投影或正交投影(或其他投影)。常用的透視矩陣是平截頭體矩陣。平截頭體矩陣是一種投影矩陣,它生成透視投影,使得裁剪空間的形狀為矩形平截頭體,即截斷的矩形棱錐體。其參數(shù)是到近平面和遠(yuǎn)平面的距離以及左、右、上和下剪裁平面的世界空間坐標(biāo)。平截體矩陣采用以下形式:

static inline mat4 frustum(float left, float right, float bottom, float top, float n, float f) { ... }

構(gòu)造透視矩陣的另一種常用方法是直接將視野(field of view)指定為角度(FOV角)(可能以度為單位)、縱橫比(通常通過將窗口的寬度除以其高度得出)以及近平面和遠(yuǎn)平面的視圖空間位置。這在某種程度上更易于指定,并且只生成對稱的視錐(symmetric frustra)。然而,這幾乎總是你想要的。

static inline mat4 perspective(float fovy, float aspect, float n, float f) { ... }
Orthographic Matrices(正交矩陣)

如果希望對場景使用正交投影,則可以構(gòu)造(稍微簡單一些的)正交投影矩陣。正交投影矩陣只是將視圖空間坐標(biāo)線性映射到裁剪空間坐標(biāo)的縮放矩陣。構(gòu)造正交投影矩陣的參數(shù)是場景邊界的視圖空間中的左、右、上和下坐標(biāo),以及近平面和遠(yuǎn)平面的位置。

static inline mat4 ortho(float left, float right, float bottom, float top, float near, float far) { ... }
Interpolation,Lines,Curves,and Splines(插值、直線、曲線和樣條曲線)


D = B - A
P = A + tD = A + t(B - A) = (1 - t)A + tB
如果t在0.0和1.0之間,那么P將在A和B之間結(jié)束。超出此范圍的t值會將P推離線的末端。你們應(yīng)該可以看到,通過平滑地改變t,我們可以將點(diǎn)P從A移到B,然后再移回來。這被稱為線性插值(linear iterpolation)。A和B(和P)的值可以有任意數(shù)量的維度。例如,它們可以是標(biāo)量值;二維值,如圖形上的點(diǎn);三維值,如三維空間中的坐標(biāo)、顏色等;或者更高維度的數(shù)量,例如矩陣、數(shù)組,甚至整個圖像。在許多情況下,線性插值沒有多大意義(例如,兩個矩陣之間的線性插值通常不會產(chǎn)生有意義的結(jié)果),但角度、位置和其他坐標(biāo)通常可以安全地插值。

線性插值是圖形中的一種常見操作,GLSL包括一個專門用于此目的的內(nèi)置函數(shù),mix:

vec4 mix(vec4 A, vec4 B, float t);

mix函數(shù)有幾個版本,將向量或標(biāo)量的不同維數(shù)作為A和B輸入,并將標(biāo)量或匹配向量作為t輸入。

Curves(曲線)

如果我們只想沿著兩點(diǎn)之間的直線移動所有東西,那么這就足夠了。但是,在現(xiàn)實(shí)世界中,對象以平滑曲線移動,并平滑地加速和減速。曲線可以由三個或更多控制點(diǎn)表示。對于大多數(shù)曲線,有三個以上的控制點(diǎn),其中兩個形成端點(diǎn);其他定義了曲線的形狀。考慮下圖所示的簡單曲線。

有三個控制點(diǎn)A、B、C,其中A和C是曲線的端點(diǎn),B定義了曲線的形狀。如果我們將點(diǎn)A和點(diǎn)B與一條直線連接起來,將點(diǎn)B和點(diǎn)C與另一條直線連接起來,那么我們可以使用簡單的線性插值沿這兩條直線進(jìn)行插值,以找到一對新的點(diǎn)D和E。現(xiàn)在,給定這兩點(diǎn),我們可以用另一條線把它們連接起來,沿著它插值,找到一個新的點(diǎn),P。當(dāng)我們改變插值參數(shù)t時,點(diǎn)P將沿著從A到D的平滑曲線路徑移動。用數(shù)學(xué)表示:
D = A + t(B - A)
E = B + t(C - B)
P = D + t(E - D)
= A + t(B ? A)+ t((B +(t(C ? B))) ? (A + t(B ? A))))
= A +2t(B ? A)+ t2(C ? 2B + A)
你應(yīng)該認(rèn)識到這是t中的二次方程(quadratic equation)。它描述的曲線稱為二次Bézier曲線。實(shí)際上,我們可以使用mix函數(shù)在GLSL中非常容易地實(shí)現(xiàn)這一點(diǎn),因?yàn)槲覀兯龅闹皇菍η懊鎯纱尾逯档慕Y(jié)果進(jìn)行線性插值(混合)。

vec4 quadratic_bezier(vec4 A, vec4 B, vec4 C, float t) {vec4 D = mix(A, B, t);// D = A + t(B - A)vec4 E = mix(B, C, t);// E = B + t(C - B)vec4 P = mix(D, E, t);// P = D + t(E - D)return P; }

通過添加第四個控制點(diǎn),如下圖所示,我們可以將階數(shù)增加1,并生成三次Bézier曲線。

我們現(xiàn)在有四個控制點(diǎn),A、B、C和D。構(gòu)造曲線的過程類似于二次Bézier曲線。我們從A到B形成第一條線,從B到C形成第二條線,從C到D形成第三條線。沿這三條直線中的每一條進(jìn)行插值會產(chǎn)生三個新點(diǎn),即E、F和G。利用這三個點(diǎn),我們再形成兩條線,一條從E到F,另一條從F到G,沿著這兩條線插值,得到點(diǎn)H和點(diǎn)I,在這兩條線之間我們可以插值找到我們的最終點(diǎn)P。
因此,我們有:
E = A + t(B - A)
F = B + t(C - B)
G = C + t(D - C)
H = E + t(F - E)
I = F + t(G - F)
P = H + t(I - H)
如果你認(rèn)為這些方程看起來很熟悉,你是對的:我們的點(diǎn)E,F和G形成了一條二次Bézier曲線,我們用它來插值到我們的最終點(diǎn)P。如果我們將E、F和G的方程代入H和I的方程中,然后代入P的方程中,通過展開式,我們將得到一個三次方程,其項包含在t3——因此被稱為三次Bézier曲線。同樣,我們可以通過使用混合函數(shù)在GLSL中進(jìn)行線性插值來簡單有效地實(shí)現(xiàn)這一點(diǎn):

vec4 cubic_bezier(vec4 A, vec4 B, vec4 C, vec4 D, float t) {vec4 E = mix(A, B, t); // E = A + t(B - A)vec4 F = mix(B, C, t); // F = B + t(C - B)vec4 G = mix(C, D, t); // G = C + t(D – C)vec4 H = mix(E, F, t); // H = E + t(F - E)vec4 I = mix(F, G, t); // I = F + t(G - F)vec4 P = mix(H, I, t); // P = H + t(I - H)return P; }

正如三次Bézier曲線方程的結(jié)構(gòu)“包括”二次曲線方程一樣,實(shí)現(xiàn)它們的代碼也是如此。事實(shí)上,我們可以將這些曲線層疊在一起,使用一條曲線的代碼構(gòu)建下一條曲線。

vec4 cubic_bezier(vec4 A, vec4 B, vec4 C, vec4 D, float t) {vec4 E = mix(A, B, t); // E = A + t(B - A)vec4 F = mix(B, C, t); // F = B + t(C - B)vec4 G = mix(C, D, t); // G = C + t(D - C)return quadratic_bezier(E, F, G, t); }

現(xiàn)在,我們看到了這個模式,我們可以更進(jìn)一步,產(chǎn)生更高階的曲線。例如,五次Bézier曲線(一條有五個控制點(diǎn))可以實(shí)現(xiàn)為:

vec4 quintic_bezier(vec4 A, vec4 B, vec4 C, vec4 D, vec4 E, float t) {vec4 F = mix(A, B, t); // F = A + t(B - A)vec4 G = mix(B, C, t); // G = B + t(C - B)vec4 H = mix(C, D, t); // H = C + t(D - C)vec4 I = mix(D, E, t); // I = D + t(E - D)return cubic_bezier(F, G, H, I, t); }

理論上,這種分層可以反復(fù)應(yīng)用于任何數(shù)量的控制點(diǎn)。但是,在實(shí)踐中,通常不使用具有四個以上控制點(diǎn)的曲線。相反,我們使用樣條曲線。

Splines(樣條曲線)

樣條曲線實(shí)際上是由幾個較小的曲線(如Bézier曲線)組成的長曲線,這些曲線局部定義了它們的形狀。至少表示曲線端點(diǎn)的控制點(diǎn)在線段之間共享,并且通常一個或多個內(nèi)部控制點(diǎn)在相鄰線段之間以某種方式共享或鏈接。任何數(shù)量的曲線都可以通過這種方式連接在一起,從而形成任意長的路徑。

這就是將曲線粘在一起形成樣條曲線的原因。這些控制點(diǎn)稱為焊縫(welds),中間的控制點(diǎn)稱為節(jié)點(diǎn)(knots)。

在上圖中,曲線由十個控制點(diǎn)A到J定義,它們形成三條三次Bézier曲線。第一個由A、B、C和D定義,第二個共享D并進(jìn)一步使用E、F和G,第三個共享G并添加H、I和J。這種樣條曲線稱為三次Bézier樣條曲線,因?yàn)樗怯梢幌盗腥蜝ézier曲線構(gòu)成的。這也被稱為三次B樣條(B-spline)——這一術(shù)語對于過去閱讀過大量圖形知識的人來說可能很熟悉。

要沿樣條曲線插值點(diǎn)P,我們只需將其劃分為三個區(qū)域,使t的范圍從0.0到3.0。在0.0和1.0之間,我們沿著第一條曲線插值,從A移動到D。在1.0和2.0之間,我們沿著第二條曲線插值,從D移動到G。當(dāng)t在2.0和3.0之間時,我們沿著G和J之間的最終曲線進(jìn)行插值。因此,t的整數(shù)部分決定了我們要沿其插值的曲線段,而t的分?jǐn)?shù)部分用于沿該段插值。當(dāng)然,我們可以隨心所欲地擴(kuò)展t。例如,如果我們?nèi)∫粋€介于0.0和1.0之間的值,并將其乘以曲線中的分段數(shù),則無論曲線中控制點(diǎn)的數(shù)量如何,我們都可以繼續(xù)使用t的原始值范圍。
下面的代碼將沿三次Bézier樣條插值一個向量,該樣條具有十個控制點(diǎn)(以及三個線段):

vec4 cubic_bspline_10(vec4 CP[10], float t) {float f = t * 3.0;int i = int(floor(f));float s = fract(t);// fract(x) = x - floor(x)if (t <= 0.0)return CP[0];if (t >= 1.0)return CP[9];vec4 A = CP[i * 3];vec4 B = CP[i * 3 + 1];vec4 C = CP[i * 3 + 2];vec4 D = CP[i * 3 + 3];return cubic_bezier(A, B, C, D, s); }

如果我們使用樣條曲線來確定對象的位置或方向,我們會發(fā)現(xiàn)我們必須非常小心地選擇控制點(diǎn)位置,以保持運(yùn)動平滑和流暢。插值點(diǎn)P值的變化率(即其速度)是曲線方程相對于t的微分。如果這個函數(shù)是不連續(xù)的,那么P會突然改變方向,我們的物體會出現(xiàn)跳躍。此外,P的速度(加速度)的變化率是樣條方程相對于t的二階導(dǎo)數(shù)。如果加速不平穩(wěn),則P會突然加速或減速。

具有連續(xù)一階導(dǎo)數(shù)的函數(shù)稱為C1連續(xù)函數(shù);類似地,具有連續(xù)二階導(dǎo)數(shù)的曲線稱為C2連續(xù)曲線。Bézier曲線段都是C1和C2連續(xù)的,但為了確保在樣條曲線的焊縫上保持連續(xù)性,我們需要確保每個段從前一段在位置、移動方向和變化率方面結(jié)束的位置開始。在特定方向上的移動速率就是一個速度。因此,我們可以在每個焊縫處指定速度,而不是為樣條曲線指定任意控制點(diǎn)。如果在計算該焊縫任一側(cè)的曲線段時,在每個焊縫處使用相同的曲線速度,則我們將使用C1和C2連續(xù)的樣條函數(shù)。

如果您再看一看上圖,這應(yīng)該是有意義的——沒有扭結(jié)(kinks),曲線通過焊縫(點(diǎn)D和點(diǎn)G)平滑。現(xiàn)在查看焊縫兩側(cè)的控制點(diǎn)。例如,以圍繞D的點(diǎn)C和點(diǎn)E為例。C和E形成一條直線,D正好位于中間。事實(shí)上,我們可以把從D到E的線段稱為D處的速度,或者VD
給定點(diǎn)D(焊縫)的位置和曲線在D處的速度VD,則C和E可計算為:
C = D - VD
E = D + VD
同樣,如果**VA**表示A處的速度,則B可計算為:
B = A + VA
因此,您應(yīng)該能夠看到,給定三次B樣條曲線焊縫處的位置和速度,我們可以省去所有其他控制點(diǎn),并在評估每個控制點(diǎn)時動態(tài)計算它們。以這種方式表示的三次B樣條(作為一組焊接位置和速度)稱為三次Hermite樣條(cube Hermite spline),有時簡稱為CSP線。cspline是制作平滑自然動畫的非常有用的工具。

Summary(總結(jié))

在本章中,你學(xué)習(xí)了一些對使用OpenGL創(chuàng)建3D場景至關(guān)重要的數(shù)學(xué)概念。即使你不能在頭腦中處理矩陣,你現(xiàn)在也知道什么是矩陣,以及如何使用它們來執(zhí)行各種變換。你還學(xué)習(xí)了如何構(gòu)造和操作表示觀察者和視口屬性的矩陣。現(xiàn)在,你應(yīng)該了解如何將對象放置在場景中,并確定如何在屏幕上查看它們。本章還介紹了參考系的強(qiáng)大概念,你看到了操作參考系并將其轉(zhuǎn)換是多么容易。

最后,我們介紹了本書附帶的vmath庫的使用。這個庫完全是用便攜式C++編寫的,它提供了一個方便的工具箱,可以與OpenGL一起使用各種數(shù)學(xué)和輔助程序。

令人驚訝的是,在這整章中,我們沒有涉及一個新的OpenGL函數(shù)調(diào)用。是的,這是數(shù)學(xué)章節(jié),如果你認(rèn)為數(shù)學(xué)只是公式和計算,你可能根本沒有注意到。向量和矩陣及其應(yīng)用對于能夠使用OpenGL渲染3D對象和世界至關(guān)重要。然而,需要注意的是,OpenGL并沒有將任何特定的數(shù)學(xué)約定強(qiáng)加給你,并且本身也不提供任何數(shù)學(xué)功能。如果你使用不同的三維數(shù)學(xué)庫,或者甚至使用自己的三維數(shù)學(xué)庫,你仍然會發(fā)現(xiàn)自己遵循本章中列出的模式來操作幾何體和三維世界。

總結(jié)

以上是生活随笔為你收集整理的卐 4-3D图形的数学的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

久久99视频免费观看 | 久久论理 | 色偷偷88888欧美精品久久久 | 五月天丁香视频 | 国产精品免费久久久久久久久久中文 | 日本九九视频 | 日韩精品专区在线影院重磅 | 夜夜嗨av色一区二区不卡 | 久久免费国产视频 | 国产成人一区二 | 天天操天天舔天天干 | 天天插综合 | 美女视频黄是免费的 | 亚洲精品高清一区二区三区四区 | 久久免费视频一区 | 天天人人 | 中文在线免费一区三区 | 久久人人爽人人 | av中文字幕网站 | 成人免费在线视频观看 | 日韩中文在线视频 | 国产精品美女视频 | 久久久久国产精品免费网站 | 成人av电影在线观看 | 欧美亚洲精品一区 | www.com黄色 | 国产日韩欧美在线观看 | 色a网 | 精品久久久影院 | 亚洲天堂网视频 | 黄色一级免费电影 | 国产精品久久久久久久久久直播 | 狠日日| 色干干 | 婷婷丁香激情 | 久久人人爽人人爽人人片av软件 | 日韩成片| 久久久久免费观看 | 亚洲成人精品影院 | 日韩成人黄色av | 一区二区视频在线播放 | 天天草天天干天天射 | 国产永久网站 | 久久不卡视频 | 国产99久久久国产精品免费二区 | 日本中文乱码卡一卡二新区 | 在线观看视频91 | 国产99自拍 | 又黄又爽又色无遮挡免费 | 中文字幕国产精品 | 国产在线高清视频 | 黄色在线观看网站 | 久久免费的精品国产v∧ | 人人爽人人爽人人片av | 成人av网站在线观看 | 国产中文字幕一区二区三区 | 国产精品女人网站 | 国产成人一区二区三区在线观看 | 亚洲精品欧美专区 | 国产一区二区精品 | 亚洲一区网 | 免费在线观看av网站 | 日韩大片在线看 | 国产高清一区二区 | 97色se| 黄p网站在线观看 | 欧美午夜精品久久久久久孕妇 | 成人黄色电影免费观看 | 不卡精品 | 不卡国产在线 | 日韩在线观看一区 | 欧美人牲 | 久久国产精品久久精品 | 一本一本久久a久久精品综合妖精 | 超碰精品在线 | 久久噜噜少妇网站 | 又黄又刺激 | 18国产精品白浆在线观看免费 | 久久中文字幕视频 | 日韩免费福利 | 国产精品久久久精品 | 日本视频网 | 色的网站在线观看 | 免费观看完整版无人区 | 亚洲日本在线视频观看 | 欧美久久久久久久久久久 | 深爱开心激情网 | 成人国产精品 | 伊人天堂网 | 亚洲精区二区三区四区麻豆 | 综合五月婷婷 | 丁香九月婷婷 | 久草视频在线新免费 | 五月婷婷影视 | 国产精品久久久久婷婷二区次 | 正在播放 国产精品 | 草久电影| 免费看黄在线网站 | 亚洲精品在线观看中文字幕 | 在线观看免费视频 | 亚洲成av片人久久久 | 中文字幕网站视频在线 | 999毛片| 99久久久久久久久久 | 国产99久久久国产精品免费二区 | 中国美女一级看片 | 99免费在线视频 | 欧美日韩三级在线观看 | 亚洲一区网 | 国产免费观看久久 | 亚洲视频 视频在线 | 99精品视频在线播放观看 | 亚洲乱码一区 | 91精品国自产在线 | 久久久久电影 | 亚洲成成品网站 | 日韩理论在线播放 | 久久久久激情视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 99久久电影 | 中文字幕黄色网 | 亚洲老妇xxxxxx | 精品久久一二三区 | 五月亚洲婷婷 | 色婷在线| 激情综合五月婷婷 | 亚洲免费在线视频 | 久久xx视频 | 久久久久| 91超碰在线播放 | 国产精品成人一区二区三区 | 婷婷久久五月天 | 久久免费毛片 | 五月婷婷综合在线观看 | 欧美激情精品久久久久久免费印度 | 日韩网站中文字幕 | 色综久久 | 精品久久久久一区二区国产 | 在线观看免费成人av | 色婷婷午夜 | 免费看搞黄视频网站 | 久久免费视频观看 | av成人在线网站 | 国产大陆亚洲精品国产 | 九九九九精品 | 婷婷色 亚洲 | 久久 地址 | 国产黄色片免费在线观看 | 在线天堂视频 | 日韩欧美精品在线 | 日韩一级黄色片 | 五月激情丁香图片 | 天天综合亚洲 | 国产 视频 久久 | 国产免费精彩视频 | 97人人精品 | 色网站在线免费 | 国产精品手机在线播放 | 国产在线视频不卡 | 在线播放亚洲 | 国产91电影在线观看 | 黄色国产成人 | 香蕉久草| 亚洲一区二区视频 | 日韩a欧美 | 麻豆视传媒官网免费观看 | 国产在线最新 | 久久久久久蜜桃一区二区 | 色在线最新 | 97精品超碰一区二区三区 | 欧美精品久 | 亚洲综合一区二区精品导航 | 欧美日韩久久一区 | 最近更新的中文字幕 | 国产精品入口a级 | 中文字幕日韩一区二区三区不卡 | 高清不卡一区二区在线 | 欧美亚洲久久 | 黄色av一区二区 | 91在线免费视频 | 久久一二三四 | 国产女人40精品一区毛片视频 | 亚洲男男gaygayxxxgv | 国产亚洲婷婷 | 成人av动漫在线观看 | 天天操天天操天天爽 | 97超碰在线免费 | 久久成年人 | 中文字幕大全 | 日日爽天天 | 久久免费99精品久久久久久 | 国产在线看 | 婷婷久月| 久久成人18免费网站 | 五月开心综合 | 免费h精品视频在线播放 | 美女av电影| 亚洲最大的av网站 | 成人黄色电影在线 | 亚洲国产中文字幕 | 黄色福利 | 91在线视频免费观看 | 久久中文视频 | 91九色蝌蚪国产 | 国产成人一区二区三区久久精品 | 亚洲免费色 | 亚洲欧洲成人精品av97 | 二区三区在线观看 | 天天草天天干天天 | 日韩视 | 男女靠逼app | 91香蕉视频好色先生 | 涩涩色亚洲一区 | 亚洲成人黄色网址 | 国产成人精品午夜在线播放 | www.久久色.com | 亚洲va韩国va欧美va精四季 | 最新三级在线 | 国产福利在线 | 西西人体4444www高清视频 | 国产专区精品 | 96久久久| 精品久久一区 | 亚洲视频aaa| 五月天av在线 | 亚洲免费色| 欧美精品久久久久 | av资源网在线播放 | 天堂av网址 | 免费成视频 | 黄色视屏在线免费观看 | 精品国产a | 久久精品直播 | 国产中文欧美日韩在线 | 色狠狠一区二区 | 国产精品免费久久久久久久久久中文 | 天天色播| 天天干天天拍天天操天天拍 | 丁香一区二区 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 午夜精品麻豆 | 天堂麻豆 | 国产在线观看网站 | 9在线观看免费高清完整版 玖玖爱免费视频 | 国语精品久久 | 久久久久久中文字幕 | 婷婷久久一区二区三区 | 成人毛片网| 国产美女黄网站免费 | 日本中文字幕在线视频 | 国产精品久久一区二区无卡 | 国内精品视频久久 | 国产成人精品日本亚洲999 | 国产精品嫩草69影院 | 91麻豆操| 国产成人精品亚洲精品 | 亚洲在线视频免费观看 | 中文字幕在线网址 | 亚洲精品国产综合99久久夜夜嗨 | 久久久久久国产精品免费 | 成年人在线视频观看 | 国产在线视频一区二区三区 | 天天射天天干 | 91福利小视频| 99久久久国产精品美女 | 日韩免费不卡视频 | 日韩区视频 | 欧美精品久久久久久久亚洲调教 | 一级a毛片高清视频 | 97国产精品一区二区 | 亚洲aⅴ免费在线观看 | 色婷婷免费视频 | 精品国产一区二区三区久久久久久 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 天天操夜操 | 91精品久久久久久久99蜜桃 | 国产91全国探花系列在线播放 | 色婷婷久久久综合中文字幕 | 一区二区视频在线播放 | 国产中文字幕视频在线观看 | 国产精品成人自产拍在线观看 | av女优中文字幕在线观看 | 亚洲电影一区二区 | 最新av在线播放 | 狠狠色丁婷婷日日 | 日韩精品91偷拍在线观看 | 久久99网| 九色最新网址 | 二区三区在线观看 | 久免费视频 | 香蕉久久国产 | 国产一区二区三区午夜 | a级免费观看 | 99 视频 高清 | 精品国产欧美一区二区三区不卡 | 97在线观看免费高清完整版在线观看 | 在线午夜 | 嫩模bbw搡bbbb搡bbbb | 久草视频在 | 精品国产一区二区三区日日嗨 | 高潮毛片无遮挡高清免费 | 久久久免费网站 | 四季av综合网站 | 丁香五月亚洲综合在线 | 婷婷深爱| 欧美日韩精品国产 | 国产99久久久国产精品免费二区 | 狠狠操狠狠操 | 成人av资源在线 | 亚洲伦理一区 | 国产高清免费av | 中文字幕视频 | 久久婷婷色综合 | 天天插天天干 | 青草草在线| 欧美尹人| 亚洲精品国产成人av在线 | 一区二区中文字幕在线 | 99精品偷拍视频一区二区三区 | 国产精品美女免费视频 | 香蕉色综合 | 亚洲三级在线免费观看 | 91成人在线观看喷潮 | 伊人宗合网 | 亚洲砖区区免费 | 天天玩天天干天天操 | 91九色视频在线观看 | 性色av一区二区三区在线观看 | 欧美三人交 | 五月天综合激情网 | 日韩成人欧美 | 国产亚洲精品免费 | 超碰在线国产 | 久久高清免费观看 | 中文字幕免费国产精品 | 99视频在线精品免费观看2 | 亚洲天堂在线观看完整版 | 中文免费在线观看 | 欧美性大战 | 国产精品免费久久久久久久久久中文 | 国产成人精品久久久久 | 丁香六月激情婷婷 | 日韩视频免费 | 国产色秀视频 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 干天天 | 亚洲视频久久久久 | 午夜精品一区二区三区视频免费看 | 天天爽天天射 | 黄色avwww | 黄色av成人在线观看 | 天天干天天拍天天操 | 亚洲人成免费网站 | 在线免费观看涩涩 | 成全在线视频免费观看 | 色黄视频免费观看 | 免费在线观看的av网站 | 福利网在线 | 九色在线 | 亚洲综合色激情五月 | 亚洲成人av免费 | 久久午夜电影网 | 91爱爱免费观看 | 久久亚洲美女 | 日韩精品一区二区三区在线视频 | 草久在线观看视频 | 在线观看日本高清mv视频 | 成人国产精品免费观看 | 亚洲成人资源在线观看 | 99久久久国产精品免费观看 | 五月婷婷一区二区三区 | 久久再线视频 | 五月激情六月丁香 | 国产精品成人在线观看 | 蜜臀久久99精品久久久无需会员 | 亚洲精品视频免费 | 日韩中文字幕亚洲一区二区va在线 | 欧美一区二区三区在线视频观看 | 99成人在线视频 | 99精品在线看 | 蜜桃传媒一区二区 | 欧美色图亚洲图片 | 久久精品亚洲一区二区三区观看模式 | 黄色小网站免费看 | 91天堂在线观看 | 狠狠狠色丁香综合久久天下网 | 91在线视频免费观看 | 国产成人在线免费观看 | www.色的| 人人舔人人爽 | 狠狠狠狠狠色综合 | 久久乐九色婷婷综合色狠狠182 | 日韩素人在线观看 | 日韩av在线高清 | 日韩三级精品 | 首页国产精品 | 9在线观看免费高清完整 | 狠狠做深爱婷婷综合一区 | 精品国产一区二区三区蜜臀 | 国产精品一区二区三区四 | 国产精品高清一区二区三区 | 成人网在线免费视频 | 国内精自线一二区永久 | 国产福利一区二区在线 | 在线观看一级视频 | 国产精品国产三级在线专区 | 国产一级免费在线 | 久久久国产电影 | 亚洲精色 | 久久久久一区 | 天天色天 | 国产精品久久久久久久久久久久久久 | av中文字幕网站 | av成人在线电影 | 日韩资源在线 | 亚洲成人av电影在线 | 日韩免费电影网站 | 中文字幕在线观看日本 | 久久久久久久久久久精 | 国产亚洲一区二区三区 | 缴情综合网五月天 | 亚洲日韩中文字幕在线播放 | 91精品视频一区二区三区 | 在线视频一区二区 | 亚洲毛片一区二区三区 | 在线精品一区二区 | 国产高清视频在线 | 日韩中文在线电影 | 日本中文字幕一二区观 | 国产二区免费视频 | 欧美性生交大片免网 | 主播av在线 | 91在线www | 国内三级在线观看 | 日日夜夜精品免费 | 国产黄色资源 | 激情中文在线 | 日韩高清免费在线 | 天天操福利视频 | 激情av资源| 在线视频观看你懂的 | 在线国产专区 | 久久久久久久久久久久久久av | 免费福利视频网站 | 国内精品毛片 | 久热av| 中文字幕电影一区 | 欧美国产日韩一区二区 | 久久综合免费视频 | 久草在线视频首页 | 中国一级特黄毛片大片久久 | 狠狠色丁香婷婷 | 99国产在线视频 | 免费日韩一级片 | 狠狠做深爱婷婷综合一区 | 久久9999久久| 国产成人av在线 | 亚洲一区二区视频在线播放 | 丝袜av一区 | 欧美成年人在线视频 | 亚洲午夜久久久影院 | 久久久久97国产 | 国产精品手机在线观看 | 九九久久国产精品 | 日日干 天天干 | 九色精品在线 | 国产精品欧美久久久久天天影视 | 激情影音先锋 | 亚洲激情中文 | 2023亚洲精品国偷拍自产在线 | 奇米先锋| 亚洲做受高潮欧美裸体 | 欧美色图p| 六月色丁香 | 99视频精品| 久久精品精品电影网 | 久久人人爽人人爽人人片av软件 | 一区二区三区久久精品 | 亚洲乱码国产乱码精品天美传媒 | 夜夜骑首页| 国产精品美乳一区二区免费 | 在线观看黄污 | 伊人看片| 人人干狠狠干 | 一级理论片在线观看 | 免费看亚洲毛片 | 久久精品理论 | 久久久午夜剧场 | 日日操网| 韩国av在线 | 婷婷久久一区二区三区 | 免费福利视频网站 | 久久久久成 | 高清国产午夜精品久久久久久 | 日批在线观看 | 国产无套精品久久久久久 | 激情av综合 | 久久特级毛片 | 香蕉视频免费在线播放 | 亚洲夜夜网| 干天天| www.69xx | 2024av| 天天操天天操天天操天天操天天操 | 狠狠搞,com| 一区 在线 影院 | 五月婷网站| 日韩av一卡二卡三卡 | 久久视频在线 | 中文字幕av影院 | 日韩另类在线 | 美州a亚洲一视本频v色道 | 在线视频区| 亚洲一区日韩 | 在线亚洲欧美日韩 | 国产精品久久久久久久久免费看 | 欧美一级欧美一级 | 亚洲国产精品视频 | 91在线国内视频 | 97视频免费在线观看 | 啪啪av在线| 97理论电影 | 日韩在线视频网址 | 国产福利在线免费观看 | 天天躁天天躁天天躁婷 | 91精品视频在线播放 | 日韩久久精品一区二区 | 日日夜夜天天综合 | 在线免费观看黄色 | 韩日视频在线 | 中文字幕丰满人伦在线 | 亚洲国产中文字幕 | 99精品国产成人一区二区 | 亚州国产视频 | 国产一区二区不卡视频 | 国产免费高清视频 | 国产精品永久免费 | 色婷婷五 | 久久男女视频 | 欧美日韩国产综合网 | 天天躁日日躁狠狠躁av中文 | 成年免费在线视频 | 欧美性生活小视频 | 九九热只有精品 | 精品国产一区二区三区四区在线观看 | 亚洲美女视频在线 | 亚洲高清在线观看视频 | 伊人国产在线观看 | 超级碰碰碰视频 | 韩日三级在线 | 久久网站最新地址 | 日韩久久久久 | 天天操天天干天天摸 | www久久久久 | 亚洲成人黄色av | 成人久久久久久久久久 | 精品国产乱子伦一区二区 | 国内一级片在线观看 | 久久免费一 | 日日夜夜添| 日日夜夜网站 | 亚洲伦理精品 | 大片网站久久 | 美女在线免费视频 | 国产精品原创 | 免费观看不卡av | 国产精品理论片 | 日韩欧美国产精品 | 日本亚洲国产 | 国产区免费在线 | 国产精品麻豆果冻传媒在线播放 | 国产一级二级av | 天天综合网天天 | 九九久久国产 | 成人国产综合 | 人人舔人人舔 | 色com网| 99国产精品视频免费观看一公开 | 精品国产美女 | 久久久久久久久久久福利 | 亚洲精品中文字幕视频 | 九九九热精品免费视频观看 | 国产亚洲无| 成人精品国产免费网站 | 日韩av高清 | 国产伦理精品一区二区 | 国产精品v a免费视频 | 日韩欧美高清在线观看 | 狠狠干在线播放 | 久久国产精品久久久 | 色永久免费视频 | 中文字幕资源在线 | 国产成人免费在线观看 | 夜夜操狠狠干 | 天天综合日 | 亚洲精品日韩一区二区电影 | 五月天婷婷在线观看视频 | 亚洲黄色精品 | 亚洲精品视频偷拍 | 一区二区三区日韩在线观看 | 福利一区视频 | 一区免费在线 | 国产一区二区精品 | 国产一级片视频 | 五月天色网站 | 中文字幕在线观看一区二区 | 久久久久高清 | 欧美久久久影院 | 在线免费观看视频一区 | 久久久久久久久久久久av | www.色综合.com| 午夜性色 | 99精品黄色片免费大全 | 久久精品第一页 | 国产精品美女久久久久久久久久久 | 欧美日韩国产精品一区二区亚洲 | 久草在线精品观看 | 欧美一级乱黄 | 免费日韩在线 | 99色精品视频 | 99久久综合狠狠综合久久 | 激情欧美在线观看 | 日韩精品久久中文字幕 | 97视频在线观看免费 | 国产伦理一区二区 | 日韩免费电影网 | 香蕉视频免费看 | 亚洲一区日韩在线 | 狠狠干五月天 | 91免费高清观看 | 美腿丝袜一区二区三区 | 波多野结衣一区三区 | 6699私人影院| 好看的国产精品视频 | 亚洲污视频| 成人av观看 | 久久av免费 | av亚洲产国偷v产偷v自拍小说 | 五月天六月丁香 | 久久专区| 不卡av在线免费观看 | 久久99热精品| 在线观看理论 | 中文字幕一区二区三区久久 | 亚洲在线视频免费观看 | 精品99在线视频 | 91av小视频 | 国产精品刺激对白麻豆99 | 欧美了一区在线观看 | 国产精品短视频 | 久久99精品国产99久久 | 婷婷在线网站 | 国产精品永久在线观看 | 亚洲精品在线二区 | 国产一级性生活 | 在线免费精品视频 | 天天综合网天天综合色 | www.夜夜操.com| 狠色狠色综合久久 | 亚洲在线黄色 | 五月综合色婷婷 | 91社区国产高清 | 最近中文字幕免费av | 精品在线视频一区二区三区 | 国产中出在线观看 | v片在线播放 | 丁香六月天 | 午夜视频99 | 日韩国产精品久久久久久亚洲 | 五月激情片 | 欧美成人精品在线 | 日日干天天操 | 九九在线高清精品视频 | 在线观看免费福利 | 日韩美女黄色片 | 日韩欧美精品一区 | 国产免费久久久久 | 国产精品视频最多的网站 | 国产一区在线视频 | 97精品国产aⅴ | 精品中文字幕在线观看 | 日韩午夜在线播放 | 欧美日韩精品免费观看视频 | 国产精品久久久毛片 | 久久艹在线观看 | 欧美日韩国产二区三区 | 成人一区二区三区在线观看 | h文在线观看免费 | 国内偷拍精品视频 | 99精品久久只有精品 | 欧美久久影院 | 999久久久免费视频 午夜国产在线观看 | 91丨九色丨勾搭 | 在线国产一区二区 | 丝袜+亚洲+另类+欧美+变态 | 色偷偷888欧美精品久久久 | 日韩精品久久中文字幕 | 少妇bbw搡bbbb搡bbb | 天天插天天狠 | 成人免费在线播放视频 | 美女在线免费视频 | 国产精品成人一区二区 | 91在线免费播放视频 | 欧美在线日韩在线 | 成人av电影在线 | 午夜视频亚洲 | 日韩理论电影在线观看 | 亚洲一区精品二人人爽久久 | 亚洲精品国产成人 | 99视频在线观看免费 | 国产又粗又猛又色又黄网站 | 日本h在线播放 | 中文字幕在线观看你懂的 | 天天透天天插 | 综合网在线视频 | 欧美精品久久久久久久免费 | 日韩伦理一区二区三区av在线 | 成片人卡1卡2卡3手机免费看 | 黄色成品视频 | 国产精品入口麻豆www | 欧美一级欧美一级 | 人人干人人草 | 天天操天天谢 | 深夜国产福利 | 欧美久久电影 | 亚洲婷婷在线 | 不卡的av电影在线观看 | 91精品久久久久久久99蜜桃 | 亚洲一区 影院 | 国产精品高潮呻吟久久av无 | 黄色av网站在线免费观看 | 91视频亚洲 | 日韩精品免费在线播放 | 成人av在线网址 | 日韩亚洲在线 | 中文av不卡 | 欧美日韩国产三级 | 丁香婷婷深情五月亚洲 | 婷婷色六月天 | 日韩欧美在线观看一区二区 | 日韩视频二区 | 欧美五月婷婷 | 亚洲精品在线免费观看视频 | 久久se视频 | 日韩欧美99 | 中文字幕视频三区 | 免费精品国产 | 中文字幕在线观看第二页 | bbbb操bbbb | 五月天激情综合网 | 日本福利视频在线 | 精品亚洲视频在线观看 | 久久综合福利 | 国产美女黄网站免费 | 亚洲一级二级三级 | 亚洲一区 av | 五月天电影免费在线观看一区 | 国产在线自 | 24小时日本在线www免费的 | 精品一区二区在线免费观看 | 在线观看aa | 久久成人综合 | a级国产乱理论片在线观看 特级毛片在线观看 | 天天操天天添 | 狠狠网 | 色综合久久久久综合 | 一级特黄aaa大片在线观看 | 欧美资源 | 久久精品美女视频 | 久久精品免费观看 | 国产明星视频三级a三级点| 香蕉在线播放 | 婷婷丁香激情综合 | 六月激情 | a视频在线看| 国产精品99久久久久久久久 | 91精品在线免费 | 99精品观看 | 日韩在线免费小视频 | 免费男女羞羞的视频网站中文字幕 | 国产精品私人影院 | 黄色片软件网站 | 久久国产精品精品国产色婷婷 | 日日躁夜夜躁aaaaxxxx | 欧美a级免费视频 | 亚洲一区二区精品 | 黄色在线免费观看网址 | 欧美一区在线观看视频 | 日韩中文免费视频 | 久久久这里有精品 | 日韩中文字幕国产精品 | 激情五月亚洲 | 久久久精品国产一区二区 | 五月综合| 91亚洲影院 | 国产精品大全 | 欧美精品中文字幕亚洲专区 | 精品国产一二三 | 激情综合网五月婷婷 | 日韩资源在线 | 青青射 | 国产日本在线播放 | 在线亚洲欧美日韩 | 久久久精品成人 | 亚洲永久字幕 | 亚洲人成人99网站 | 亚洲激情影院 | 男女啪啪网站 | 伊人电影在线观看 | 女人魂免费观看 | 国产精品1区2区在线观看 | 日本中文字幕在线 | 欧美一级欧美一级 | 在线亚洲日本 | 亚洲视频一区二区三区在线观看 | www.天天草 | 国产精品四虎 | 色综合久久88色综合天天6 | 色妞色视频一区二区三区四区 | 国产精品观看在线亚洲人成网 | 久久观看| 午夜.dj高清免费观看视频 | 久久免费看av | 中文字幕av网站 | 中文字幕视频播放 | 91九色老| 超碰人人草人人 | 久久精品久久99精品久久 | 99久久夜色精品国产亚洲96 | 在线成人国产 | 国产精品av免费观看 | 久久久久久网站 | 欧美精品天堂 | 91精品天码美女少妇 | 中文字幕av电影下载 | 国产亚洲精品免费 | 久久伊人综合 | 日日夜夜精品免费观看 | 久久久婷| 国产五十路毛片 | 色狠狠久久av五月综合 | 一区二区三区四区免费视频 | www久久99| 中文字幕中文字幕中文字幕 | av一本久道久久波多野结衣 | 中文字幕在线一区观看 | 色偷偷网站视频 | 中文字幕人成乱码在线观看 | 欧美一区二区三区激情视频 | 久久综合免费 | 日韩一级片大全 | 免费av福利 | 九九色在线观看 | 高清av免费看 | 亚洲欧洲国产精品 | 亚洲不卡av一区二区三区 | 久久国产一区二区 | 日韩亚洲在线观看 | 日韩在线观看三区 | 亚州精品在线视频 | 亚洲a在线观看 | 欧美精品久久久 | 国产尤物一区二区三区 | 欧美老人xxxx18 | www.xxxx欧美 | 美女视频一区二区 | 国产专区在线播放 | 一区二区三区国产精品 | 性色av免费在线观看 | 99色在线观看 | 国产视频91在线 | 丁香午夜 | 激情av网| 一级黄色在线免费观看 | 天天摸天天操天天爽 | 亚洲精品在线观看免费 | www.久久久精品 | av看片在线观看 | 天堂av高清 | 天天操天天添 | 国产色视频 | 免费视频xnxx com | 午夜在线看 | 99久久久久国产精品免费 | 亚洲午夜不卡 | 欧美网站黄色 | 国产在线看| 久久艹在线观看 | 亚洲一级理论片 | 天天色天天射综合网 | 超碰在线9| 中文字幕色在线 | 91人人爽久久涩噜噜噜 | 在线亚洲成人 | 免费在线观看日韩 | 丝袜美女在线 | 日本在线观看视频一区 | 久久久在线视频 | 97日日碰人人模人人澡分享吧 | 久久99精品国产麻豆宅宅 | 中文字幕一区2区3区 | 91大神一区二区三区 | 国产黑丝一区二区三区 | 91视频 - 114av| 欧美国产精品一区二区 | 黄色大片av | 91原创在线观看 | 黄网站色 | 日日干天天插 | 国产午夜精品久久 | 国产黄色电影 | 午夜视频亚洲 | 国产在线成人 | 午夜美女福利 | 91在线亚洲 | va视频在线观看 | 亚洲免费精品视频 | 成人av高清在线 | www.夜夜爱 | 国产馆在线播放 | 亚洲国产日本 | 99精品一区 | 日韩av一区二区在线影视 | 久久99久久99精品免观看粉嫩 | 黄色的片子 | 亚洲精品国产精品久久99热 | 久久综合九色综合欧美就去吻 | 99九九热只有国产精品 | 精品不卡视频 | 欧美精品一区二区在线播放 | 天堂av在线免费观看 | 中国一级片视频 | 精品国产1区二区 | 久久精品久久久久电影 | 日日夜夜精品免费观看 | 欧美日韩不卡一区二区三区 | 精品久久久久久久久久久久久久久久久久 | 操高跟美女 | 香蕉成人在线视频 | 日日天天干 | 1024手机看片国产 | 亚洲更新最快 | 成人97人人超碰人人99 | 91看片一区二区三区 | 色综合久久久久综合99 | 丁香久久五月 | 丝袜精品视频 | 精品国产一区二区三区久久影院 | 色偷偷88888欧美精品久久久 | 97国产人人 | av在线h | 有码中文字幕在线观看 | 国产精品区免费视频 | 日日干天天爽 | 久久婷婷开心 | 国产99色| 综合精品久久 | 国产999精品久久久 免费a网站 | 91天天视频 | 国产成人黄色网址 | 国内精品久久久久久久久久久久 | 99精品视频在线播放免费 | 99视频| 91九色在线视频 | 狠狠色丁香婷婷综合橹88 | 久久久99精品免费观看乱色 | 国产精品久久99综合免费观看尤物 | 天天做日日做天天爽视频免费 | 欧美人操人 | 最近中文字幕免费观看 | 91麻豆精品一区二区三区 | 欧美韩国日本在线 | 国产成人高清 | 国产五十路毛片 | 日本久久久久久久久久久 | 综合色亚洲 | 亚洲激精日韩激精欧美精品 | 成人免费在线观看电影 | 午夜色性片 | 精品亚洲网 | 香蕉97视频观看在线观看 | 中文字幕激情 | 天堂va欧美va亚洲va老司机 | 97成人精品视频在线观看 | 中文在线8新资源库 | 日韩有码欧美 | 九九热精品视频在线播放 | 国产乱码精品一区二区蜜臀 | 美女视频是黄的免费观看 | 免费视频久久久久久久 | 黄色一级大片在线免费看产 | 99久久精品电影 | 手机在线黄色网址 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | www色,com| 亚洲一区二区精品视频 | 正在播放 国产精品 | 日韩av免费在线电影 |