摘要: 好久没有更新帖子。原因有很多,其中很重要的一个原因,就是我花费了两年时间 写的一本书。后期有很多琐碎的事情要做。好在它现在已经顺利出版。名曰“葵花宝典——WPF自学手册”。 阅读全文
posted @ 2010-09-24 22:51 helloj2ee 阅读(7524) 评论(71) 推荐(10) 编辑
摘要: 博客是一个分享的地方。我乐于分享。但是真的不希望有人转载了文章。连一个名字和链接都不署上。这样的确太过份了。因此在这里作出严正声明:所有文章转载时请在显要地方显示作者署名及原文链接,请勿用作商业用途。如有其它疑问,请联系:lovehelloj2ee@126.com 阅读全文
posted @ 2010-02-27 20:29 helloj2ee 阅读(391) 评论(4) 推荐(2) 编辑

经历前两节课,想必大家能够编写一些基本的OpenGL小程序。但是对这个glBegin里的冬冬,还是心生困惑的。因此我将这里的基本类型给大家列下来。

我们在画一个图元的时候,通常如下,比如Helloj2ee绘制的北斗七星图。

    glBegin(g_geotype);
        glVertex2i(289, 190);         // 绘制若干个点
        glVertex2i(320, 128);
        glVertex2i(239, 67);
        glVertex2i(194, 101);
        glVertex2i(129, 83);
        glVertex2i(74, 74);
        glVertex2i(20,10);
    glEnd();

同样是点,那么glBegin里面传的参数不一样,则绘制的图形不一样。OpenGL提供了以下10种基本几何图元。

GL_POINTS 为n个顶点的每一个都绘制一个点,以北斗七星为例,如果g_geotype = GL_POINTS,那么得到效果如下图(点是人为标示上去,OpenGL绘制注记,并不像一般图形平台那么容易)。

如果g_geotype = GL_LINES,一对顶点才被解释为一条直线,直线之间并不连接,但是如果不凑巧是奇数个点,那么最后一个点不幸要被忽略掉,因此这里v7这个点就被忽略掉。

如果g_geotype = GL_LINE_STRIP,则是一系列的直线。即从v0到v1,一直到v7。如下图所示:

如果g_geotype = GL_LINE_LOOP,和GL_LINE_STRIP相似,只不过构成一个线环,注意阿,它仍是线,而不是面,只不过是一个闭合的线。

如果g_geotype = GL_TRIANGLES,那么它是一系列的三角形,n只有是3的倍数,那么才能恰好所有点构成三角形,n不是3的倍数,剩下的点就会被忽略。

如果g_geotype = GL_TRIANGLE_STRIP,那么第一个三角形是v1,v3,v2,第二个三角形是v2,v4,v3,依次类推,注意三个点的顺序。要保证所有的三角形是按相同方向绘制。

如果g_geotype = GL_TRIANGLE_FAN,和GL_TRIANGLE_STRIP类似,区别在于一直是以v1开始,v1,v3,v2 和v1 v4 v2等等。

如果g_geotype = GL_QUADS,则是一系列的四边形,首先使用顶点v1,v2,v3,v4,然后不是4的倍数,只能忽略。

如果g_geotype = GL_QUAD_STRIP,绘制一系列四边形,但是四边形的顺序是顶点 2n-1、2n、2n+2和2n+1定义了第n个四边形。由于这并非是一个凸多边形,因此会很怪异。

 如果g_geotype = GL_POLYGON,则是绘制一个多边形。点的个数必须大于等于3。多边形本身不要相交,且最好是凸多边形。如果顶点不满足这些条件,也许正确,也许不正确。

 

该程序代码如下所示。

