OpenGL NURBS 曲面
Posted
技术标签:
【中文标题】OpenGL NURBS 曲面【英文标题】:OpenGL NURBS surfaces 【发布时间】:2018-12-26 15:33:59 【问题描述】:我正在实现 NURBS 曲面。我想要的只是在每次鼠标点击时 Y 轴上都有减量,所以看起来有太阳或其他行星的重量。
#include <stdlib.h>
#include <glut.h>
int PI = 3.145;
int y = 0;
我在这里尝试做同样的事情,但输出没有变化
void myMouse(int button, int state, int x, int y)
if (state == GLUT_LEFT_BUTTON && GLUT_DOWN)
y++;
glutPostRedisplay();
代码在这里继续
GLfloat ctrlpoints[4][4][3] =
-3.5, 1.0, -4.5, -0.5, 1.0,-4.5 , 0.5, 1.0, -4.5 , 3.5, 1.0,-4.5,
-3.5, 1.0, -0.5, -0.5, -2.0 - y,-0.5 , 0.5, -2.0 - y, -0.5 , 3.5, 1.0,-0.5,
-3.5, 1.0, 0.5, -0.5, 1.0, 0.5 , 0.5, 1.0, 0.5 , 3.5, 1.0, 0.5,
-3.5, 1.0, 4.5, -0.5, 1.0, 4.5 , 0.5, 1.0, 4.5 , 3.5, 1.0, 4.5
;
void Sun()
glPushMatrix();
glTranslatef(0, 1, 0);
glRotatef(2*PI, 1, 0, 0);
glutSolidSphere(0.5, 20, 20);
glPopMatrix();
void display(void)
int i, j;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
glPushMatrix();
glRotatef(45.0, 1.0, 1.0, 1.0);
for (j = 0; j <= 30; j++)
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 100; i++)
glEvalCoord2f((GLfloat)i / 100.0, (GLfloat)j / 30.0);
glEnd();
glBegin(GL_LINE_STRIP);
for (i = 0; i <= 100; i++)
glEvalCoord2f((GLfloat)j / 30.0, (GLfloat)i / 100.0);
glEnd();
glPopMatrix();
glPushMatrix();
glColor3f(1, 1, 0);
Sun();
glPopMatrix();
glFlush();
void init(void)
glClearColor(1.0, 1.0, 1.0, 0.0);
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
void reshape(int w, int h)
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0*(GLfloat)h / (GLfloat)w, 5.0*(GLfloat)h / (GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0*(GLfloat)w / (GLfloat)h, 5.0*(GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
int main(int argc, char** argv)
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(myMouse);
Sun();
glutMainLoop();
return 0;
这是我当前对该代码的硬编码输出,我希望每次单击鼠标按钮时都在 y 轴上递减:
【问题讨论】:
【参考方案1】:ctrlpoints
是一个全局变量。一旦它被初始化,它只能通过赋值来改变。变量y
没有神奇的动态依赖。
您必须通过分配更改ctrlpoints
的字段。修改ctrlpoints
的内容后,需要重新定义二维求值器。
当按下鼠标左键时,正确的条件是button == GLUT_LEFT_BUTTON && state == GLUT_DOWN
。
注意由于y
是myMouse(int button, int state, int x, int y)
的函数签名中的形式参数的名称,y ++
(在myMouse
内)不会改变全局变量y
的值,但它将更改参数y
的值。
添加函数initMap
并更改函数myMouse
和init
如下:
void initMap(void)
glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);
glEnable(GL_MAP2_VERTEX_3);
glMapGrid2f(20, 0.0, 1.0, 20, 0.0, 1.0);
void myMouse(int button, int state, int px, int py)
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
ctrlpoints[1][1][1] -= 1.0f;
ctrlpoints[1][2][1] -= 1.0f;
initMap();
glutPostRedisplay();
void init(void)
//glClearColor(1.0, 1.0, 1.0, 0.0);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
initMap();
预览:
【讨论】:
以上是关于OpenGL NURBS 曲面的主要内容,如果未能解决你的问题,请参考以下文章