opengl 绘制颜色渐变的面的问题

wangliang1994 2017-02-25 09:22:18
opengl绘制颜色渐变的面时,x方向有渐变的效果,y方向就没有颜色渐变的效果,原因应该在绘制面的三角形的语句上:glVertex3f(x, y , getHeight[x][y]);glVertex3f(x, y+1, getHeight[x][y+1]);(注:x,y是横纵坐标,getHeight[x][y]是随机的高度场,生成的是一个随机的三维曲面)使用的是这两句,哪位大侠指点一下可以让y方向也有颜色渐变的效果呢?生成的效果图是这样的:
...全文
557 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-02-26
  • 打赏
  • 举报
回复
上面的show改为
void show()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下
glLoadIdentity(); //将当前矩阵设置为单位矩阵
//
glBegin(GL_POLYGON);
glColor4f(0.0f,1.0f,0.0f,1.0f);// green
glVertex2f(450.0f,400.0f); // .
glColor4f(1.0f,0.0f,0.0f,1.0f);// red
glVertex2f(100.0f,50.0f); // .
glColor4f(0.0f,0.0f,1.0f,1.0f);// blue
glVertex2f(450.0f,50.0f); // .
glEnd();
glFlush();
}
wangliang1994 2017-02-26
  • 打赏
  • 举报
回复
引用 1 楼 wangyaninglm 的回复:

用到的思路就是在应力的最大值和最小值之间划分区间,每个区间的标识点对应不同的颜色值。
然后在区间内的应力值对应的颜色就进行插值来计算。

代码如下:
#include <GL/glut.h>
#include <iostream>
#include <cmath>
using namespace std;
const GLsizei width=640;
const GLsizei height=480;//设置窗口的宽和高

void myInit()
{
	glClearColor(0,0,0,0);
}


void show()
{
	GLsizei dw;
	int n,i;
	dw=2;
	n=(width-1)/dw;
	cout<<"n="<<n<<endl;
	glClear(GL_COLOR_BUFFER_BIT);
	GLsizei r,g,b;
	for (i=0;i<n;i++)
	{
		//绘制应力云图的关键就是下面的这五种不同的颜色对应关系
		//根据自己需要可以设置不同的等级,四种也是可以的
		if (i>=0&&i<=n/5)
		{
			r=255;
			g=i*255/(n/5);
			b=0;
		}
		else if (i>n/5&&i<=2*n/5)
		{
			r=255-(i-n/5)*255/(n/5);
			g=255;
			b=0;
		}
		else if(i>2*n/5&&i<=3*n/5)
		{
			r=0;
			g=255;
			b=(i-2*n/5)*255/(n/5);
		}
		else if(i>3*n/5&&i<=4*n/5)
		{
			r=0;
			g=255-(i-3*n/5)*255/(n/5);
			b=255;
		}
		else
		{
			r=(i-4*n/5)*255/(n/5);
			g=0;
			b=255;
		}
		glColor3f(r/255.0f,g/255.0f,b/255.0f);
		glRectf(1.0*i*dw,0.0,1.0*(i+1)*dw,height);
	}
	glFlush();
}
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0,w,0,h,-100,100);//设置视野的范围,(左,右,上,下,前,后)
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc,char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(width,height);
	glutCreateWindow("应力云图绘制");
	myInit();
	glutDisplayFunc(show);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}


】 这个例子画出几个矩形,然后让颜色渐变,我那个是好多点连成面,形成的效果就是单方向上有颜色渐变的效果,是不是那两个语句出问题了呢?可否指点一下,非常感谢
shiter 2017-02-25
  • 打赏
  • 举报
回复

用到的思路就是在应力的最大值和最小值之间划分区间,每个区间的标识点对应不同的颜色值。
然后在区间内的应力值对应的颜色就进行插值来计算。

代码如下:
#include <GL/glut.h>
#include <iostream>
#include <cmath>
using namespace std;
const GLsizei width=640;
const GLsizei height=480;//设置窗口的宽和高

void myInit()
{
	glClearColor(0,0,0,0);
}


void show()
{
	GLsizei dw;
	int n,i;
	dw=2;
	n=(width-1)/dw;
	cout<<"n="<<n<<endl;
	glClear(GL_COLOR_BUFFER_BIT);
	GLsizei r,g,b;
	for (i=0;i<n;i++)
	{
		//绘制应力云图的关键就是下面的这五种不同的颜色对应关系
		//根据自己需要可以设置不同的等级,四种也是可以的
		if (i>=0&&i<=n/5)
		{
			r=255;
			g=i*255/(n/5);
			b=0;
		}
		else if (i>n/5&&i<=2*n/5)
		{
			r=255-(i-n/5)*255/(n/5);
			g=255;
			b=0;
		}
		else if(i>2*n/5&&i<=3*n/5)
		{
			r=0;
			g=255;
			b=(i-2*n/5)*255/(n/5);
		}
		else if(i>3*n/5&&i<=4*n/5)
		{
			r=0;
			g=255-(i-3*n/5)*255/(n/5);
			b=255;
		}
		else
		{
			r=(i-4*n/5)*255/(n/5);
			g=0;
			b=255;
		}
		glColor3f(r/255.0f,g/255.0f,b/255.0f);
		glRectf(1.0*i*dw,0.0,1.0*(i+1)*dw,height);
	}
	glFlush();
}
void reshape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0,w,0,h,-100,100);//设置视野的范围,(左,右,上,下,前,后)
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc,char *argv[])
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(width,height);
	glutCreateWindow("应力云图绘制");
	myInit();
	glutDisplayFunc(show);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}


19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