我要发帖 回复

正式会员

1

主题

37

积分

0

专家分

:

私信
发表时间 : 2008-12-6 23:21:09 | 浏览 : 3599    评论 : 10
目前做一个课题,将一光斑用三维模型显示出来,于是考虑用opengl实现,可是刚入门,遇到了很多问题,来向各位高手请教!
光斑是一个二维的灰度图像,因此我先把它的灰度值读取出来,取了100*100的矩阵,也就是三维显示的时候x=0,1,2,...100;y=0,1,2,...,100;z就表示每个[x,y]像素点对应的灰度值。z=f(x,y).
我用的是三角形带(GL_TRIANGLE_STRIP)法绘制的网格三维曲面图。也用了GL_TRIANGLES试了一下,都能得出差不多的结果,三维高斯曲面能显示出来,可是都质量很不好。没有看到的文献中生成的那种效果(我也加了伪彩色效果)
希望各位高手指导!
上传理想效果(文献)的截图,和自己的程序。(我是用vc建的单文档程序Surface,限于只能上传500K,就只附上SurfaceView.h和SurfaceView.cpp)
衷心地想大家求教,困扰我很久了。非常感谢!

想要的理想结果

想要的理想结果

SurfaceView.cpp

66.55 KB, 下载次数: 14

SurfaceView.h

2 KB, 下载次数: 6

最近VR访客

tan_dunming 评论于2008-12-7 15:48:30
如果对三维显示的要求不高的话 直接用Matlab就可以了 不用费这么大的力气研究OpenGL

对了 要显示出那种效果 可以考虑根据每一个坐标点高度值的大小不同 采用不同的颜色三线性差值功能glColor3f 而不是材质glMaterialfv
追求卓越
KLOSE 评论于2008-12-7 16:53:14
斑竹说的很在理。的确用matlab实现起来很容易。效果也很好
不过这个课题老师就是要求脱离matlab,实现光束的三维分析。
所以还真心请斑竹指点!您所说的不改变材质用glColor3f来做我也试过,可是没成功
还有,我的程序绘出来的图很粗糙,怎么改进,非常感谢!
tan_dunming 评论于2008-12-7 18:27:59
你把程序压缩之后发到tan_dunming@foxmail.com
这样说更清楚一些
追求卓越
KLOSE 评论于2008-12-7 22:04:48
恩,好的,邮件已经发送!
非常感谢热心的斑竹!!
tan_dunming 评论于2008-12-8 16:25:11
感觉有一下问题:
1.数据有点少? 还是怎么回事,感觉怪怪的。比如说如下几个角度看。数据的起伏突变很大啊。
0.jpg
1.jpg
2.jpg
可以考虑将这些数据用Matlab绘制对比一下效果。可以考虑是否采用等高线插值或者其它办法处理一下。或者根据高度确定颜色,线性差值颜色。
2.光源的参数,特别是位置有问题。模型中数据的范围和光源的位置(GLfloat light0_position[]={0.0,0.0,4.0,1.0};
)距离差的有点多。

建议:
1.查看一些数据处理的书籍或者论文。
2.多看看OpenGL相关的书籍和例程,打好基础。

[ 本帖最后由 tan_dunming 于 2008-12-8 04:35 PM 编辑 ]
追求卓越
tan_dunming 评论于2008-12-8 16:39:58
另外,材质的种类也有点少,显得单调。
原始程序中是这样:
            if(ZData[w][h]<50)
                //glIndexi(1);
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[0]);
            else if(ZData[w][h]>=50 & ZData[w][h]<85)
                //glIndexi(2);
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[1]);
            else if(ZData[w][h]>=85 & ZData[w][h]<100)
                //glIndexi(3);
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[2]);
            else if(ZData[w][h]>=100 &ZData[w][h]<145)
                //glIndexi(4);
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[3]);
            else
                //glIndexi(5);
                glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[4]);

可以适当增加一些,比如修改程序如下之后的效果:
            mat_am_dif[0][0] = ZData[w][h]/150.0f;
            mat_am_dif[0][1] = 1.0-ZData[w][h]/150;
            mat_am_dif[0][2] = 0.5;
            mat_am_dif[0][3] = 1.0;
            glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_am_dif[0]);
3.jpg

我的美感不是很敏感,你自己也多试一试。
追求卓越
KLOSE 评论于2008-12-8 17:32:42
非常感谢斑竹的帮助和建议!!
比较同意您所说的,可能是数据点有点少。接下来研究一下插值。
另外斑竹给我提供的高度确定颜色的方法让我眼前一亮, 并且这种处理方法比我原先的自然不少哈哈。
最后再次感谢斑竹给我的建议!赞
回头跟大家分享心得~
KLOSE 评论于2008-12-8 19:07:25
对了,版主说程序中”光源的参数,特别是位置有问题。模型中数据的范围和光源的位置(GLfloat light0_position[]={0.0,0.0,4.0,1.0};)距离差的有点多。”
怎么修改一下能达到如您的图片所示那样明亮的效果?我的很暗
tan_dunming 评论于2008-12-9 14:21:28
我发的几个图片仅仅是调节了一下材质的颜色,特别是根据高度确定材质的颜色,并没有调节光源的参数和位置。但是可以考虑将光源的位置更加靠近模型中的数据点,这样光照效果更明显一些。
需要实际测试看看是否是这样。
追求卓越
KLOSE 评论于2008-12-10 09:10:02
非常感谢热心负责的斑竹!!目前做了一下调制,结果还可以,等最后差不多的时候,我再来和大家分享自己的心得。
谢谢斑竹的帮助!!

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-27 02:28 AM

返回顶部