#include <GL/glut.h>
//定義控制點(diǎn)points
GLfloat ctrlpoints[4][4][3] = {
{ {1.0,2.4,0.8},{1.1,0.6,0.4}, {1.2,0.2,0.0},{2.0,-1.0,0.4}},//points0
{ {2.6,1.0,0.8},{2.8,-0.4,0.4},{3.0,-0.8,0.0},{3.8,-1.6,0.4}},//points1
{ {5.2,1.0,0.0},{5.4,-0.4,0.0},{5.6,-0.8,0.0},{6.4,-1.6,0.0}},//points2
{ {7.4,2.4,0.0},{7.4,0.6,0.0},{7.8,0.2,0.0},{8.8,-0.6,0.2}} //points3
};
/* Nurbs曲面的對象指針 */
GLUnurbsObj *theNurb;
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//清楚顏色緩沖
glColor3f(0.0, 0.0, 0.0);
//glPushMatrix()和glPopMatrix()的配對使用可以消除上一次的變換對本次變換的影響
glPushMatrix();
//繪制控制線
glLineWidth(1.5f); //設(shè)置線寬1.5
glColor3f(0.0, 0.0, 1.0); //設(shè)置線顏色為藍(lán)色
for (int i = 0; i < 4; i++)
{
//設(shè)置類型為連續(xù)直線
glBegin(GL_LINE_STRIP);
//繪制列向的控制線
for (int j = 0; j < 4; j++)
glVertex3fv(ctrlpoints[i][j]);
glEnd();
//繪制橫向的控制線
glBegin(GL_LINE_STRIP);
for (int j = 0; j < 4; j++)
glVertex3fv(ctrlpoints[j][i]);
glEnd();
}
//繪制控制點(diǎn)
glPointSize(5.0f); //設(shè)置點(diǎn)的大小為5.0
glColor3f(1.0, 0.0, 0.0); //設(shè)置點(diǎn)顏色為紅色
glBegin(GL_POINTS); //模式為POINTS
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
glVertex3fv(ctrlpoints[i][j]);
}
}
glEnd();
//繪制B樣條控制曲面
GLfloat knots[8] = { 0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0 }; //B樣條控制向量
glLineWidth(1.0f); //設(shè)置線寬為1.0
glColor3f(0.0, 0.0, 0.0); //線的顏色為黑色
/* 創(chuàng)建一個Nurbs曲面的對象 并返回一個指向這個新對象的指針 */
theNurb = gluNewNurbsRenderer();
/* 設(shè)置該對象的屬性 */
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_OUTLINE_POLYGON);
gluBeginSurface(theNurb);//開始繪制
gluNurbsSurface(theNurb, //NURBS曲面對象
8, knots, //u向節(jié)點(diǎn)數(shù)目和節(jié)點(diǎn)數(shù)組指針
8, knots, //v向節(jié)點(diǎn)數(shù)目和節(jié)點(diǎn)數(shù)組指針
4 * 3, //u向的跨度 列優(yōu)先保存 t_stride = 4 * s_count
3, //v向的跨度
&ctrlpoints[0][0][0], //曲面控制點(diǎn)指針
4, 4, //u方向弟头、v方向階數(shù)
GL_MAP2_VERTEX_3 //曲面的類型
);
gluEndSurface(theNurb); //結(jié)束繪制
for (int j = 0; j <= 8; j++)
{
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)i / 30.0, (GLfloat)j / 8.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 30; i++)
glEvalCoord2f((GLfloat)j / 8.0, (GLfloat)i / 30.0);
glEnd();
}
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h); /* 設(shè)置觀察窗口的大小 */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* 設(shè)置正投影, 6個參數(shù)分別表示, 左修剪平面坐標(biāo), 右修剪平面坐標(biāo),
下修剪平面坐標(biāo), 上修剪平面坐標(biāo), 近修剪平面坐標(biāo), 遠(yuǎn)修剪平面坐標(biāo) */
glOrtho(0.0, 10.0, -5.0 * (GLfloat)h / (GLfloat)w,
5.0 * (GLfloat)h / (GLfloat)w, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
//激活該曲面函數(shù)
glEnable(GL_MAP2_VERTEX_3);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB |
GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
OpengGL B樣條曲面繪制
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朱躺,“玉大人搁痛,你說我怎么就攤上這事÷渥罚” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵巢钓,是天一觀的道長疗垛。 經(jīng)常有香客問我,道長贷腕,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任瞒斩,我火速辦了婚禮,結(jié)果婚禮上胸囱,老公的妹妹穿的比我還像新娘瀑梗。我一直安慰自己,他們只是感情好抛丽,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允蜈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陷寝。 梳的紋絲不亂的頭發(fā)上凤跑,一...
- 文/蒼蘭香墨 我猛地睜開眼叫胁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了驼鹅?” 一聲冷哼從身側(cè)響起,我...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡哼绑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年抖韩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂浮。...
- 正文 年R本政府宣布熊痴,位于F島的核電站聂宾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏系谐。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一惜论、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馆类,春花似錦、人聲如沸乾巧。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽植康。三九已至,卻和暖如春销睁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冻记。 一陣腳步聲響...
- 正文 我出身青樓葛虐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親屿脐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 介紹如何使用畫筆工具手動繪制樣條曲線 Cinema 4d功能詳解全集地址:Cinema4D功能詳解 更多視頻教程請...
- https://www.cnblogs.com/icmzn/p/5100761.html 基函數(shù) 這里討論B-sp...
- 概述 B-樣條曲線愧捕,是B-樣條基函數(shù)的線性組合,是貝塞爾曲線的一般化次绘。給定n+1個控制點(diǎn),P0,P1, ..., ...
- 在醫(yī)學(xué)研究中,我們經(jīng)常構(gòu)建回歸模型來分析自變量和因變量之間的關(guān)系廉涕。事實上,大多數(shù)的回歸模型有一個重要的假設(shè)就是自變...
- points 為要插值的樣條曲線型值點(diǎn)數(shù)組fitPoints 為插值后的樣條曲線型值點(diǎn)數(shù)組