版权归作者所有,任何形式转载请联系作者。
作者:sfme(来自豆瓣)
来源:>
在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、IBM、DEC、Sun、HP等大公司的认同。因此,OpenGL已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。
1、初始化OpenGL绘图环境
11 定义颜色格式和缓冲模式
OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式(调色板)。在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。RGB三个分量值的范围都在0和1之间,它们在最终颜色中所占的比例与它们的值成正比。如:(1、1、0)表示**,(0、0、1)表示蓝色。颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。
OpenGL提供了双缓存来绘制图像。即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。
设置窗口显示模式函数:
void auxInitDisplayMode(
AUX_DOUBLE | // 双缓存方式
AUX_RGBA // RGBA颜色模式
);
12 设置光源
OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。全局环境光是一种特殊的环境光,它不来自特于某种定光源,通常做为场景的自然光源。
指定光源函数:
void glLightfv(
Glenum light, // 光源号
Glenum pname, // 指明光源类型:
// GL_DIFFUSE 光源为漫射光光源
// GL_AMBIENT 光源为环境光光源
// GL_SPECULAR 光源为镜面光光源
const Glfloat params // 指向颜色向量的指针
);
设置全局环境光函数:
void glLightModelfv(
GL_LIGHT_MODEL_ AMBIENT,
const Glfloat param // param:指向颜色向量的指针
);
起用光源函数:
void glEnable(GL_LIGHTING);
void glEnable(GL_enum cap); // cap:指明光源号
13 设置材质
在OpenGL中,用材料对光的三原色(红绿蓝)的反射率大小来定义材料的颜色。与光源相对应,材料的颜色,也分为环境色,漫反射色和镜面反射色,由此决定该材料对应不同的光呈现出不同的反射率。由于人所看到物体的颜色是光源发出的光经物体反射后进入眼睛的颜色。所以,物体的颜色是光源的环境光,漫反射光和镜面反射光与材料的环境色,漫反射色和镜面反射色的综合。例如:OpenGL的光源色是(LR、LG、LB),材质色为(MR、MG、MB),那么,在忽略其他反射效果的情况下,最终进入眼睛的颜色是(LRMR、LGMG、LBMB)。
材质定义函数:
void glMaterialfv(
GLenum face, // 指明在设置材质的哪个表面的颜色。
// 可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK
GLenum pname, // 与光源的pname参数相似
const float params // 指向材质的颜色向量
);
14 定义投影方式
也即选择观察物体的角度和范围。由于我们是三维绘图,所以采用不同的视点和观察范围,就会产生不同的观察效果。由于计算机只能显示二维图形,所以在表示真实世界中的三维图形时,需将三维视景转换成二维视景。这是产生三维立体效果的关键。OpenGL提供了两种将3D图形转换成2D图形的方式。正投影(Orthographic Projection)和透视投影(Perspective Projection)。其中,正投影指投影后物体的大小与视点的远近无关,通常用于CAD设计;而透视投影则符合人的心理习惯,离视点近的物体大,离视点远的物体小。此外,在OpenGL中还要定义投影范围,只有在该范围中的物体才会被投射到计算机屏幕上,投影范围外的物体将被裁减掉。
定义投影范围(不同的投影方式对应不同函数):
void glOrtho(
GLdouble left, GLdouble right,
// (left,bottom,near)及(right,top,far)分别给出正射投
GLdouble bottom, GLdouble top, // 影投影范围的左下角和右上角的坐标。
GLdouble near,GLdouble far);
2、定义与Windows接口的系统函数
21 定义绘图窗口的位置
// (x,y)给出窗口左上角坐标
// width及heigh给出窗口的宽高
void auxInitPosition(GLint x,GLint y,GLsizei width, GLsizei heigh);
22 定义绘图窗口的标题
// STR表示窗口标题字串
void auxInitWindow(GLbyte STR);
23 定义绘图窗口改变时的窗口刷新函数
// 当窗口改变形状时调指定的回调函数
// NAME表示回调函数名称
void auxReshapeFunc(NAME);
24 定义空闲状态的空闲状态函数以实现动画
// 当系统空闲时调用指定的回调函数
// NAME表示回调函数名称
void auxIdleFunc(NAME);
25 定义场景绘制函数(当窗口更新或场景改变时调用)
// 当窗口需要更新或场景变化时调用
// NAME表示回调函数名称
void auxMainLoop(NAME);
在VC编辑器下键入下述代码后,保存为后缀是cpp的C++文件。开始编译,在“The build command requires an active project workspace”。“Would you like to create a default project workspace”? 的提示后,选择“是(Y)”。进入“Project”菜单,选择“Setting”项,d出“Project Setting”对话框,选择“Link”项,在“Libaray”栏目中加入OpenGL提供的函数库:“opengl32lib glu32lib glauxlib”。(注意:在执行程序时,Windows的system目录下要包含opengl32dll及glu32dll两个动态连接库)。附源程序代码:
#include "windowsh"
#include "gl/glh"
#include "gl/glauxh"
#include "gl/gluh"
#include "mathh"
void myinit()
{
glClearColor(1,1,0,0);
GLfloat ambient[]={5,5,5,0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
GLfloat mat_ambient[]={8,8,8,10};
GLfloat mat_diffuse[]={8,0,8,10};
GLfloat mat_specular[]={10,0,10,10};
GLfloat mat_shininess[]={500};
GLfloat light_diffuse[]={0,0,5,1};
GLfloat light_position[]={0,0,10,0};
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,mat_shininess);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0,GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
}
void CALLBACK display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
auxSolidSphere(10); // 绘制半径为10的实体球
glFlush(); // 强制输出图像
auxSwapBuffers(); // 交换绘图缓存
_sleep(100);
}
void CALLBACK Idledisplay()
{
// x,y满足x2+y2=001。这样可以使物体沿该圆轨迹运动。
static float x=-1,y=00;
static BOOL mark=TRUE;
static float step=01;
x+=step;
if(x<=1&&x>=-1)
{
if(step>0)
y=sqrt(01-xx);
else
y=-sqrt(01-xx);
glTranslatef(x,y,0);
}
else
{
step=0-step;
}
display();
}
void CALLBACK myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if(w<=h)
glOrtho(-35,35,-35(GLfloat)w/(GLfloat)h, 35(GLfloat)w/(GLfloat)h,-10,10);
else
glOrtho(-35(GLfloat)w/(GLfloat)h,35 (GLfloat)w/(GLfloat)h,-35,35,-10,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
auxInitPosition(0,0,400,400);
auxInitWindow(" circle ");
myinit();
auxReshapeFunc(myReshape);
auxIdleFunc(Idledisplay);
auxMainLoop(display);
}
给你一个关于VC和OPENGL的网站,不错的
>
图形化编程适合六七岁的孩子学。
对于七八岁的小孩子来讲,比较合适的学习过程是图形化编程到代码编程。学习图形化编程,主要在于培养编程逻辑,目前通用的是scratch,中文图形化 *** 作,也不需要英语,很容易上手。市面上的青少儿编程课程基本上都是可以覆盖6到18岁的小朋友的,所以一般从孩子上学开始,家长就可以开始布局学习。
图形化编程的突出特点,就是将一条条字符命令变成图形,我们把这些代表程序的图形块,像搭积木一样,通过拖拽搭建就可以实现一个完整的功能,然后一个图形化小游戏、小应用或者开源硬件功能就能运行了。
图形化编程
研究表明,孩子在6岁左右开始形成抽象逻辑思维,所以6岁是学习编程的最佳年龄。 如果过早让孩子接触编程,他的思维和理解力等方面有限,不仅难以达到编程教育的效果,还可能引起孩子反感。 所以儿童学编程,并不是越早越好,6岁学习最佳,8岁的小朋友完全可以学习。
你指的是Scratch编程?主要靠拖曳程序块完成的编程软件,现部分学校和培训机构比较推崇运用比较多的也是!刚入门只需要完成一个没有分支的固定动画效果就好,开始,执行,结束!第二阶段学习完成分支的代码结构,可以根据输入的信息完成一些交互的效果!第三阶段可以利用变量让程序跳转到不同的部分,第四个阶段需要理解函数和线程的概念,第五个阶段理解对象以及对象属性和方法,第六阶段可以完成对数据库的 *** 作,第七个阶段就是能够处理大量数据的基础之上完成一些简单的人工智能算法,这边是少儿编程图形化编程的学习阶段,你所讲的运行顺序并不严谨,因为他包含了开始模块,运动模块,执行模块,声音模块,舞台背景等等
响应鼠标事件
鼠标常被用作绘图的工具 应用程序利用鼠标位置的变化来绘制各种不同的图形 鼠标有三个动作 鼠标按钮按下 鼠标移动 鼠标按钮d起 在Delphi中 对应三个动作有三个不同的事件 OnMouseDown OnMouseMove OnMouseUp
当Dlephi应用程序探测到一个鼠标动作时 它传递五个参数 并调用相应的事件响应
程序员可利用这些参数来定义事件程序 五个参数如下表 :
表 鼠标事件的五个参数
━━━━━━━━━━━━━━━━━━━━━━━━━━━
参数 含义
──────────────────────────
Sender 探测鼠标动作的对象
Button 涉及的鼠标按钮 左键 中键 右键
Shift 鼠标动作时 Alt Ctrl Shift按钮的状态
X Y 事件发生时鼠标的坐标
━━━━━━━━━━━━━━━━━━━━━━━━━━━
当鼠标按下时发生OnMouseDown事件 举一个简单例子来说明程序如何对该事件进
行响应 假如我们想在鼠标按下的地方出现 Here
响应鼠标的OnMouseDown事件
可在该事件中调用TextOut方法
procedure TForm FormMouseDown(Sender: TObject Button: TMouseButton;
Shift : TShifState; X Y : Integer)
begin
Canvas TextOut(X Y Here! )
end;
用户放松鼠标键时发生OnMouseUp事件 该事件发生时 鼠标到达的对象并不一定是鼠标键按下时鼠标所在的对象 例如 用户可在窗体之外画一条线段 (鼠标在窗体外 线段在窗体内) 下面的代码可用鼠标绘制直线
procedure TForm FormMouseDown(Sender:TObject)
begin
Moveto(x y)
end;
procedure TForm FormMouse Up(Sender:Tobject)
begin
Lineto(X Y)
end;
返回目录 DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
J EE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLE G数据库开发优化指南
Java程序性能优化 让你的Java程序更快 更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
lishixinzhi/Article/program/Delphi/201311/25249
以上就是关于Scratch图形化编程是什么呢全部的内容,包括:Scratch图形化编程是什么呢、C语言图形函数及应用 C语言输出图形、图形学编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)