OSG绘制基本图形实验一
- 格式:docx
- 大小:82.54 KB
- 文档页数:10
实验一基本图形生成一.实验学时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;(二)设计微分画线算法和中点画线算法程序,并进行调试。
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 polytopeintersector 例子`osg::PolytopeIntersector`是 OpenSceneGraph(OSG)中的一个类,用于执行多边形与场景图中其他几何图形的相交测试。
以下是一个简单的示例代码,演示了如何使用`osg::PolytopeIntersector`来进行相交测试:```cpp#include <osg/Group>#include <osg/Geometry>#include <osg/MatrixTransform>#include <osg/PolytopeIntersector>int main() {// 创建一个简单的场景图osg::ref_ptr<osg::Group> root = new osg::Group();// 创建一个多边形几何图形osg::ref_ptr<osg::Geometry> polygon = new osg::Geometry();polygon->setVertexArray(osg::Vec3Array::create());polygon->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::POLYGON, 0, 4));polygon->setColorArray(osg::ColorArray::create());polygon->setColorBinding(osg::Geometry::BIND_OVERALL);// 设置多边形的顶点坐标polygon->getVertexArray()->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));polygon->getVertexArray()->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));polygon->getVertexArray()->push_back(osg::Vec3(1.0f, 1.0f, 0.0f));polygon->getVertexArray()->push_back(osg::Vec3(0.0f, 1.0f, 0.0f));// 将多边形添加到场景图中root->addChild(polygon.get());// 创建一个矩阵变换节点,用于旋转多边形osg::ref_ptr<osg::MatrixTransform> matrix = new osg::MatrixTransform();matrix->setMatrix(osg::Matrix::rotate(osg::inDegrees(45.0f),osg::Vec3(0.0f, 0.0f, 1.0f)));root->addChild(matrix.get());// 创建 PolytopeIntersector 对象osg::PolytopeIntersector intersector;// 设置视角和投影矩阵osg::Camera *camera = new osg::Camera();camera->setViewport(0, 0, 640, 480);camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 640, 0, 480));root->addChild(camera);// 遍历场景图,执行相交测试osg::NodeVisitor nv;nv.setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN);nv.addIntersector(&intersector);root->accept(nv);// 检查是否有相交的结果if (intersector.hits()) {std::cout << "Polygon intersects with scene" << std::endl;// 获取相交的信息const osg::PolytopeIntersector::HitList& hits = intersector.getHits();for (const osg::PolytopeIntersector::Hit& hit : hits) {std::cout << "Intersect at (" << hit.getWorld坐标()[0] << ", " << hit.getWorld坐标()[1] << ")" << std::endl;}} else {std::cout << "Polygon does not intersect with scene" << std::endl;}return 0;}```在上述代码中,我们首先创建了一个包含多边形的场景图。
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在场景中绘制坐标轴(xyz)//x y z font_sizeosg::Geode* makeCoordinate(float a_x,float a_y,float a_z,float font_size){osg::ref_ptr<osg::Sphere> pSphereShape = new osg::Sphere(osg::Vec3(0, 0, 0), 1.0f);osg::ref_ptr<osg::ShapeDrawable> pShapeDrawable = new osg::ShapeDrawable(pSphereShape.get());pShapeDrawable->setColor(osg::Vec4(0.0, 0.0, 0.0, 1.0));//创建保存⼏何信息的对象osg::ref_ptr<osg::Geometry> geom = new osg::Geometry();//创建四个顶点osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(a_x, 0.0f, 0.0f));v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(0.0f, a_y, 0.0f));v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(0.0f, 0.0f, a_z));geom->setVertexArray(v.get());osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array();c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));c->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));c->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));c->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));geom->setColorArray(c.get());geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);//xyzgeom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 0, 2));geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 2, 2));geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES, 4, 2));osg::ref_ptr<osgText::Text> pTextXAuxis1 = new osgText::Text;pTextXAuxis1->setText(L"X");pTextXAuxis1->setFont("Fonts/simhei.ttf");pTextXAuxis1->setAxisAlignment(osgText::Text::SCREEN);pTextXAuxis1->setCharacterSize(font_size);pTextXAuxis1->setPosition(osg::Vec3(a_x, 0.0f, 0.0f));osg::ref_ptr<osgText::Text> pTextYAuxis1 = new osgText::Text;pTextYAuxis1->setText(L"Y");pTextYAuxis1->setFont("Fonts/simhei.ttf");pTextYAuxis1->setAxisAlignment(osgText::Text::SCREEN);pTextYAuxis1->setCharacterSize(font_size);pTextYAuxis1->setPosition(osg::Vec3(0.0f, a_y, 0.0f));osg::ref_ptr<osgText::Text> pTextZAuxis1 = new osgText::Text;pTextZAuxis1->setText(L"Z");pTextZAuxis1->setFont("Fonts/simhei.ttf");pTextZAuxis1->setAxisAlignment(osgText::Text::SCREEN);pTextZAuxis1->setCharacterSize(font_size);pTextZAuxis1->setPosition(osg::Vec3(0.0f, 0.0f, a_z));osg::ref_ptr<osg::Geode> geode = new osg::Geode();geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);geode->getOrCreateStateSet()->setAttribute(new osg::LineWidth(3.0), osg::StateAttribute::ON);geode->addDrawable(pShapeDrawable.get());geode->addDrawable(geom.get());geode->addDrawable(pTextXAuxis1.get());geode->addDrawable(pTextYAuxis1.get());geode->addDrawable(pTextZAuxis1.get());return geode.release();}效果图⽚:。
Photoshop平面设计实验报告书课程: Photoshop平面设计专业:房地产经营与管理班级: 0534111学号: 053411168姓名:付艳2013年3月30日河南城建学院绘图工具使用图像编辑工具的使用实验目的:让学生了解并掌握选区工具、描边、填充、渐变等工具的使用方法实验要求:要求能够按照试验指导书的步骤完成给定的练习实验器材:装有Photoshop的计算机实验一:制作圣诞树实验步骤1,按Ctrl+O组合键选择素材库中素材,选择“矩形选框”工具在图像窗口中绘制矩形选区。
2,选择“移动”工具将选区中的图像拖拽到文件窗口的中心位置,在“图层”控制面板中生成新的图层并将其命名为“卡片”。
3,按Ctrl+O组合键打开素材中“03”,选择“椭圆选框”工具,按住shift键的同时拖拽鼠标绘制圆形选区。
选择“移动”工具,将选区中的图像拖拽到01文件窗口的左下方,在“图层”控制面板中生成新的图层并将其命名为04“绿色小球”。
并依此制成05“星星”,“06红袜子”,07“小鼓”,08“圣诞小马”。
4,按ctrl+O组合键,打开素材09,选择“快速选择”工具,工具属性栏中设置在图像窗口的白色背景区域中单击鼠标,图像周围生成选区。
5,按ctrl+shift+I组合键,将选区反选。
选择“移动”工具,将选区中的图像拖拽到01文件窗口中的右下方,在“图层”控制面板中生成新的图层并命名为“礼品盒”。
圣诞树装饰效果制作完成。
实验二:制作光晕效果实验步骤1,按ctrl+O组合键。
打开素材“制作光晕效果|01”文件,选择“椭圆选框”工具,在图像窗口中拖拽鼠标绘制给椭圆形选区。
2,选择“选择|修改|羽化”命令,弹出“羽化选取”对话框进行设置,单击“确定”按钮。
选择“选择|反向”命令,将选区反选。
3,将前景色设为白色,按Alt+Delete组合键,用前景色填充选区,按ctrl+D组合键,取消选区。
光晕效果制作完成。
实验三:绘制风景画实验步骤1,按ctrl+O组合键,新建一个文件:宽度为15cm,高度为15cm,分辨率为300像素/英寸,颜色模式为RGB,背景内容为白色,单击“确定”按钮。
osg几何体顶点坐标单位摘要:1.OSG简介2.几何体顶点坐标单位的作用3.如何在OSG中设置几何体顶点坐标单位4.实例演示5.总结正文:【1.OSG简介】OSG(Open Scene Graph)是一款开源的三维图形渲染框架,它允许开发者使用硬件加速的图形渲染管道来实现复杂的三维场景。
OSG具有良好的跨平台性,支持多种编程语言,广泛应用于游戏、虚拟现实、科学可视化等领域。
【2.几何体顶点坐标单位的作用】在OSG中,几何体(Geometry)是由顶点(Vertex)、边(Edge)和面(Face)组成的三维图形基本单元。
顶点坐标单位(Vertex Coordinate Unit)用于描述几何体顶点的位置信息。
合理设置顶点坐标单位,可以提高渲染性能,避免不必要的计算错误。
【3.如何在OSG中设置几何体顶点坐标单位】设置几何体顶点坐标单位的方法如下:1)首先,创建一个osg::Geometry对象。
2)使用osg::Geometry::setVertexArrayEnabled()方法启用顶点数组。
3)使用osg::Geometry::setVertexBuffer()方法设置顶点缓冲区。
4)使用osg::Geometry::setUseDisplayList()方法设置是否使用显示列表。
5)使用osg::Geometry::addVertex()方法添加顶点坐标。
【4.实例演示】以下是一个简单的OSG几何体顶点坐标单位设置示例:```cpp#include <osg/Geometry>#include <osg/Geode>#include <osgViewer/Viewer>int main(){osgViewer::Viewer viewer;// 创建一个Geode对象osg::Geode* geode = new osg::Geode;// 创建一个Geometry对象osg::Geometry* geometry = new osg::Geometry;// 设置顶点数组启用geometry->setVertexArrayEnabled(true);// 设置顶点缓冲区osg::ref_ptr<osg::Array> vertices = new osg::Array;vertices->push_back(osg::Vec3(0, 0, 0));vertices->push_back(osg::Vec3(1, 0, 0));vertices->push_back(osg::Vec3(0, 1, 0));geometry->setVertexBuffer(vertices.get());// 设置顶点坐标geometry->addVertex(osg::Vec3(0, 0, 0));geometry->addVertex(osg::Vec3(1, 0, 0));geometry->addVertex(osg::Vec3(0, 1, 0));// 将几何体添加到Geode中geode->addDrawable(geometry);// 设置场景根节点viewer.setSceneData(geode);// 初始化视图viewer.realize();while (!viewer.done()){viewer.frame();}return 0;}```【5.总结】在OSG中,合理设置几何体顶点坐标单位可以提高渲染性能,避免不必要的计算错误。
计算机图形学上机报告计算机图形学上机实验报告计算机科学与技术学院班级:学号:姓名:指导教师:完成⽇期:实验⼀:基本图元绘制⼀. 实验⽬的1. 了解如何利⽤OpenGL库绘制图形2. 理解glut程序框架3. 理解窗⼝到视区的变换4. 理解OpenGL实现动画的原理⼆. 实验内容1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include#include#include "stdio.h"int m_PointNumber = 0; //动画时绘制点的数⽬int m_DrawMode = 4; //绘制模式 1 DDA算法画直线// 2 中点Bresenham算法画直线// 5 四分法绘制椭圆//绘制坐标线void DrawCordinateLine(void){int i = 0 ;//坐标线为⿊⾊glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES);for (i=10;i<=250;i=i+10){glVertex2f((float)(i), 0.0f);glVertex2f((float)(i), 250.0f);glVertex2f(0.0f, (float)(i));glVertex2f(250.0f, (float)(i));}glEnd();}//绘制⼀个点,这⾥⽤⼀个正⽅形表⽰⼀个点。
void putpixel(GLsizei x, GLsizei y){glRectf(10*x,10*y,10*x+10,10*y+10);}void DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {//设置颜⾊glColor3f(1.0f,0.0f,0.0f);//对画线动画进⾏控制if(num == 1)printf("DDA画线算法:各点坐标\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,xIncre,yIncre;x = x0;y = y0;if(abs(dx) > abs(dy)) epsl = abs(dx);else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; k++){putpixel((int)(x+0.5), (int)(y+0.5));if (k>=num-1) {printf("x=%f,y=%f,取整后x=%d,y=%d\n", x, y, (int)(x+0.5),(int)(y+0.5));break;}x += xIncre;y += yIncre;if(x >= 25 || y >= 25) break;}}void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("中点Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,d,UpIncre,DownIncre,x,y,xend=0;if(x0>x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;putpixel(x,y);if (x>=num-1) {break;}x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;if(x >= 50 || y >= 50) break;}}void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) { glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("改进的Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while (x<=x1){putpixel(x,y);if (x>=num-1) {break;}x++;e=e+2*dy;if(e>0){y++;if(x >= 50 || y >= 50) break;}}void BresenhamCircle(GLsizei x, GLsizei y, GLsizei r, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("Bresenham算法画圆:各点坐标及判别式的值\n");x=0,y=r;GLsizei d=1-r;while (xputpixel(x,y);if (x>=num) {break;}putpixel(y,x);if (x>=num) {break;}putpixel(-y,x);if (x>=num) {break;}putpixel(-x,y);if (x>=num) {break;}putpixel(-x,-y);if (x>=num) {break;}putpixel(-y,-x);if (x>=num) {putpixel(y,-x);if (x>=num) {break;}putpixel(x,-y);if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;}}//初始化窗⼝void Initial(void){// 设置窗⼝颜⾊为蓝⾊glClearColor(1.0f, 1.0f, 1.0f, 1.0f);}// 窗⼝⼤⼩改变时调⽤的登记函数void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;// 设置视区尺⼨glViewport(0, 0, w, h);// 重置坐标系统glMatrixMode(GL_PROJECTION); glLoadIdentity();// 建⽴修剪空间的范围if (w <= h)glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); elseglOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); }void ReDraw(void){//⽤当前背景⾊填充窗⼝glClear(GL_COLOR_BUFFER_BIT);//画出坐标线DrawCordinateLine();switch(m_DrawMode){case 1:DDACreateLine(0,0,20,15,m_PointNumber); break;case 2:BresenhamLine(0,0,20,15,m_PointNumber); break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber); break;case 4:BresenhamCircle(5,5,18,m_PointNumber); break;default:break;}glFlush();}//设置时间回调函数void TimerFunc(int value){if(m_PointNumber == 0)value = 1;m_PointNumber = value; glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1); }void Keyboard(unsigned char key, int x, int y){if (key == '1') m_DrawMode = 1;if (key == '2') m_DrawMode = 2;if (key == '3') m_DrawMode = 3;if (key == '4') m_DrawMode = 4;m_PointNumber = 0;glutPostRedisplay();}//void main(void)int main(int argc, char* argv[]){glutInit(&argc, argv);//初始化GLUT库OpenGL窗⼝的显⽰模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("基本图元绘制程序"); glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);//键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);// 窗⼝初始化Initial();glutMainLoop(); //启动主GLUT事件处理循环return 0;}实验⼆:⽇地⽉模型⼀. 实验⽬的1. 理解OpenGL中的变换过程2. 理解透视投影与平⾏投影的不同3. 了解深度测试⼆. 实验内容1. 通过变换调整观察的位置与⽅向三. 实验结果太阳、地球和⽉亮的运动模型图1.图2.图3.四. 源程序#include#include#include#includevoid Initial(){glEnable(GL_DEPTH_TEST); // 启⽤深度测试glFrontFace(GL_CCW); // 指定逆时针绕法表⽰多边形正⾯glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); //背景为⽩⾊}void ChangeSize(int w, int h){if(h == 0) h = 1;// 设置视区尺⼨glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();// 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45.0, fAspect, 1.0, 500.0);/*if (w <= h)glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);elseglOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f); */glLoadIdentity();}void RenderScene(void){// 绕原⼦核旋转的⾓度static float fElect1 = 0.0f;static float f2=0.0f;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();//将图形沿z轴负向移动glTranslatef(0.0f, 0.0f, -250.0f);// 绘制红⾊的原⼦核glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(50.0f, 15, 15);// 当前绘制颜⾊变为黄⾊glColor3f(0.0f, 0.0f, 0.0f);//绘制第⼀个电⼦//保存当前的模型视图矩阵glRotatef(fElect1, 0.0f, 1.0f, 0.0f);//绕y轴旋转⼀定的⾓度glTranslatef(80.0f, 0.0f, 0.0f);//平移⼀段距离glutSolidSphere(12.0f, 15, 15);//画出电⼦// 恢复矩阵// 第⼆个电⼦glPushMatrix();glRotatef(45.0f, 0.0f, 0.0f, 1.0f);glRotatef(f2, 0.0f, 1.0f, 0.0f);glTranslatef(-20.0f, 0.0f, 0.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();/* // 第三个电⼦glPushMatrix();glRotatef(-45.0f,0.0f, 0.0f, 1.0f);glTranslatef(0.0f, 0.0f, 60.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();*/// 增加旋转步长fElect1 += 10.0f;f2=fElect1*6;if(fElect1 > 360.0f){fElect1 = 10.0f;}glutSwapBuffers();}void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100, TimerFunc, 1);}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutCreateWindow("⽇地⽉模型");glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene);glutTimerFunc(500, TimerFunc, 1);Initial();glutMainLoop();return 0;}。
OSG矢量绘制一、配置矢量图层参数设置Driver “ogr”;设置矢量路径"E:/osgEarth/osgearth-2.4/data/world.shp";设置矢量样式颜色Color::Yellow; 宽度2.0f;1、采用几何方式绘制(1)设置几何绘制参数设置驱动“feature_geom”;设置矢量参数为上述矢量图层参数;创建样式表,添加上述样式;设置无光照;(2)根据几何参数,创建model图层参数设置driver为上述几何驱动参数二、将矢量图层加入map复制参数;将图层加入_modelLayers(1)初始化model layer创建可生成节点的_modelSource;{加载modelSource驱动“osgearth_model_feature_geom”}初始化_modelSource{创建可生成矢量的FeatureSource,{加载矢量驱动“osgearth_feature_ogr”}初始化feature source{创建空的_geometry}}(2)有个响应_mapCallbacks的地方可能用于map图层的动态加载三、配置mapnode参数关闭光照;四、根据map,创建mapnode(1)初始化mapnode;创建map引擎实现的基础类T errainEngineNode;加载和关联terrain引擎,直到我们需要时再初始化它。
{加载osgearth_engine_mp驱动validateTerrainOptions()}设置引擎容器_terrainEngineContainer,以便设置光照,设置为动态变量(为啥);初始化terrain引擎{生成地形实用接口_terrainInterface{设置坐标参考类型}}矢量绘制主要步骤:一、配置矢量图层参数设置样式、颜色、路径等相关参数;采用feature_ogr驱动,读取矢量数据二、将矢量图层加入map采用feature_geom驱动,将矢量数据创建成几何对象三、配置mapnode参数关闭光照;四、根据map,创建mapnodeOgr读取矢量数据,得到SRS、范围、矢量点数目、属性字段信息;创建几何体,即读入点数据,将矢量数据读入内存;根据范围裁剪矢量列表;构建几何体,即设置颜色、绘制模式,并转化为三角网组织矢量绘制方法:基于纹理的方法:将矢量数据栅格化为图像数据并采用纹理映射技术将其投影到地形几何表面上。
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都可以满足您的需求,并帮助您实现您的创意。
计算机图形学课程实验:Phong模型目录1 Phong模型 (1)1.1 光源设置 (1)2 光照计算 (3)2.1 定向光 (3)2.2 点光源 (4)2.3 聚光 (4)1 Phong模型接下来,我们来介绍一下Phong模型。
绘制效果如下,我们可以看到,中间的立方体是被照射的对象,有一个定向光源,六个点光源和一个聚光的光源。
图1 效果图我们的程序流程主体还是跟前面的课程相同。
因此我们这节的重点部分就是主要在这两个方面,一个是光源的设置,一个是光照计算。
1.1 光源设置首先是光源的设置,我们这里的光源种类主要有三种,定向光,点光源和聚光,三种光源的效果叠加形成了我们刚才看到的效果。
那么我们在代码中是如何实现的呢?首先我们来看定向光,定向光就是类似太阳这种,它的属性包括定向光的方向,以及环境光,漫反射光,镜面反射光的强度参数。
由于定向光是光源处于无限远处的平行光,因此我们无需指定出定向光光源具体的位置,只需指定其指向的方向即可。
接下来是点光源,我们定义了六个点光源,点光源就是类似灯泡这种,每一个点光源的属性都包括点光源的位置,环境光,漫反射光,和镜面反射光的1强度参数,这里每一个分量都要乘一个点光源的颜色。
那么除此之外点光源与定向光有哪些不同呢?它与定向光不同的是它多了三个属性参数,这三个参数是用来计算衰减公式的三个系数,分别是constant常数项,linear一次项和quadratic二次项,它会使得光线强度随距离的增加不断减小并且衰减的幅度也逐渐减小,这样更接近现实生活中点光源的效果。
我们的第三种光源是聚光,聚光就是类似手电筒的这种效果,聚光的属性也包括聚光光源的位置,方向,这里我们是用摄像机的位置和朝向来指定的,还有环境光,漫反射光,和镜面反射光的强度参数以及三个衰减系数,那么除此之外聚光光源与点光源又有哪些不同呢?这里我们又多了两个参数分别表示我们聚光内外圆锥的内外切光角。
聚光的效果就相当于是一个圆锥的光效,我们这里通过使用两个圆锥来使我们的聚光效果看起来更加平滑。
使用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)建立几何节点,即线段。
如何使用Core Graphics在iOS应用中绘制图形在iOS应用开发中,图形绘制是一个非常常见的需求。
我们可以使用Core Graphics框架来绘制各种各样的图形,包括线条、矩形、圆形、文字等等。
本文将介绍如何使用Core Graphics来实现图形绘制功能,并分享一些实用的技巧和注意事项。
1. 准备工作在开始绘制图形之前,我们需要先准备一个画布,也就是UIView 或CALayer。
可以通过重写UIView的drawRect方法来进行绘制。
在drawRect方法中,我们可以使用UIGraphicsGetCurrentContext函数获取当前绘画上下文,并进行后续的绘制操作。
2. 绘制线条绘制线条是最基本的图形绘制操作之一。
我们可以通过使用CGContextAddLineToPoint函数指定线条的起始点和终点来绘制直线。
示例代码如下:```CGContextRef context = UIGraphicsGetCurrentContext();CGContextMoveToPoint(context, , );CGContextAddLineToPoint(context, , );CGContextStrokePath(context);```其中,startPoint和endPoint是指定线条起始点和终点的CGPoint对象。
通过调用CGContextStrokePath函数,我们可以将绘制的线条显示在画布上。
3. 绘制矩形和圆形除了线条,我们还可以使用Core Graphics来绘制矩形和圆形。
可以通过调用CGContextAddRect函数来绘制矩形,示例代码如下:```CGContextRef context = UIGraphicsGetCurrentContext();CGRect rect = CGRectMake(x, y, width, height);CGContextAddRect(context, rect);CGContextFillRect(context, rect);```其中,x、y、width和height分别指定了矩形的起点、宽度和高度。
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)所示。
几何体的绘制概述本章将介绍一些创建几何体元素的方法。
通常我们有这样几种处理几何体的手段:底层手段是使用松散封装的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三维渲染引擎:为了实现三维场景图形的结构管理和绘制⽽提供的⼀系列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的网格模型简化算法的研究及应用》篇一一、引言在三维图形处理领域,网格模型作为数据表示的一种方式,被广泛应用于虚拟现实、游戏制作、三维建模和计算机视觉等领域。
然而,复杂的网格模型往往导致计算资源的巨大消耗和渲染效率的降低。
因此,网格模型的简化算法成为了研究的热点。
本文将重点研究基于OSG(OpenSceneGraph)的网格模型简化算法,并探讨其在实际应用中的效果。
二、OSG概述OSG(OpenSceneGraph)是一个用于渲染三维图形的开源库,它提供了丰富的三维图形处理功能,包括模型加载、渲染、交互等。
OSG以其高效、灵活和可扩展性在三维图形处理领域得到了广泛应用。
三、网格模型简化算法网格模型简化算法是减少模型顶点数量、优化模型结构的重要手段。
本文将介绍几种常用的网格模型简化算法,包括边坍缩、顶点移除、面片缩减等。
这些算法在简化模型的同时,尽可能地保持模型的几何特征和视觉效果。
四、基于OSG的网格模型简化算法研究本文将重点研究基于OSG的网格模型简化算法,包括算法的实现原理、优化策略以及在OSG中的集成方式。
首先,我们将分析模型的几何特征和拓扑结构,确定简化的目标和约束条件。
然后,根据不同的简化算法,对模型进行逐层简化,并使用误差度量方法评估简化的效果。
最后,我们将对简化后的模型进行优化,包括平滑处理、法线计算等,以进一步提高模型的视觉效果。
五、应用案例分析本部分将通过具体的应用案例,展示基于OSG的网格模型简化算法在实际项目中的应用效果。
我们将选择几个具有代表性的项目,分析在项目中使用网格模型简化算法的必要性、实施过程以及取得的成果。
通过案例分析,我们可以更直观地了解网格模型简化算法在实际项目中的应用价值和效果。
六、实验结果与分析本部分将通过实验数据和图表,对基于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();}。
天津理工大学计算机科学与技术学院实验报告2015 至2016 学年第二学期课程名称计算机图形学学号学生姓名年级专业课程号实验地点实验时间主讲教师辅导教师实验(一)实验名称绘制基本图形软件环境Visual Studio 2010 OSG-3.1.0Windows 7硬件环境2G内存显卡GT610 CPU奔腾双核硬盘320G实验目的1. 理解图形元素显示的基本原理,掌握扫描转换直线段的常用算法原理,扫描转换圆弧的常用算法原理。
2. 熟悉OpenSceneGraph常用几个类(Group,Geode,Geometry,Node,Viewer,osg::Vec3Array)3. 熟悉OpenSceneGraph构建场景的基本框架4. 掌握绘制不同大小和颜色的点的方法5. 掌握绘制不同线型和颜色的直线的方法(直线,折线,环线)6. 掌握绘制彩色多边形边框的方法(各种设备)7. 熟悉OpenSceneGraph的编程环境实验内容(应包括实验题目、实验要求、实验任务等)实验题目:1.绘制基本形状(osg::PrimitiveSet::POINTS,osg::PrimitiveSet::LINES,osg::PrimitiveSet::LINE_STRIP,osg::PrimitiveSet::LINE_LOOP,osg::PrimitiveSet::POLYGON,osg::PrimitiveSet::QUADS,osg::PrimitiveSet::QUAD_STRIP,osg::PrimitiveSet::TRIANGLES,osg::PrimitiveSet::TRIANGLE_STRIP,osg::PrimitiveSet::TRIANGLE_FAN)。
2.实现各自名字的绘制。
3.颜色的设置要合适。
实验要求:1.设计结构合理、扩展灵活。
2.每个设备类独立封装。
3.提交电子版实验报告及工程代码,试验报告模板可参考计算机学院统一模板4.提交的工程代码必须删除其中的Debug或Release文件夹实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)节点模型:NodeGroupGeodeGeometry点线三角形四边形文字实验步骤:1.在纸上绘制草图,建立三维坐标系,并在坐标系中画出个图形,并设定各点坐标,使其坐标符合逻辑,以供绘制图形坐标的选择;2.创建Group节点,Geode节点,Geomotry节点,3.创建顶点坐标数组,颜色数组,法线数组;4.实现基本绘制。
流程图:开始设置顶点坐标,并设置其对应顶点坐标设置顶点坐标与颜色对应关系,为一一对应模式使用addDrawable函数用viewer设置SetSceneData()viewer.run()结束结果展示:源代码:#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)); 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();}。