OSG绘制基本图形实验一
实验一:基本图形生成算法实验说明
实验一基本图形生成一.实验学时4学时二.实验类型设计型实验三.实验目的和要求1、了解光栅化图形学的主要理论和知识。
2、了解VS的Windows窗口编程中几何图形的绘制调用接口。
3、掌握线段的生成算法原理和算法,掌握微分画线法、中点画线算法的原理,学会用C++程序进行算法的设计。
4、选作:掌握多边形填充算法的基本原理和方法,掌握有序边表法和扫描线种子填充算法的原理,采用C++进行算法的设计。
四、实验内容(一)完成一个图形生成算法的仿真环境,在一个窗口区域中画出坐标系和坐标网格,其中每个坐标网格模拟显示器上的一个像素点。
实验步骤如下:(1)在VS中打开实验的的工程。
(2)在工程中增加一个菜单项:打开linemenu.rc资源在下面增加一个多边形填充的选项。
操作界面图见图1所示。
图1 菜单资源图对新增的菜单选项设置ID值见图2所示。
图2 ID定义界面图(3)在resource.h文件中增加ID_FILL的定义图3 ID定义界面图(4)在circle.cpp文件中增加一个多边形填充的处理switch(message){case WM_COMMAND:hdc=GetDC(hwnd);if(LOWORD(wParam) == ID_BACK){hnewpen=CreatePen(PS_SOLID,1,RGB(0,255,255));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawBackground(hdc);hnewpen=CreatePen(PS_SOLID,2,RGB(0,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DrawAB(hdc);}else if(LOWORD(wParam)==ID_MID){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);DDACircle(hdc,1,5,20,RGB(0,255,255));}else if(LOWORD(wParam) == ID_BRE){hnewpen=CreatePen(PS_SOLID,2,RGB(255,0,0));holdpen=(HPEN)SelectObject(hdc,hnewpen);p[0].SetX(0);p[0].SetY(0);p[1].SetX(5);p[1].SetY(8);p[2].SetX(1);p[2].SetY(10);p[3].SetX(0);p[3].SetY(0);ScanFill(hdc,p,RGB(0,255,255));}SelectObject(hdc,holdpen);DeleteObject(hnewpen);ReleaseDC(hwnd,hdc);break;(二)设计微分画线算法和中点画线算法程序,并进行调试。
实验1 opengl基本图形绘制
实验一、直线的扫描转换系别:计算机学院专业班级: 10信科2姓名:学号实验日期: 2013-3-27 实验报告日期:2013-3-27一、实验目的:理解直线的不同生成算法,并用程序实现。
二、实验环境:1熟悉VC6.0开发平台;2熟悉OpenGL开发库;三、实验内容:1.使用OpenGL中的基本画点函数,分别使用DDA算法、中点算法、Bresenham算法画直线。
要求为每一种算法分别建立对应的函数,函数参数为直线段的端点坐标。
四、实验报告内容1、程序源码;void MidpointMethod(Point point1,Point point2){int x ,y,d,times1,times2,stepX,stepY; //k表示斜率int a,b,c; //a,b ,c分别为直线方程 aX+bY+c=0的参数int i;float k;x=point1.x; y=point1.y;times1=abs(point1.x-point2.x);//循环次数times2=abs(point2.y-point1.y);a=point2.y-point1.y; //求出直线方程 aX+bY+c=0的参数的参数ab=point1.x-point2.x; //求出直线方程 aX+bY+c=0的参数的参数bc=point1.x*(point1.y-point2.y)+point1.y*(point2.x-point1.x); //求出直线方程 aX+bY+c=0的参数的参数cstepX=b/abs(b)*(-1); //stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 stepY=a/abs(a); //stepY表示该直线在y轴上的延伸方向,stepY 值为1,表示直线像素点的纵坐标跳步的方向与Y轴一样,否则为-1k=((float)a)/((float)b)*(-1); //求出斜率kglPointSize(1.0f);glBegin(GL_POINTS);if((0<=k)&&(k<=1)) //斜率为0到1的情况{d=a+0.5*b; //初值for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d>=0) //判断y方向是否走步,stepX表示该直线在X轴上的延伸方向,stepX值为1,表示直线像素点的横坐标跳步的方向与x轴一样,否则为-1 //{y+=stepY;d=d+a+b;}elsed=d+a;glVertex2i(x,y);}}else if((1<k)&&(k<=10000)) //斜率大于1的情况{d=b+0.5*a;for(i=0;i<times2;i++) //times表示循环要执行的次数{y+=stepY;if(d*stepY<=0) //判断中点是否在直线的上方,stepY表示该直线在y轴上的延伸方向,stepX值为1,表示直线像素点的纵坐标跳步的方向与x轴一样,否则为-1{x+=stepX;d=d+a+b;}else d=d+b;glVertex2i(x,y);}}else if((-1<=k)&&(k<0)) //斜率为-1到0的情况{d=a+0.5*b;for(i=0;i<=times1;i++){x=x+stepX;if(stepX*d<=0){y+=stepY;d=d+a-b;}elsed=d+a;glVertex2i(x,y);}}else if((-10000<=k)&&(k<-1)) //斜率为小于-1的情况{d=a*0.5+b;for(i=0;i<=times2;i++){y=y+stepY;if(stepY*d>=0){x+=stepX;d=d-a+b;}elsed=d+b;glVertex2i(x,y);}}else //斜率无限大的情况{for(i=0;i<times2;i++){y+=1;glVertex2i(x,y);}}glEnd();}2、实验报告;报告中包含以下内容:①自己编写的绘图函数及其辅助函数。
OS操作系统课程实验指导书附运行截图
OS操作系统课程实验指导书附运行截图实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK 个时间片后,将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:i READY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include#include#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead); readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority; blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\"); queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0; readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL; blockQueHead.pre = blockQueHead.nxt = NULL; // 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority; readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\");printf("id: %d, pri: %d, alltime: %d\", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\第%d个时间片后:\", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\模拟进程调度算法结束2145115 刘成路\");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。
osg教程
osg教程osg是一种开源的三维图形引擎,可以用于创建各种虚拟现实(VR)和增强现实(AR)应用程序。
它提供了一系列功能强大的工具和库,用于处理3D渲染、触摸输入、模型加载、光照效果等等。
osg的安装非常简单,只需将其添加到您的项目依赖中即可。
然后,您可以使用osg命令集创建和管理您的3D场景。
osg提供了一个多功能的视图器窗口,用于显示您的场景。
您可以使用该窗口的各种方法和属性来控制场景的呈现方式。
例如,您可以设置相机的位置和旋转,调整场景的光照效果和材质属性等等。
osg还支持多种文件格式的模型加载,包括OBJ、3DS、FBX 等等。
您可以使用osg的加载器来加载这些模型,并将其添加到您的场景中。
osg还提供了一系列的节点类,用于创建和管理3D对象。
您可以使用这些节点类来创建几何体、粒子效果、动画和碰撞检测等等。
osg还支持多种光照效果,包括点光源、方向光源、聚光灯等等。
您可以使用osg的光照类来创建和管理这些光源,并将它们应用于您的场景中。
osg还支持触摸输入,可以实现用户的交互操作。
您可以使用osg的事件处理器来处理用户的触摸动作,并根据用户的输入进行相应的操作。
osg还支持虚拟现实和增强现实技术。
您可以使用osg的VR和AR接口来创建和管理VR和AR应用程序,包括头显、手柄、虚拟物体等等。
osg是一个非常强大和灵活的三维图形引擎,非常适合创建各种虚拟现实和增强现实应用程序。
它提供了丰富的功能和工具,使您能够轻松地创建和管理3D场景。
无论您是初学者还是专业开发者,osg都可以满足您的需求,并帮助您实现您的创意。
osg由浅入深的好例子
osg由浅入深的好例子
OSG(OpenSceneGraph)是一个开源的三维图形库,它提供了一
系列强大的工具和功能,用于创建和渲染三维场景。
下面我将从浅
入深为你介绍一些关于OSG的好例子。
首先,从浅层来看,OSG可以用于创建简单的三维场景。
比如,你可以使用OSG来创建一个简单的立方体或球体,并将其渲染到屏
幕上。
这个例子可以帮助初学者了解如何使用OSG的基本功能来创
建和显示简单的三维对象。
其次,从中层来看,OSG可以用于创建更复杂的场景和效果。
比如,你可以使用OSG来创建一个包含多个对象的场景,并添加光照、阴影和纹理等效果。
这个例子可以帮助用户进一步了解如何使
用OSG的高级功能来创建更加真实和生动的三维场景。
最后,从深层来看,OSG还可以用于创建复杂的虚拟现实应用
和仿真系统。
比如,你可以使用OSG来构建一个虚拟的飞行模拟器
或医学仿真系统。
这个例子可以展示OSG在实际应用中的强大功能,以及其在高度复杂的应用中的灵活性和可扩展性。
总的来说,OSG提供了丰富的功能和工具,可以帮助用户从简
单的三维对象到复杂的虚拟现实应用,实现各种各样的三维图形渲
染需求。
通过这些不同层次的例子,可以全面了解OSG的强大之处,以及其在三维图形领域的广泛应用。
希望这些例子能够帮助你更好
地理解OSG的特点和功能。
Photoshop实验指导书
Photoshop实验指导书综合实例一火焰字(1)新建一个图像,图像大小及分辨率等数如图1所示,待别注意要将背景要将背景层填充为黑色。
(2)选择文工具,将前景色设置为橙色,输入文字“书吧”,如图2所示。
(3)复制文字图层,单击图层缩略图,隐藏其备用。
选择菜单中的【图层】→【合并可见图层】命令,将可见图层合并为一层。
图1 新建文件图2 输入文字(4)选择菜单中的【虑镜】→【模糊】→【高斯模糊】命令,对文字部分进行适当虚化处理。
(5)下面用【风】虑镜将文字的火焰吹出来。
但因为【风】虑镜只能左右吹而不能上下吹,所以将图层像旋转90o。
选择菜单中的【图像】→【旋转画布】命令将画布向左旋转90o如图4所示。
(6)选择菜单中的【虑镜】→【风格化】→【风】命令,将文字火焰吹出来。
如果火焰吹出来。
如果火焰较短,可以反复重复执行此虑镜,如图4所示。
图4 风滤镜的效果(7)重新选择菜单中的【图像】→【旋转画布】命令,将画布向右旋转90o,使其重新旋转回来,如图5所示。
(8)火焰显得灰暗,需要调节火焰的对比度。
选择菜单中的【图像】→【调整】→【亮度/对比度】命令,完成对比度的调整,如图6所示。
图5旋转画布图6 调整图像对比度(9)选择菜单中的【图像】→【调整】→【曲线】命令,并注意将通道设为红色,调整曲线后,火焰便更加逼真了,如图7所示。
图7 调整火焰的对比度(10)选择菜单中的【虑镜】→【扭曲】→【波纹】命令,给火焰加入【波纹】虑镜,文字火焰出现了飘动的感觉,如图8所示。
图8 对火焰进行扭曲(11)显示先前隐藏备用的文字图层。
在图层控制面板中的单击“图层样式”图标按钮,为文字增加图层效果。
火焰字的最后效果如图9所示。
图9火焰字的最后效果综合实例二爱心银币具体操作步骤如下。
(1)新建一个图像文件,命名为“银币”,图像大小及分辨率如图1所示。
图1 新建文件(2)使用工具箱中的油漆桶工具,对整个图像区域填充灰色,如图2(a)所示。
OS操作系统课程实验指导书附运行截图
实验1使用动态优先权的进程调度算法的模拟1、实验目的(1)加深对进程概念的理解(2)深入了解系统如何组织进程,创建进程(3)进一步认识如何实现处理机调度2、实验内容(1)实现对N个进程采用动态优先权优先算法的进程调度。
(2)每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:进程在就绪队列中停留一个时间片,优先数加1。
进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 0 1 2 3 4PRIORITY 9 38 30 29 0CPUTIME 0 0 0 0 0ALLTIME 3 3 6 3 4STARTBLOCK 2 -1 -1 -1 -1BLOCKTIME 3 0 0 0 0STATE ready ready ready ready ready(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:RUNNING PROG:iREADY-QUEUE:->id1->id2BLOCK-QUEUE:->id3->id4= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = == = =ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CUPTIME C0 C1 C2 C3 C4ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S43、实验结果(给出编写的程序源代码和运行结果的截图)【程序代码】#include<stdio.h>#include<stdlib.h>#define N 5// 进程状态enum STATE { Ready, Run, Block, Finish };// PCB数据结构struct PCB {int id; // 标志数int priority; // 优先数int cpuTime; // 已占CPU时间int allTime; // 还需占CPU时间int blockTime; // 已被阻塞的时间int startBlock; // 开始阻塞时间STATE state; // 进程状态PCB *pre; // PCB的前指针PCB *nxt; // PCB的后指针};int id[N] = {0, 1, 2, 3, 4};int priority[N] = {9, 38, 30, 29, 0};int cpuTime[N] = {0, 0, 0, 0, 0};int allTime[N] = {3, 3, 6, 3, 4};int startBlock[N] = {2, -1, -1, -1, -1};int blockTime[N] = {3, 0, 0, 0, 0};void QuePush(PCB *process, PCB *queHead){process->pre = NULL;process->nxt = queHead->nxt;if (queHead->nxt != NULL) {queHead->nxt->pre = process;}queHead->nxt = process;}void quePop(PCB *process, PCB *queHead){if (process->pre != NULL) {process->pre->nxt = process->nxt;} else {queHead->nxt = process->nxt;}if (process->nxt != NULL) {process->nxt->pre = process->pre;}process->pre = process->nxt = NULL;}void queWalk(PCB *queHead){PCB *pro = queHead->nxt;if (pro == NULL) {printf("(没有进程啦)\n");return;}while (pro != NULL){printf("id: %d, priority: %d, cpuTime: %d, alltime: %d,blockTime: %d,state:%d,startblock: %d\n", pro->id, pro->priority, pro->cpuTime, pro->allTime, pro->blockTime, pro->state, pro->startBlock);pro = pro->nxt;}}int readyQueNum; // 就绪队列的进程数量PCB readyQueHead; // 就绪队列的头部PCB *readyMaxProcess; // 就绪队列中优先级最高的进程void readyQuePush(PCB *process){readyQueNum ++;process->state = Ready;QuePush(process, &readyQueHead);}PCB* readyQuePop(){readyQueNum --;quePop(readyMaxProcess, &readyQueHead);return readyMaxProcess;}// 每个时间片,更新就绪队列里进程的信息void readyQueUpdate(){int maxPriority = -1;PCB *pro = readyQueHead.nxt;if (pro == NULL) {// 就绪队列没有进程readyMaxProcess = NULL;return;}while (pro != NULL){pro->priority ++;if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}pro = pro->nxt;}}// 返回就绪队列最高优先级的值int readyMaxPriority(){return readyMaxProcess->priority;}// 查看就绪队列里进程的信息void readyQueWalk(){printf("就绪队列里的进程信息为:\n");queWalk(&readyQueHead);}#define EndBlockTime 3 // 进程最长被阻塞时间int blockQueNum; // 阻塞队列的进程数量PCB blockQueHead; // 阻塞队列的头部PCB *blockMaxProcess; // 阻塞队列中优先级最高的进程// 进程插入到阻塞队列void blockQuePush(PCB *process){blockQueNum ++;process->blockTime = 0;process->state = Block;if (process->blockTime != -1) {QuePush(process, &blockQueHead);}}// 优先级最高的进程出列PCB* blockQuePop(){blockQueNum --;quePop(blockMaxProcess, &blockQueHead);return blockMaxProcess;}// 每个时间片,更新阻塞队列里进程的信息void blockQueUpdate(){int maxPriority = -1;PCB *pro = blockQueHead.nxt;while (pro != NULL){pro->blockTime ++;if (pro->blockTime >= EndBlockTime) {PCB *process = pro;pro = pro->nxt;// 阻塞时间到,调入就绪队列blockQueNum --;quePop(process, &blockQueHead);readyQuePush(process);} else if (pro->priority > maxPriority) {// 更新阻塞队列里优先级最高的进程指针maxPriority = pro->priority;blockMaxProcess = pro;pro = pro->nxt;}}}// 查看阻塞队列里进程的信息void blockQueWalk(){printf("阻塞队列里的进程信息为:\n");queWalk(&blockQueHead);}// 初始化数据void initData(){// 初始化就绪队列和阻塞队列readyQueNum = blockQueNum = 0;readyMaxProcess = blockMaxProcess = NULL;readyQueHead.pre = readyQueHead.nxt = NULL;blockQueHead.pre = blockQueHead.nxt = NULL;// 初始化进程进入就绪队列int i, maxPriority = -1;for (i = 0; i < N; i ++){// 分配一个PCB的内存空间PCB *pro = (PCB *)malloc(sizeof(PCB));// 给当前的PCB赋值pro->id = id[i];pro->priority = priority[i];pro->cpuTime = cpuTime[i];pro->allTime = allTime[i];pro->blockTime = blockTime[i];pro->startBlock = startBlock[i];if (pro->allTime > 0) {// 插入到就绪队列中readyQuePush(pro);// 更新就绪队列优先级最高的进程指针if (pro->priority > maxPriority) {maxPriority = pro->priority;readyMaxProcess = pro;}}}}// 模拟cpu执行1个时间片的操作void cpuWord(PCB *cpuProcess){cpuProcess->priority -= 3;if (cpuProcess->priority < 0) {cpuProcess->priority = 0;}cpuProcess->cpuTime ++;cpuProcess->allTime --;// 显示正执行进程的信息:printf("CPU正执行的进程信息为:\n");printf("id: %d, pri: %d, alltime: %d\n", cpuProcess->id,cpuProcess->priority, cpuProcess->allTime);}int main(){int timeSlice = 0; // 模拟时间片int cpuBusy = 0; // 模拟cpu状态PCB *cpuProcess = NULL; // 当前在cpu执行的进程initData(); // 初始化// 模拟进程调度while (1){if (readyQueNum == 0 && blockQueNum == 0 && cpuBusy == 0) { // 就绪队列、阻塞队列和cpu无进程,退出break;}if (cpuBusy == 0) {// cpu空闲,选择一个进程进入cpuif (readyQueNum > 0) {// 选择绪队列优先级最高的进程cpuProcess = readyQuePop();} else {// 就绪队列没有进程,改为选择阻塞队列优先级最高的进程cpuProcess = blockQuePop();}cpuProcess->cpuTime = 0;cpuProcess->state = Run;cpuBusy = 1;cpuProcess->startBlock --;}timeSlice ++;printf("\n第%d个时间片后:\n", timeSlice);// 模拟cpu执行1个时间片的操作cpuWord(cpuProcess);if (cpuProcess->allTime == 0) {cpuProcess->state = Finish;// 释放已完成进程的PCBfree(cpuProcess);cpuBusy = 0;}// 更新就绪队列和阻塞队列里的进程信息blockQueUpdate();readyQueUpdate();// 查看就绪队列和阻塞队列的进程信息readyQueWalk();blockQueWalk();if ((cpuProcess -> startBlock) > 0) {blockQuePush(cpuProcess);cpuProcess = readyQuePop();}else {if (cpuBusy == 1 && readyQueNum > 0 && cpuProcess->priority < readyMaxPriority()){readyQuePush(cpuProcess);cpuProcess = readyQuePop();}}}printf("\n模拟进程调度算法结束2145115 刘成路\n");return 0;}【运行截图】实验2使用动态分区分配方式的模拟1、实验目的(1)了解动态分区分配方式中使用的数据结构和分配算法(2)加深对动态分区存储管理方式及其实现过程的理解。
实验1__OpenGL基本图形绘制[整理版]
实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。
二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。
3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。
VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。
选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。
简单osg图形绘制
使用vc++ 9.0建立简单的场景图形一、创建vc++工程打开vc++应用程序,在菜单栏中选择“文件”->“新建”->“项目”。
出现新建项目对话框。
在左侧的“项目类型”中,选择“Visual C++”->“win 32”,在右侧选择“win32 控制台应用程序”,在下面的“名称”编辑框内输入工程名,选择工程的位置,点击“确定”。
如图所示:在跳出的“win32 应用程序向导”中点击“完成”。
二、Osg源码的建立及分析2.1 代码分析此时生成的工程中,stdafx.h 、targetver.h、stdafx.cpp均是vc++程序自己创建的,我们自己的代码的主函数则是写在工程名同名的cpp文件中。
例程:绘制直线#include "stdafx.h"#include <osg/Group>#include <osg/Geode>#include <osg/Geometry>#include <osgViewer/Viewer>#include <osg/PositionAttitudeTransform>int _tmain(int argc, _TCHAR* argv[]){1 osg::ref_ptr<osg::Group> root = new osg::Group;2 osg::ref_ptr<osg::PositionAttitudeTransform> pa1 = newosg::PositionAttitudeTransform;3 root->addChild(pa1.get());4 osg::Vec3 pStart = osg::Vec3(0,0,0);5 osg::Vec3 pEnd = osg::Vec3(0.5,0,0);6 pa1->setPosition(pStart);//节点pa1的位置7 osg::Vec3Array* coords = new osg::Vec3Array;8 coords->push_back(pStart);9 coords->push_back(pEnd);10 osg::Vec3Array* normals = new osg::Vec3Array;11 normals->push_back(osg::Vec3(0.0f,0.0f,1.0f));12 osg::Vec4Array* colors = new osg::Vec4Array;13 colors->push_back(osg::Vec4(1.0f,0.0f,0.0f,1.0f));14 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;15 geom->setVertexArray(coords);16 geom->setNormalArray(normals);17 geom->setNormalBinding(osg::Geometry::BIND_OVERALL);18 geom->setColorArray(colors);19 geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);20 geom->addPrimitiveSet(newosg::DrawArrays(osg::PrimitiveSet::LINES,0,2));21 osg::ref_ptr<osg::Geode> geode = new osg::Geode;22 geode->addDrawable(geom.get());23 pa1->addChild(geode.get());24 osg::Vec3 yawAxis(1.f, 0.f, 0.f ); //x轴25 osg::Vec3 pitchAxis(0.f, 1.f, 0.f ); //y轴26 osg::Vec3 rollAxis( 0.f, 0.f, 1.f ); //z轴//旋转四元数,绕y轴逆时针(从正方向看)旋转°27 osg::Quat q1(0, yawAxis, osg::PI/2.0,pitchAxis, 0, rollAxis);28 //pa1->setAttitude(q1);//对节点pa1进行旋转29 osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;30 viewer->setSceneData(root.get());31 viewer->realize();32 viewer->run();}这个程序主要包括以下几个部分:(1)建立根节点;(2)建立位置属性变换节点,对其进行设置,并将其加到根节点上;(3)建立几何节点,即线段。
osg贝塞尔曲线
osg贝塞尔曲线OSG贝塞尔曲线是OpenSceneGraph(OSG)中预定义的一种曲线类型,它是由一系列控制点定义的曲线。
贝塞尔曲线使用数学公式来插值控制点之间的点,从而形成平滑的曲线形状。
在OSG中,可以使用`osg::Bezier`类来创建和操作贝塞尔曲线。
在创建贝塞尔曲线之前,需要指定控制点列表。
控制点由`osg::Vec3`类型的二维或三维点坐标表示。
以下是使用OSG创建贝塞尔曲线的示例代码:```cpposg::ref_ptr<osg::Vec3Array> controlPoints = newosg::Vec3Array;controlPoints->push_back(osg::Vec3(0, 0, 0)); // 第一个控制点controlPoints->push_back(osg::Vec3(1, 0, 0)); // 第二个控制点controlPoints->push_back(osg::Vec3(1, 1, 0)); // 第三个控制点controlPoints->push_back(osg::Vec3(2, 1, 0)); // 第四个控制点osg::ref_ptr<osg::Bezier> bezierCurve = new osg::Bezier; bezierCurve->setControlPoints(controlPoints);osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry; geometry->setVertexArray(bezierCurve->getVertices());// 将geometry添加到场景图中进行渲染```在这个示例中,我们创建了一个包含四个控制点的贝塞尔曲线,并将其设置为`osg::Geometry`的顶点数组。
使用OSG创建一个简单的地形
使用OSG创建一个简单的地形1.解决方案在网上参考了一些资料,使用OSG创建地形最简单的办法就是使用OSG::HeightField类,它是描述类似于DEM网格的四角面片。
首先给出具体实现代码:#include <iostream>#include <Windows.h>#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osg/Texture2D>#include <osg/ShapeDrawable>#include <gdal_priv.h>using namespace std;using namespace osg;using namespace osgViewer;//实现函数:从高程图创建地形osg::Node* createHeightField(std::string heightFile, std::strin g texFile){//读取高度文件GDALAllRegister(); //GDAL所有操作都需要先注册格式CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); //支持中文路径GDALDataset* img = (GDALDataset *)GDALOpen(heightFile. c_str(), GA_ReadOnly);if (!img){return nullptr;}//读取基本参数int imgWidth = img->GetRasterXSize(); //图像宽度int imgHeight = img->GetRasterYSize(); //图像高度int bandNum = img->GetRasterCount(); //波段数int depth = GDALGetDataTypeSize(img->GetRasterBand(1)->GetRasterDataType()) / 8; //图像深度//获取地理坐标信息double padfTransform[6];if (img->GetGeoTransform(padfTransform) == CE_Failure) {return nullptr;}double startX = padfTransform[0] + 0.5 * padfTransform[1];/ /左上角点坐标Xdouble dX = padfTransform[1];//X方向的分辨率double startY = padfTransform[3] + padfTransform[5] * img Height - 0.5 * padfTransform[5];//左下角点坐标Ydouble dY = -padfTransform[5];//Y方向的分辨率//申请bufint bufWidth = imgWidth;int bufHeight = imgHeight;size_t imgBufNum = (size_t)bufWidth * bufHeight * bandNu m;float *imgBuf = new float[imgBufNum];//读取size_t imgBufOffset = (size_t)bufWidth * (bufHeight - 1) * ba ndNum;img->RasterIO(GF_Read, 0, 0, bufWidth, bufHeight, imgBuf + imgBufOffset, bufWidth, bufHeight,GDT_Float32, bandNum, nullptr, bandNum*depth, -bufWidth*bandNum*depth, depth);//定义并设置高度文件osg::ref_ptr<osg::HeightField> heightField = new osg::Heig htField();heightField->allocate(imgWidth, imgHeight);//申请空间heightField->setOrigin(osg::Vec3(startX, startY, 0));//起始位置heightField->setXInterval(dX);//间距XheightField->setYInterval(dY);//间距YheightField->setSkirtHeight(1.0f);//填充高度值for (int r = 0; r < imgHeight; r++){for (int c = 0; c < imgWidth; c++){size_t m = (size_t)r * imgWidth + c;heightField->setHeight(c, r, imgBuf[m]);}}//释放delete[] imgBuf;imgBuf = nullptr;//节点osg::Geode* geode = new osg::Geode();osg::ref_ptr<osg::ShapeDrawable> heightShape = new osg:: ShapeDrawable(heightField.get());geode->addDrawable(heightShape);//设置纹理osg::ref_ptr<osg::Image> texImage = osgDB::readImageFile (texFile);osg::ref_ptr<osg::T exture2D> tex = new osg::Texture2D;tex->setImage(texImage);tex->setDataVariance(osg::Object::DYNAMIC);//渲染状态osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();stateset->setTextureAttributeAndModes(0, tex.get(), osg::St ateAttribute::ON);geode->setStateSet(stateset.get());return geode;}int main(){osgViewer::Viewer viewer;osg::ref_ptr<osg::Group> group = new osg::Group;std::string heightFile = "D:\\Data\\dst.tif";std::string texFile = "D:\\Data\\dom3_Level_19.jpg";group->addChild(createHeightField(heightFile, texFile));viewer.setSceneData(group);viewer.setUpViewInWindow(100, 100, 800, 600);return viewer.run();}其运行结果如下,显示的是美国大峡谷(Grand Canyon)中的一小块:1)使用TIF格式的DEM因为不太清楚别的网上资料里面地形文件是jpg格式的,要知道jpg格式只能8位且没有地理信息,所以在这里我直接使用的是GTiff格式的DEM。
【教育资料】六年级上信息技术教案-初学画图-基本绘图命令(一)_宁夏版学习精品
(4)BK后退命令
格式:BK步数
功能:命令小海龟后退指定的步数。
(5)RT向右转命令
格式:RT角度
功能:命令小海龟向右(顺时针方向)转指定的角度。
(6)HOME回家命令
格式:HOME
功能:使小海龟回到母位。小海龟在回家的路上,会留下足迹。
三、练习
用LOGO的基本绘图命令画小树杈、直角三角形。
四、小结
通过画小树杈、直角三角形,学生基本掌握LOGO的基本绘图命令,也调动了学生学习LOGO语言的兴趣。
课时计划
第3课时
课题
初学画图-基本绘图命令(一)(练习)
教学
目标
(1)使学生熟悉使用基本绘图命令。
(2)培养学生良好的学习习惯。
教学
重点、难点
FD、BK、LT、RT命令的运用。
教具
LOGO语言平台
二、新授
1、母位和小海龟方向
母位:也称初始位置,即小海龟在屏幕中心,龟头向上。
小海龟方向:龟头所指的方向。
2、命令
(1)FD前进命令
格式:FD步数
功能:命令小海龟按当前方向前进指定的步数。
(2)CS清屏复位命令
格式:CS
功能:将绘图屏幕清理干净,并让小海龟回到母位(头向上)。
(3)LT向左转命令
格式:LT角度
教案的教学反思怎么写
教
探究学习法教师教材Leabharlann 生学故乡红叶阅读题及答案过
更基础更广泛更深厚的自信
任务标题
程
教育调查报告小学
机器人教学存在的问题一、复习导入
这节课我们继续学习怎样使用LOGO的绘图命令指挥小海龟画图。
osg几何体顶点坐标单位
osg几何体顶点坐标单位摘要:1.OSG 几何体简介2.几何体顶点坐标的单位3.几何体顶点坐标的转换4.应用实例正文:1.OSG 几何体简介OSG(Open Scene Graph)是一款开源的图形渲染引擎,广泛应用于三维计算机图形学、虚拟现实、游戏开发等领域。
在OSG 中,几何体是构建3D 场景的基本元素,它可以是简单的几何体如立方体、球体,也可以是复杂的模型如人体、建筑等。
几何体由顶点、线段和面片组成,其中顶点是几何体的基本构建块,通过顶点可以描述几何体的形状和位置。
2.几何体顶点坐标的单位在OSG 中,几何体顶点坐标的单位通常是浮点数,表示一个三维空间中的点。
这个单位可以是任意的,但为了保证渲染的准确性,一般会选择一个合适的单位,例如米、厘米等。
在实际应用中,为了方便计算和渲染,可以将顶点坐标的单位设置为相同的值,例如全部设置为米。
3.几何体顶点坐标的转换在3D 图形渲染中,由于不同的几何体可能具有不同的坐标系,因此需要对顶点坐标进行转换。
OSG 提供了一些函数来实现坐标转换,例如osg::convert() 函数。
通过这个函数,可以将一个几何体的顶点坐标转换为另一个坐标系下的顶点坐标。
例如,将一个局部坐标系下的顶点坐标转换为世界坐标系下的顶点坐标。
4.应用实例假设我们有一个立方体几何体,它的顶点坐标如下:```顶点1:(1, 1, 1)顶点2:(1, -1, 1)顶点3:(-1, -1, 1)顶点4:(-1, 1, 1)顶点5:(1, 1, -1)顶点6:(1, -1, -1)顶点7:(-1, -1, -1)顶点8:(-1, 1, -1)```现在,我们需要将这个立方体从局部坐标系转换到世界坐标系。
首先,创建一个osg::Node 对象,然后将立方体的顶点坐标添加到该节点的vertexData 中。
接下来,创建一个osg::Geode 对象,将节点设置为该几何体的节点,并将几何体类型设置为osg::Geode::GEOMETRY_CUBE。
OSG基础虚拟现实仿真软件编程技术讲解与实战
(3)、完善程序
由于Viewer类在程序开始会根据模型的包围盒调整视点初始位 置,这样能保证程序开始能看到模型,但是因为我们的模型是运动的, 运行一点之后飞机会飞出视线,所以我们给飞机提供一个场地,这个 场地就是一个正方体,代码如下: osg::Group* root = new osg::Group(); osg::Geode* geode = new osg::Geode(); geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0f, 0.0f, -20.0f), 200.0f, 200.0f, 2.0f))); root->addChild(geode); CCessna* cessna = new CCessna(); root->addChild(cessna); viewer.setSceneData(root); 这里用到了Geode 类和Drawable类的子类ShapeDrawable, Geode 是场景图的叶子节点,所有的几何体都包含在 Geode 里,而 一个 Geode 里可以有多个Drawable的子类,我们看到的图像真正是 Drawable画的,这个后面在讨论。
总结:OSG的Viewer类本身提供了很多功能,所以,只需要简单 的几句代码,就能有一个不错的程序,这些功能如果用OpenGL实现, 需要很多的时间。当不再为这些基础功能操心的时候,我们就能把精 力放在我们要实现的功能上面。
osg基本几何图元
osg基本⼏何图元转⾃://osg 基本⼏何图元// ogs中所有加⼊场景中的数据都会加⼊到⼀个Group类对象中,⼏何图元作为⼀个对象由osg::Geode类来组织管理。
// 绘制⼏何图元对象时,先创建⼀个Geometry对象,这个对象中要设置绘制所需的基本信息,图元的顶点、顶点颜⾊、顶点关联⽅式以及法线。
#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osg/Node>#include <osg/Geode>#include <osg/Geometry>int main(int argc, char** argv){osgViewer::Viewer view;osg::ref_ptr<osg::Group> root = new osg::Group;#pragma region ⼏何图元模块osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;//定义顶点osg::ref_ptr<osg::Vec3Array> vertexArray = new osg::Vec3Array;geometry->setVertexArray(vertexArray);vertexArray->push_back(osg::Vec3(-1.f, 0.f, 1.f));vertexArray->push_back(osg::Vec3(1.f, 0.f, -1.f));vertexArray->push_back(osg::Vec3(1.f, 0.f, 1.f));//定义颜⾊数组osg::ref_ptr<osg::Vec4Array> colorArray = new osg::Vec4Array();geometry->setColorArray(colorArray);geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);colorArray->push_back(osg::Vec4(1.f, 0.f, 0.f, 1.f));colorArray->push_back(osg::Vec4(0.f, 1.f, 0.f, 1.f));colorArray->push_back(osg::Vec4(0.f, 0.f, 1.f, 1.f));//定义法线osg::ref_ptr<osg::Vec3Array> normalArray = new osg::Vec3Array();geometry->setNormalArray(normalArray);geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);normalArray->push_back(osg::Vec3(0.f, -1.f, 0.f));//设置顶点关联⽅式//PrimitiveSet类,这个类松散地封装了OpenGL的绘图基元,//包括点(POINTS),线(LINES),多段线(LINE_STRIP),封闭线(LINE_LOOP),四边形(QUADS),多边形(POLYGON)等。
osg初级教程
几何体的绘制概述本章将介绍一些创建几何体元素的方法。
通常我们有这样几种处理几何体的手段:底层手段是使用松散封装的OpenGL基元;中级手段是使用 OpenSceneGraph的基本几何体;高级手段是从文件读入模型。
本章教程将主要介绍底层手段的实现方法。
这种实现具有很强的灵活性,相应的工作量也比较大。
应用于场景图形级别的几何体通常是从文件读入的,因而顶点的跟踪和处理工作将由文件读取插件完成。
背景下面将对几个常用的类作简要的介绍:∙Geode类Geode类派生自Node节点类。
节点类(包括Geode)可以作为场景图形的叶节点添加。
Geode 类的实例可以与任意多个可绘制对象Drawable类相关联。
∙Drawable类作为可绘制对象基类的Drawable类是一个纯虚类,它有六个派生类。
其中Geometry类中可以直接指定顶点数据,或者指定任意数目的几何基元PrimitiveSet类与其关联。
顶点和顶点属性数据(颜色,法线,纹理坐标)是保存在数组中的。
多个顶点可以共享同一种颜色,法线和纹理坐标,同时我们还可以使用索引将顶点数组映射给颜色,法线或纹理坐标的数组。
∙PrimitiveSet类这个类松散地封装了OpenGL的绘图基元,包括点(POINTS),线(LINES),多段线(LINE_STRIP),封闭线(LINE_LOOP),四边形(QUADS),多边形(POLYGON)等。
代码下面的代码将设置一个用于显示场景的视窗,一个作为场景图形根节点的Group类实例,一个用于记录可绘制对象(Drawable)的几何体节点(Geode),以及一个记录顶点和顶点相关数据的Geometry类实例。
本例中我们将渲染一个金字塔的形状。
...int main(){...osg::Group* root = new osg::Group();osg::Geode* pyramidGeode = new osg::Geode();osg::Geometry* pyramidGeometry = new osg::Geometry();现在我们将金字塔几何体与Geode关联,并将Geode叶节点添加到场景图形的根节点。
OSG 游戏_物冨画制作(一)
OSG/OpenGL游戏人物动画的制作杨晓康电子邮件:kangkang116911@写在最前:本人主要从事图形图象工作,空闲之余接触了一些游戏编程,特写一些编程心得,本文适合没有接触过人物动画编程的初学者,希望游戏制作的大虾们指点,交流。
在以前还有没接触人物动画编程的时候,觉得通过编程让人物动起来一定是一件很麻烦的事情,尤其是初学者,大都会摸不着头脑,碰到诸如骨骼动画之类,似乎无从下手。
但是当你了解了它们的格式,就会发现其实真正的人物动画的制作并不是在编程阶段,而是在模型构建阶段,程序员主要做工作的是掌握模型文件的格式,将存储在人物模型中的各种信息,如顶点,面片,材质,骨骼或顶点运动的关键帧序列等信息读入内存然后用你熟悉的SDK 绘制出来,再根据时间采用线性或者球形插值对动作序列的关键帧进行插值,不断变换顶点坐标,从而得到了一系列连续的人物动画,听起来确实不难吧!当然你也可以在程序里自己控制人物每一帧每一个关节的运动,我想做游戏的很少有人这么做吧。
下面我向大家介绍一下自己是如何编写人物动画程序的。
本人从事的图形图象开发主要是基于OpenGL和OSG 因此范例程序将采用OpenGL或OSG。
先声明一下,本人的语言表达能力很差,请大家多多谅解指正。
考虑到没有接触过人物模型的朋友,我首先从人物模型的结构讲起,游戏人物编程主要采用的人物模型格式有Quake里的md2,md3,Half Life里的mdl,Doom里的md5,还有典型的骨骼动画模型ms3d…,至于3dmax的模型,本人觉得太麻烦!在此我说两个有代表性的Md3,和ms3d,其它的模型都大同小异,只要你了解了它们的格式,程序实现都不难。
MD2:说起Md3模型文件,又不得不提一下Md2。
Md2是Quake II采用的一种人物模型文件,它的格式比较简单,一个人物采用一个Md2文件就可以表示,但是文件冗余度比较大。
下面是Md2文件原始的结构:可以形象的表示如下从上面可以看出这种文件的每一个关键帧里存储了整个人物的所有顶点,也就是说如果有n 个关键帧就存储了n遍人物的顶点信息。
PS实验操作大学计算机基础
六多媒体技术本文件为大学计算机基础课程组编写的实验教材内容,仅限该课程组的学生上机实验使用。
版权所有,翻录必究。
PhotoShop 图像处理基础实验一 图像合成一.实验目的熟悉抠图操作,了解图层的概念。
二.实验要求抠图并完成图像合成。
原始图片如图6-1所示,最终效果为图6-2。
图6-1 素材图像图6-2 合成效果三.实验步骤打开Photoshop CS5,其工作界面如图6-3所示。
工作区左侧的工具栏,包含了常用的图像绘制和处理工具。
在工具栏中选择一种工具后,可在上方的选项栏设置参数。
调板区包括实现不同编辑功能的常用面板,可以完成各种图像处理和编辑。
执行“文件→打开”命令(Ctrl+O ),打开“素材”文件夹中图像文件“6-1baby.jpg ”。
1.选择图像利用工具栏中的“快速选择工具”(W )选择图中小孩的全身。
大致选择下来即可,不需要很精细,如图6-4所示。
2.调整边缘图6-3 Photoshop CS5 工作界面选项栏工具栏 调板区执行“选择→调整边缘”或单击快速工具栏中“调整边缘”(alt+ctrl+r),在弹出的对话框中点击“视图模式”的“视图”,弹出下拉选项,可以在7个模式下观看图像状态(如图6-5),此处选择“黑底模式”。
❶利用边缘检测功能去除边缘:勾选“智能半径”,此处设置半径值为50。
如图6-6所示。
❷使用“调整半径工具”笔刷来回涂抹抠出头发等细微部分。
如涂得过多可用“涂抹调整工具”修改。
如图6-7,按“Alt”键可在两个工具间切换。
❸设置调整边缘部分参数,调整边缘的杂色与对比度,减少边缘杂色。
可边观察图像边设置。
此例设置为平滑:6,对比度:10%,移除边缘:-16%。
❹在输出部分,勾选“净化颜色”,去除边缘半透明色,此例设置数量为80%。
在“输出到”下拉选项中选择“新增带有图层蒙版的图层”,如图6-7所示。
图6-6 边缘检测图6-7 边缘调整❺此时在“图层”面板中可以看到新建的带有图层蒙版的图层,如图6-8所示。
三维渲染引擎设计与实践(一)
三维渲染引擎设计与实践(⼀)⼀、初始osg三维渲染引擎:为了实现三维场景图形的结构管理和绘制⽽提供的⼀系列API的集合。
包括构建层和交互层。
Crystal Space、Java3D、Unreal……osg库:构件场景图形的场景图形节点类、⽤作向量和矩阵运算的类;可绘制体和⼏何体类;⽤于描述和管理渲染状态的类;以及图形程序所需的典型功能类。
osgDB库:⽤于2D和3D⽂件读写的插件类注册器,以及⽤于访问和读写这些插件的特定功能类;数据的动态分页调度机制osgUtil库:实⽤⼯具库。
包括场景图形数据统计和优化⼯具、渲染后台⼯具、场景剪裁⼯具;以及⼤量⼏何操作相关的类osgGA库:提供各种视景窗⼝交互事件的管理⼯具,⽤于构建⼀个与平台⽆关的⼈机设备抽象层osgView库:视景器⼯具库osgAnimation:场景动画处理库osgFX:场景特效库osgManipulator:场景对象操控库osgParticle:粒⼦特效库osgShadow:阴影特效库osgSim:仿真⼯具库osgTerrain:地形处理库osgText:⽂字处理库osgVolume:体渲染实现库osgWidget:三维控件库三、开发预备知识3.1 向量向量的点积(数量积、内积),也就是两个向量各分向量乘积之和,结果为⼀个标量AB = |A||B|cos<A,B>=x1*x2 + y1*y2 + z1*z2向量的叉积(向量积),结果为⼀个垂直于原向量的新向量。
|A×B| = |A||B|sin<A,B> A×B=( y1z2 - y2z1 , x1z2 - x2z1 , x1y2 - x2y1)转置加减点积(两个四元数各分量乘积之和)共轭 Quat表达矩阵加减数乘转置逆 osgMatrixd包围体包围球和轴对称包围盒 osgBoundingBoxImpl3.2数组对象OSG的数组⽤途:1.表达单精度或双精度的浮点数据,包括数值、多维向量等,以便⽤于OpenGL顶点坐标(vec3)、颜⾊(vec4)、纹理坐标(vec2)等属性数组的设置;2、表达顶点数据的索引,此时数组的元素⼀般是整数类型,索引数组在绘制OpenGL⼏何图元时尤为常见。
OSG绘制基本图形实验一
天津理工大学计算机科学与技术学院实验报告2015 至2016 学年第二学期实验题目:osg::PrimitiveSet::TRIANGLE_STRIPosg::PrimitiveSet::TRIANGLE_FAN )。
2. 实现各自名字的绘制。
3. 颜色的设置要合适。
实验要求:1. 设计结构合理、扩展灵活。
2. 每个设备类独立封装。
3. 提交电子版实验报告及工程代码,模板实验过程与实验结果(可包括实验实施的步骤、 算法描述、流程、结论等)1. 绘制基本形状 osg::PrimitiveSet::LINESosg::PrimitiveSet:丄INE_LOOP osg::PrimitiveSet::QUADS( osg::PrimitiveSet::POINTSosg::PrimitiveSet::LINE_STRIP ,osg::PrimitiveSet::POL YGON osg::PrimitiveSet::QUAD_STRIP试验报告模板可参考计算机学院统 4.提交的工程代码必须删除其中的 Debug 或Release 文件夹节点模型:z---- Node--- 、,实验步骤丄三心1. 在纸上绘制草图,建立三维坐标系,并在坐标系中画出个图形,并设定f各点坐标,使其坐标符合逻辑,G以供绘制图形坐标的选择;2. 仓U建Group 节点,Geode节点,Geomotry 节点,3. 创建顶点坐标数组,颜色数组,法唆数组;4. 实现基本绘制。
流程图:r ---------------广---- -- 开始---- ---- 、结束附录(可包括源程序清单或其它说明)源代码:#include <Windows.h>#include<osg/Geode>#include<osgDB/ReadFile> #include<osgUtil/SmoothingVisitor>#include<osgViewer/Viewer> #include <osg/Geometry>#include<osg/Matrixd>#include<osg/MatrixTransform>#include<osg/ShapeDrawable>#include<osgText/Text>#include <osgText/Font>#include <locale.h>void createContent1(osgText::Text& textObject,const char* string);osg::Geode* draw(){osg::ref_ptr<osg::Node> node = new osg::Node; osg::ref_ptr<osg::Group> group = new osg::Group; osg::ref_ptr<osg::Geode> geode = newosg::Geode; osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> color = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> normal =new osg::Vec3Array;point->push_back(osg::Vec3(0,0,0)); point->push_back(osg::Vec3(0,3,0)); color->push_back(osg::Vec3(0,0,0)); color->push_back(osg::Vec3(0,0,0)); point->push_back(osg::Vec3(-20,0,20)); point->push_back(osg::Vec3(-15,0,20)); point->push_back(osg::Vec3(-15,0,18));point->push_back(osg::Vec3(-20,0,18));color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-14,0,20)); point->push_back(osg::Vec3(-10,0,20)); point->push_back(osg::Vec3(-10,0,18));point->push_back(osg::Vec3(-14,0,18));color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-9,0,20));point->push_back(osg::Vec3(-6,0,20));point->push_back(osg::Vec3(-6,0,18));point->push_back(osg::Vec3(-9,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-5,0,20));point->push_back(osg::Vec3(-3,0,21));point->push_back(osg::Vec3(-1,0,20));point->push_back(osg::Vec3(-1,0,19));point->push_back(osg::Vec3(-3,0,18));point->push_back(osg::Vec3(-5,0,19));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));color->push_back(osg::Vec3(0,0.7,0.5));color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(0,0,20)); point->push_back(osg::Vec3(1,0,20));point->push_back(osg::Vec3(1,0,18));point->push_back(osg::Vec3(0,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-20,0,15));point->push_back(osg::Vec3(-20,0,11));point->push_back(osg::Vec3(-15,0,11));point->push_back(osg::Vec3(-15,0,15));point->push_back(osg::Vec3(-12,0,9));point->push_back(osg::Vec3(-12,0,13));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));color->push_back(osg::Vec3(0,0.7,0.5));color->push_back(osg::Vec3(1,1,1));point->push_back(osg::Vec3(-11,0,15));point->push_back(osg::Vec3(-11,0,11));point->push_back(osg::Vec3(-9,0,15)); point->push_back(osg::Vec3(-9,0,11)); point->push_back(osg::Vec3(-7,0,13)); point->push_back(osg::Vec3(-7,0,9)); color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); color->push_back(osg::Vec3(0,0.7,0.5)); color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(-5,0,10)); point->push_back(osg::Vec3(-1,0,15)); point->push_back(osg::Vec3(1,0,10)); point->push_back(osg::Vec3(-1,0,5)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-20,0,-1)); point->push_back(osg::Vec3(-16,0,5)); point->push_back(osg::Vec3(-14,0,-1)); point->push_back(osg::Vec3(-16,0,-6)); color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-12,0,-1));point->push_back(osg::Vec3(-8,0,5));point->push_back(osg::Vec3(-6,0,-1));point->push_back(osg::Vec3(-8,0,-6));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));normal->push_back(osg::Vec3(0,-1,0));geometry->setVertexArray(point.get());geometry->setColorArray(color.get());geometry->setNormalArray(normal.get());geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::POINTS,0,2));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINES,2,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,6,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,10,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::POLYGON,14,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_LOOP,20,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::QUADS,24,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::QUAD_STRIP,30,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLES,36,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_STRIP,40,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_FAN,44,4));setlocale(LC_ALL,".936");// 配置地域化信息const char* titleString="zhengzhanwei"; osg::ref_ptr<osgText::Text> text0 =new osgText::Text; osg::ref_ptr<osgText::Font> font = new osgText::Font();font = osgText::readFontFile("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFont(font.get());//text0->setFont("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFontResolution( 128, 128 ); text0->setColor(osg::Vec4(255, 0, 0,1)); text0->setCharacterSize( .6f ); text0->setPosition( osg::Vec3( 0.f, 0.f,0.f ) ); text0->setAxisAlignment( osgText::Text::XZ_PLANE );text0->setAlignment( osgText::Text::CENTER_TOP );createContent1(*text0,titleString); geode->addDrawable( text0.get() );geode->addDrawable(geometry); return geode.release();}void createContent1(osgText::Text& textObject,const char* string){int requiredSize=mbstowcs(NULL,string,0);// 如果mbstowcs 第一参数为NULL那么返回字符串的数目wchar_t* wText=new wchar_t[requiredSize+1];mbstowcs(wText,string,requiredSize+1);// 由char 转换成wchar 类textObject.setText(wText);delete wText;int main(int argc,char ** argv){osgViewer::Viewer viewer;viewer.setSceneData(draw());return viewer.run();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
天津理工大学计算机科学与技术学院实验报告2015 至 2016 学年第二学期源代码:#include <Windows.h>#include<osg/Geode>#include<osgDB/ReadFile>#include<osgUtil/SmoothingVisitor>#include<osgViewer/Viewer>#include <osg/Geometry>#include<osg/Matrixd>#include<osg/MatrixTransform>#include<osg/ShapeDrawable>#include<osgText/Text>#include <osgText/Font>#include <locale.h>void createContent1(osgText::Text& textObject,const char* string); osg::Geode* draw(){osg::ref_ptr<osg::Node> node = new osg::Node;osg::ref_ptr<osg::Group> group = new osg::Group;osg::ref_ptr<osg::Geode> geode = new osg::Geode;osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> color = new osg::Vec3Array;osg::ref_ptr<osg::Vec3Array> normal =new osg::Vec3Array;point->push_back(osg::Vec3(0,0,0));point->push_back(osg::Vec3(0,3,0));color->push_back(osg::Vec3(0,0,0));color->push_back(osg::Vec3(0,0,0));point->push_back(osg::Vec3(-20,0,20));point->push_back(osg::Vec3(-15,0,20));point->push_back(osg::Vec3(-15,0,18));point->push_back(osg::Vec3(-20,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-14,0,20));point->push_back(osg::Vec3(-10,0,20));point->push_back(osg::Vec3(-10,0,18));point->push_back(osg::Vec3(-14,0,18));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-9,0,20));point->push_back(osg::Vec3(-6,0,20));point->push_back(osg::Vec3(-6,0,18));color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-5,0,20)); point->push_back(osg::Vec3(-3,0,21)); point->push_back(osg::Vec3(-1,0,20)); point->push_back(osg::Vec3(-1,0,19)); point->push_back(osg::Vec3(-3,0,18)); point->push_back(osg::Vec3(-5,0,19)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); color->push_back(osg::Vec3(0,0.7,0.5)); color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(0,0,20)); point->push_back(osg::Vec3(1,0,20)); point->push_back(osg::Vec3(1,0,18)); point->push_back(osg::Vec3(0,0,18)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); point->push_back(osg::Vec3(-20,0,15)); point->push_back(osg::Vec3(-20,0,11)); point->push_back(osg::Vec3(-15,0,11)); point->push_back(osg::Vec3(-15,0,15)); point->push_back(osg::Vec3(-12,0,9)); point->push_back(osg::Vec3(-12,0,13)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0)); color->push_back(osg::Vec3(0,1,1)); color->push_back(osg::Vec3(1,1,0)); color->push_back(osg::Vec3(0,0.7,0.5)); color->push_back(osg::Vec3(1,1,1)); point->push_back(osg::Vec3(-11,0,15)); point->push_back(osg::Vec3(-11,0,11)); point->push_back(osg::Vec3(-9,0,15)); point->push_back(osg::Vec3(-9,0,11)); point->push_back(osg::Vec3(-7,0,13)); point->push_back(osg::Vec3(-7,0,9)); color->push_back(osg::Vec3(1,0,0)); color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,0.7,0.5));color->push_back(osg::Vec3(1,1,1));point->push_back(osg::Vec3(-5,0,10));point->push_back(osg::Vec3(-1,0,15));point->push_back(osg::Vec3(1,0,10));point->push_back(osg::Vec3(-1,0,5));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-20,0,-1));point->push_back(osg::Vec3(-16,0,5));point->push_back(osg::Vec3(-14,0,-1));point->push_back(osg::Vec3(-16,0,-6));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));point->push_back(osg::Vec3(-12,0,-1));point->push_back(osg::Vec3(-8,0,5));point->push_back(osg::Vec3(-6,0,-1));point->push_back(osg::Vec3(-8,0,-6));color->push_back(osg::Vec3(1,0,0));color->push_back(osg::Vec3(0,1,0));color->push_back(osg::Vec3(0,1,1));color->push_back(osg::Vec3(1,1,0));normal->push_back(osg::Vec3(0,-1,0));geometry->setVertexArray(point.get());geometry->setColorArray(color.get());geometry->setNormalArray(normal.get());geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::POINTS,0,2));geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::LINES,2,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,6,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_STRIP,10,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::POLYGON,14,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::LINE_LOOP,20,4));geometry->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::QUADS,24,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::QUAD_STRIP,30,6));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLES,36,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_STRIP,40,4));geometry->addPrimitiveSet(newosg::DrawArrays(osg::DrawArrays::TRIANGLE_FAN,44,4));setlocale(LC_ALL,".936");// 配置地域化信息const char* titleString="zhengzhanwei";osg::ref_ptr<osgText::Text> text0 = new osgText::Text;osg::ref_ptr<osgText::Font> font = new osgText::Font();font = osgText::readFontFile("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFont(font.get());//text0->setFont("C:\\WINDOWS\\Fonts\\simhei.ttf");text0->setFontResolution( 128, 128 );text0->setColor(osg::Vec4(255, 0, 0, 1));text0->setCharacterSize( .6f );text0->setPosition( osg::Vec3( 0.f, 0.f, 0.f ) );text0->setAxisAlignment( osgText::Text::XZ_PLANE );text0->setAlignment( osgText::Text::CENTER_TOP );createContent1(*text0,titleString);geode->addDrawable( text0.get() );geode->addDrawable(geometry);return geode.release();}void createContent1(osgText::Text& textObject,const char* string){int requiredSize=mbstowcs(NULL,string,0);//如果mbstowcs第一参数为NULL那么返回字符串的数目wchar_t* wText=new wchar_t[requiredSize+1];mbstowcs(wText,string,requiredSize+1);//由char转换成wchar类型textObject.setText(wText);delete wText;}int main(int argc,char ** argv){osgViewer::Viewer viewer;viewer.setSceneData(draw());return viewer.run();}。