View Code
#include <windows.h>   
#include <gl/Gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#define E_POINTS    1
#define E_LINES        2
#define E_LINES_STRIP    3
#define E_LINE_LOOP        4
#define E_TRIANGLES        5
#define E_TRIANGLES_STRIP    6
#define E_TRIANGLES_FAN        7
#define E_QUADS                8
#define E_QUAD_STRIP        9
#define E_POLYGON            10
GLenum g_geotype = GL_POINTS;
//<<<<<<<<<<<<<<<<<<<<<<< myInit >>>>>>>>>>>>>>>>>>>>
 void myInit(void)
 {
    glClearColor(1.0, 1.0, 1.0, 0.0);      // 设置背景颜色为亮白
    glColor3f(0.0f, 0.0f, 0.0f);           // 设置绘制颜色为黑
     glPointSize(4.0);                    //设置点的大小为4*4像素
    glMatrixMode(GL_PROJECTION);// 设置合适的投影矩阵-以后解释 
    glLoadIdentity();// 以后解释
    gluOrtho2D(0.0, 480.0, 0.0, 320.0);// 以后解释
    // g_geotype = GL_POINTS;
 }
//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
// 重绘函数
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);     // 清屏幕 
    glBegin(g_geotype);
        glVertex2i(289, 190);         // 绘制若干个点
        glVertex2i(320, 128);
        glVertex2i(239, 67);
        glVertex2i(194, 101);
        glVertex2i(129, 83);
        glVertex2i(74, 74);
        glVertex2i(20,10);
    glEnd();    
    glutSwapBuffers();                         // 将所有输出到显示屏上 
}
void ProcessMenuEvents(int option)
{
    switch(option)
    {
    case E_POINTS:
        g_geotype = GL_POINTS;
        break;
    case E_LINES:
        g_geotype = GL_LINES;
        break;
    case E_LINES_STRIP:
        g_geotype = GL_LINE_STRIP;
        break;
    case E_LINE_LOOP:
        g_geotype = GL_LINE_LOOP;
        break;
    case E_TRIANGLES:
        g_geotype = GL_TRIANGLES;
        break;
    case E_TRIANGLES_STRIP:
        g_geotype = GL_TRIANGLE_STRIP;
        break;
    case E_TRIANGLES_FAN:
        g_geotype = GL_TRIANGLE_FAN;
        break;
    case E_QUADS:
        g_geotype = GL_QUADS;
        break;
    case E_QUAD_STRIP:
        g_geotype = GL_QUAD_STRIP;
        break;
    case E_POLYGON:
        g_geotype = GL_POLYGON;
        break;
    }
}
//<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char **argv)
{
    glutInit(&argc, argv);          // 初始化工具包
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置显式模式
    glutInitWindowSize(640,480);     // 设置窗口大小
    glutInitWindowPosition(100, 150); // 设置窗口位置
    glutCreateWindow("my first attempt"); // 打开屏幕窗口
    myInit();  
    glutDisplayFunc(myDisplay);     // 注册绘制函数
    glutIdleFunc(myDisplay);
        
    glutCreateMenu(ProcessMenuEvents);
    glutAddMenuEntry("POINTS",E_POINTS);
    glutAddMenuEntry("LINES",E_LINES);
    glutAddMenuEntry("LINES_STRIP",E_LINES_STRIP);
    glutAddMenuEntry("LINE_LOOP",E_LINE_LOOP);
    glutAddMenuEntry("TRIANGLES",E_TRIANGLES);
    glutAddMenuEntry("TRIANGLES_STRIP",E_TRIANGLES_STRIP);
    glutAddMenuEntry("TRIANGLES_FAN",E_TRIANGLES_FAN);
    glutAddMenuEntry("QUADS",E_QUADS);
    glutAddMenuEntry("QUAD_STRIP",E_QUAD_STRIP);
    glutAddMenuEntry("POLYGON",E_POLYGON);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
                 
    glutMainLoop();              // 进入主循环
}

 

 

 

 

 

