|||
OpenGL坐标系实验 Captain Dialog 2009-06-04
最近接触到OpenGL三维绘图的程序了,其中感觉最让人头晕的就是OpenGL中的那些个坐标以及他们之间的关系。搜索半天资料也是看个一知半解。最后还是决定自己通过实验系统来确认一下这些坐标系的转换关系。
今天主要测试了从 世界坐标系 -> 规格化设备坐标系 的实验。通常实验OpenGL的绘图方式有多种,在不经过规格化坐标系的坐标变换的情况下,可以修改投影的参数达到视点坐标系的缩放,同样是达到了坐标系转换的效果,But这种缩放在处理变化的灵活性方面欠妥。但是,教材中经常用到得实例都是基于规格化坐标系的,即坐标变化范围为[-1.0,1.0]。因此决定对此进行一个实验,验证可以对实际的三维坐标点数据进行坐标系转换后绘图。
下面是实验的结果图
针对实际3D和4D的数据绘制,将在以后的学习中继续各种实验和总结。
部分源代码:
//绘制测点数据集
void COpenGL3D::drawSurveyPointMap()
{
//测试测点数据输入
CSurveyPoint ps[3];
ps[0].x=50;
ps[0].y=200;
ps[0].z=80;
ps[1].x=100;
ps[1].y=100;
ps[1].z=90;
ps[2].x=70;
ps[2].y=200;
ps[2].z=190;
//数据分析
GLfloat iMax_X,iMax_Y,iMax_Z;
GLfloat iMin_X,iMin_Y,iMin_Z;
iMax_X=iMax_Y=iMax_Z=-99999;
iMin_X=iMin_Y=iMin_Z=99999;
for(int i = 0; i < 3; i++)
{
if(iMax_X<ps[i].x) iMax_X=ps[i].x;
if(iMax_Y<ps[i].y) iMax_Y=ps[i].y;
if(iMax_Z<ps[i].z) iMax_Z=ps[i].z;
if(iMin_X>ps[i].x) iMin_X=ps[i].x;
if(iMin_Y>ps[i].y) iMin_Y=ps[i].y;
if(iMin_Z>ps[i].z) iMin_Z=ps[i].z;
}
//坐标转换测试
GLfloat fMin_DC,fMax_DC;
fMin_DC=-1.0;
fMax_DC=1.0;
GLfloat sX,sY,sZ;
sX = (fMax_DC - fMin_DC) / (iMax_X - iMin_X);
sY = (fMax_DC - fMin_DC) / (iMax_Y - iMin_Y);
sZ = (fMax_DC - fMin_DC) / (iMax_Z - iMin_Z);
//数据归一化[ fMin_DC,fMax_DC]
glClear(GL_COLOR_BUFFER_BIT);
gluLookAt(1.0,1.0,0.50,0.0,0.0,0.0,0.0,1,0.0);
//glDepthRange(0,1);
for(int j = 0; j < 3; j++)
{
ps[j].x = (ps[j].x - iMin_X)*sX + fMin_DC;
ps[j].y = (ps[j].y - iMin_Y)*sY + fMin_DC;
ps[j].z = (ps[j].z - iMin_Z)*sZ + fMin_DC;
ps->drawPoint(0.03,ps[j].x,ps[j].y,ps[j].z);
}
//绘制坐标轴
glBegin(GL_LINES);
glColor3f(1.0,0,0);
glVertex3f(-1.0,0,0);
glVertex3f(1.0,0,0);
glEnd();
glBegin(GL_LINES);
glColor3f(0.0,1.0,0);
glVertex3f(0,-1.0,0);
glVertex3f(0,1.0,0);
glEnd();
glBegin(GL_LINES);
glColor3f(0,0,1.0);
glVertex3f(0,0,-1.0);
glVertex3f(0,0,1.0);
glEnd();
glFlush();
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-2 14:18
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社