MouStudio分享 http://blog.sciencenet.cn/u/moustudio 一目半行,再目半行

博文

Captain Dialog 2009-06-04 OpenGL坐标系实验

已有 5909 次阅读 2009-6-3 23:09 |个人分类:编程笔记|系统分类:科研笔记| 三维编程开发, OpenGL, 坐标转换

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();

}



https://blog.sciencenet.cn/blog-244606-235948.html

上一篇:Captain Dialog 2009-06-02 调味生活---BB印章记
下一篇:Captaion Dialog 2009-06-05 GeoEM开发之C#一维绘图控件升级
收藏 IP: .*| 热度|

0

发表评论 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-9-2 14:18

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部