posted @ 2013-03-12 22:45 helloj2ee 阅读(4082) 评论(0) 推荐(3) 编辑
摘要: 获取和安装了OpenGL之后,就可以写第一个OpenGL程序了。虽然Helloj2ee在获取和安装OpenGL非常顺利。但是实际中大家会遇到不同的问题。具体说来主要有以下两个问题。1、按照上一篇的步骤,VS运行OpenGL程序仍然找不到glut.dll和glut32.dll。这个问题主要是操作系统不一样。64位操作系统,需要将这两个dll安装到系统目录syswow64目录下。2、lib放置的问题。仍然是部分机器,会存在Program File以及Program Files(x86)目录,您的VS多半会在后一个目录,因此需要找到相应的VS2010安装目录的lib文件夹下。比如Helloj2ee的 阅读全文
posted @ 2013-03-06 15:45 helloj2ee 阅读(4232) 评论(0) 推荐(0) 编辑
摘要: 为方便读者以及学生通过OpenGL掌握计算机图形学,Helloj2ee打算重操旧业。计算机图形学,可以采用很多图形软件包(GDI,GDI+,WPF,QT等)来实现。但是考虑到跨平台,以及简单易用,三维能力强悍等原因,Helloj2ee采用了OpenGL。做饭炒菜要用锅碗瓢盆,写计算机图形学程序需要一个优秀的C++编译器,并且该编译器安装了适当的OpenGL。Helloj2ee采用了VS2010+OpenGL。为了使用OpenGL,必须采用三个库及相关文件。OpenGL核心库,它提供OpenGL的基本函数。每个函数都以GL开头;OpenGL实用库(GL Utility Library),glu库 阅读全文
posted @ 2013-03-05 17:38 helloj2ee 阅读(11877) 评论(0) 推荐(1) 编辑
摘要: 很多人尝试google maps api的开发,通常会涉及到在Google maps上进行标注功能的开发。Helloj2ee学习一项技术通常不在看书,而是多以帮助为主。当我看完之后,我将Overlay这一章翻译成中文,和大家共享。该文英文全文是Google maps api javascript v3帮助,链接:https://developers.google.com/maps/documentation/javascript/overlays 相应会有一个中文的Google翻译:https://developers.google.com/maps/documentation/javascript/overlays?hl=zh-cn。但是这篇译文和Google的译文相比,会有如下不同: 1 我会保留诸如Overlay,marker保留其英文原文,通常该词第一次出现,我会以中文英文同时出现的方式,而第二次只保留英文; 2 代码中的英文注释将其翻译成了对应中文; 3 对于Google翻译中生硬的地方做了修改; 4 Google的中文文档帮助和英文文档帮助并不 阅读全文
posted @ 2013-01-10 23:55 helloj2ee 阅读(12357) 评论(9) 推荐(3) 编辑
摘要: 我不算是好事者。但是最近在南方周末上2011年4月14日头版上看到 漩涡中的中国首富,李彦宏和他的百度霸业。不由还是关注了一下百度(南方周末用了头版以及随后的两个版面报道,确实花费不少功夫)。对于几个搜索引擎一直以来 我秉持着“外事问Google,内事问百度,房事问天涯”的原则。所以也很少去关注关于百度的一些问题报道,比如竞价排名或者其他。也有人曾经向我咨询,到底是在Google上作广告,还是在百度上作推广。尽管作为一个程序员,我一直都在使用Google,也心偏向 Google,但我还是忍住了多事之口,以“没有研究 没有发言权”这样的说辞拒绝了给出任何建议。事实证明我对了,因为Google之后退出了中国。 阅读全文
posted @ 2011-04-19 09:22 helloj2ee 阅读(5591) 评论(53) 推荐(14) 编辑
摘要: 今天收到了清华大学出版社寄给我的新译作《Silverlight 4 RIA 开发全程解析》。随即,我查了查在当当,卓越以及China-pub上还没有此书。这本书是一本使用Silverlight 4构建富客户网站的实践书。在这里Helloj2ee为大家推荐一下该书。原因很简单,因为是本人翻译的,至于钱的方面,倒确实没有这方面的原因。因为译书和写书全然不一样。翻译是一锤子买卖的事情。即使这本书卖得再好,和我也没有任何关系。如果你有了一定的Silverlight或者WPF基础的人,又苦于平时看书全会,放下书全不会,那么这本书真的很合适你。下面是Helloj2ee为这本书写的一个序,以及该书的英文版。供大家选择时的一个参考。 阅读全文
posted @ 2011-04-16 22:21 helloj2ee 阅读(3558) 评论(35) 推荐(8) 编辑
摘要: 首先需要解释一下 程序员为什么 会去学习统计学。 以Helloj2ee的个人经历而言。是因为程序员正在向可用性专家和用户研究专家 转型的时候需要用到。 你或许也是这个原因。那么这篇文章 你就该看了。 阅读全文
posted @ 2011-04-11 23:06 helloj2ee 阅读(6535) 评论(15) 推荐(4) 编辑
摘要: 好久没有写过技术博客。原因有很多 但绝不是懈怠。 本章是一篇翻译稿 原文为User Experience Design: The Evolution of a Multi-Disciplinary Approach. 作者也是比较有名的用户体验专家 J.Mayhew 该文章来自JUS(Journal of Usability Studies)2008年的。 翻译的目的很简单 只是自己也一直致力于可用性研究。她的经历和我也颇有类似,比如大家都是从程序员在转型。由于毕竟不是在做一件正儿八经的翻译工作 只是和大家分享 所以文章翻译的只能说完整 但是还不精致。因此大家大可看看中文 看看英文。有问题 也不妨在下面回复。 阅读全文
posted @ 2011-02-01 13:32 helloj2ee 阅读(1896) 评论(11) 推荐(5) 编辑
摘要: Helloj2ee的自定义ListBox(一),虽然很用心,但看出来反响不强烈。只能这一篇再给力一点。虽然评论很少,但是也看出一些讯息。 讯息之一,就是Helloj2ee的WPF看不懂。的确在这里写的不是基本的东西,而是对其WPF的相关基础概念掌握了之后,才能看的一个系列。自定义控件在《葵花宝典——WPF自学手册》一书中,是放到第六卷——华山之巅,足见其高阶。因此Helloj2ee在后面列出的参考文献,就很有价值了。因为您若是看不懂,不妨去参考相关文献,即便您没有葵花宝典一书,但总可以知道需要掌握的相关概念是什么,参阅其他书又何妨? 讯息之二,是提供的源码无法打开,那么Helloj2ee已经更新过。如果解压还是失败,您不妨在下面的回帖中告诉我。 说到给力,那么只有让这个控件在本章当中酷起来或者炫起来,才是给力的王道。 阅读全文
posted @ 2010-12-09 00:31 helloj2ee 阅读(3357) 评论(3) 推荐(4) 编辑
摘要: 上周侯捷大师来京做了一次讲座,有幸和他聊聊。当别人排队,而我也在排队。有意思的是当别人在找侯捷大师签名时,而我确有幸为侯捷大师签了一次名,当然是在我的《葵花宝典——WPF自学手册》上签下了自己难看的名字。 这不是重点,重点是他提到他的人生中几件关键的事情。其中一件,如果我的记忆没有错的话,应该是Windows 3.0来的时候的冲击,他当时还在一个台湾的研究所里工作,在考虑窗口,控件如何“Message Based,Event Driven”(以消息为基础,事件驱动之)。Windows3.0来了,一下他的模糊思路明晰起来,尽管侯大师考虑的只是一个雏形,而Windows是实实在在真正的产品。但这并不重要,重要的是他们的思路不谋而合。这样他不至于在DOS到Windows巨变的情况下“死在沙滩上”。很多程序员由于无法从DOS的编程思路迅速转换到Windows的“Message Based,Event Driven”,按照侯捷大师的话,“一半死在沙滩上”。 阅读全文
posted @ 2010-12-07 02:09 helloj2ee 阅读(6825) 评论(12) 推荐(3) 编辑
点击右上角即可分享
微信分享提示