3 8 一些組合變換的例子

2021-06-29 08:53:30 字數 3319 閱讀 5923

這一小節主要是兩個例子:建立太陽系模型,建立機械人手臂。

這兩個例子,主要用來講解如何對檢視模型進行變換。

/*

* planet.c

* this program shows how to composite modeling transformations

* to draw translated and rotated models.

* interaction: pressing the d and y keys (day and year)

* alters the rotation of the planet around the sun.

*/#include

#include

static

int year = 0, day = 0;

void init(void)

void display(void)

void reshape(int w, int h)

/* argsused1 */

void keyboard(unsigned

char key, int x, int y)

}int main(int argc, char** argv)

上述程式,按住字母d鍵,小球就會自己旋轉,按住字母y鍵,小球就會繞太陽旋轉。

主要**如下:

glutwiresphere(1.0, 20, 16);   /* draw sun */

glrotatef((glfloat)year, 0.0, 1.0, 0.0);

gltranslatef(2.0, 0.0, 0.0);

glrotatef((glfloat)day, 0.0, 1.0, 0.0);

glutwiresphere(0.2, 10, 8); /* draw smaller planet */

先繪製乙個太陽。接下來,有3個操作,旋轉,平移,旋轉。根據之前的學習,最先作用於物體的是 最後乙個旋轉,即day對應的旋轉,繞著y軸(0.0, 1.0, 0.0),這相當於乙個物體本身旋轉day度, 接著平移,這個物體沿x方向平移2個單位,最後又旋轉,這個物體繞原點(即太陽所在的點)旋轉,旋轉角度為year,旋轉軸為y軸。這樣就有了我們看到的效果了。

/*

* robot.c

* this program shows how to composite modeling transformations

* to draw translated and rotated hierarchical models.

* interaction: pressing the s and e keys (shoulder and elbow)

* alters the rotation of the robot arm.

*/#include

#include

static

int shoulder = 0, elbow = 0;

void init(void)

void display(void)

void reshape (int w, int h)

/* argsused1 */

void keyboard (unsigned

char key, int x, int y)

}int main(int argc, char** argv)

這段**的執行效果如下:

按下s旋轉整個手臂,按下e鍵旋轉前半段手臂。

主要**是繪製第一段手臂和第二段手臂。

gltranslatef(-1.0, 0.0, 0.0);

glrotatef((glfloat)shoulder, 0.0, 0.0, 1.0);

gltranslatef(1.0, 0.0, 0.0);

glpushmatrix();

glscalef(2.0, 0.4, 1.0);

glutwirecube(1.0);

glpopmatrix();

同樣的道理,最後出現的操作,最先作用於物體。最先是對物體進行縮放,glscalef(2.0, 0.4, 1.0), x,y,z方向,分別縮放2.0, 0.4, 1.0這樣,glutwirecube就不再是乙個立方體了,而變成了長方體。然後這個縮放,由於是放在glpushmatrix和glpopmatrix中,所以,縮放不對原來的座標系產生影響。

然後,gltranslatef(1.0, 0.0, 0.0);這個長方體,進行平移,向x軸方向平移乙個單位,這樣的話,座標原點就位於長方體的左端了。如下圖所示。剛開始,座標原點位於長方體中心,現在,由於物體向右平移了乙個單位,所以原點位於長方體左端。

接著,glrotatef((glfloat)shoulder, 0.0, 0.0, 1.0); 物體繞經過原點的z軸旋轉shoulder度,由於z軸指向螢幕外,所以旋轉之後的結果就是這樣的。

最後,gltranslatef(-1.0, 0.0, 0.0); 又對物體進行移動,沿x軸移動-1.0個單位,所以其實就是將座標系原點,又移回物體中心。

gltranslatef(1.0, 0.0, 0.0);

glrotatef((glfloat)elbow, 0.0, 0.0, 1.0);

gltranslatef(1.0, 0.0, 0.0);

glpushmatrix();

glscalef(2.0, 0.4, 1.0);

glutwirecube(1.0);

glpopmatrix();

同樣的,先對物體進行縮放,得到乙個長方體。

然後將物體沿x軸平移乙個單位,相對於這個物體的座標原點移動到了物體的左端。

然後在旋轉elbow角度,繞z軸,這個原理和第乙個一樣的。

最後再平移乙個單位,這個其實就是將第二個物體的座標原點,移動到和第乙個物體座標原點重合的位置。

好了,其他就沒啥了。

crontab 的一些例子

1.這個可以的,bi weekly的task 00 08 3 home user user.script 然後在script的開始寫上 if expr date w 2 0 then exit fi2.每個月第一周的週三 bin bash date date d if date le 7 then ...

DCT變換的一些知識

dct將運動補償誤差或原畫面資訊塊轉換成代表不同頻率分量的係數集,這有兩個優點 其一,訊號常將其能量的大部分集中於頻率域的1個小範圍內,這樣一來,描述不重要的分量只需要很少的位元數 其二,頻率域分解映 人類視覺系統的處理過程,並允許後繼的 量化過程滿足其靈敏度的要求。關於這一點在我手頭的教程中有詳盡...

一些基礎的執行緒例子

1.建立執行緒的方式 繼承thread類和實現runnable介面。下面這個例子是通過繼承類的方式建立執行緒的。packagemythread public classthread1extendsthread public static voidmain string args 上面的 建立了兩個執...