二维纹理映射

合集下载

纹理映射原理

纹理映射原理

纹理映射原理纹理映射是计算机图形学中一项重要技术,它能够使得我们在二维平面上将纹理贴到三维物体表面,从而增加真实感和细节。

在这个过程中,纹理映射使用了几种关键概念和原理。

首先,纹理映射使用了纹理坐标来描述物体表面上各点和纹理图像中像素的对应关系。

纹理坐标可以看作是物体表面上的一个点在纹理图像中的位置。

通常,纹理坐标是由两个浮点数(u, v)表示,范围一般是[0, 1]。

通过纹理坐标,我们可以在纹理图像中确定应该对应到物体表面上的纹理像素。

当计算机渲染三维物体时,纹理映射的第一步是将纹理坐标映射到物体表面上的每个顶点。

这个过程是通过纹理坐标的插值来实现的,通常使用三角形插值的方法,将纹理坐标从顶点插值到三角形的内部。

一旦顶点的纹理坐标已经确定,接下来的步骤是在三角形内部的每个像素上进行纹理采样。

纹理采样过程是通过纹理过滤器实现的。

常用的纹理过滤器包括最邻近采样、双线性插值和三线性插值等。

最邻近采样是一种简单的方法,它通过找到离目标像素最近的纹理像素进行采样。

双线性插值则是通过对目标像素周围的四个纹理像素进行加权平均来得到采样结果,这样可以平滑过渡纹理。

而三线性插值是双线性插值的扩展,它通过对两个不同分辨率的纹理图像进行双线性插值采样,实现了更好的纹理细节表现。

纹理映射最常用的应用之一是纹理映射贴图。

这是通过将纹理图像贴到三维物体表面来实现纹理映射。

贴图包含了物体表面的颜色和纹理信息,以及表面法线和材质属性等。

在贴图中,每个像素的颜色通常由纹理坐标和相应的纹理采样获得。

通过适当的纹理坐标和纹理过滤器,我们可以在渲染过程中实时调整物体的表面质感,从而产生逼真的效果。

纹理映射还可以用于实现其他图形效果,例如投影纹理映射和镜面反射。

投影纹理映射通过将纹理图像投射到物体表面上,产生伪影的效果。

镜面反射则通过将环境图像或虚拟场景映射到物体表面上,使物体表面看起来像一个镜子,反射周围环境的景象。

综上所述,纹理映射是计算机图形学中的重要技术,通过使用纹理坐标、插值和采样等方法,将纹理图像贴到三维物体表面上,实现细节和真实感的增加。

第三章光照模型纹理映射

第三章光照模型纹理映射

第三章光照模型及纹理映射基本光照模型1.在现实生活中,当光照在非透明物体上时,部分光线被物体吸收,剩余的部分光线被反射。

人眼依靠这种反射光来感知物体的形状、颜色和其他细节。

从光源投向物体的光称为入射光,从物体表面反射回的光称为反射光。

1.1光照模型概述当光照射到物体表面上时,将出现3种情况:●光从物体表面反射,形成反射光●光穿透物体,形成透射光●光被物体吸收,转化成为物体的内能在上述三种情形的光线中,通常只有前2种情形的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。

OpenGL用一种近似的光照模型模拟现实世界的光照效果。

在该模型中,仅当物体表面吸收和反射光线时,光源才会起做作用。

每一个物体表面都假定是由某种特性的材料构成的。

一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能像镜子一样在某个方向强烈地反射入射光。

1.2光照分量在OpenGL的简化光照模型中,将光照分为4个独立的组成部分:辐射光、环境光、漫反射光和镜面反射光。

1)辐射光辐射光是直接从物体或光源发出的,不受任何其他光源的影响。

2)环境光环境光是这样一种光线,它被环境多次反射,以致于连初始方向也难以确定。

这种光线看起来就像来自于所有的方向,当它照在一个物体表面时,它在所有的方向上等量地反射。

3)漫反射光在被照射物体表面的反射光中,那些均匀地向各个方向反射出去的光,称为漫反射光,如黑板反射就属于漫反射光4)镜面反射光镜面反射光是指超一定方向的反射光,如点光源照射光滑金属球表面时,会在球表面形成一个特别亮的区域,呈现所谓的高亮(Highlight>,这就是光源在该物体表面形成的镜面反射光(SpecularLight>。

点光源照射表面光滑的物体时,高亮区域小而亮;而点光源照射表面粗糙的物体时,高亮区域大而不亮。

1.3创建光源光源有许多特性,如颜色、位置、方向等。

不同特性的光源,作用在物体上的效果是不一样的。

uvw编辑器的用法

uvw编辑器的用法

UVW编辑器的用法一、引言UVW编辑器是一种用于处理三维模型的工具,它允许用户通过调整模型的U、V和W坐标来改变模型的形状。

这种工具在3D建模、动画制作、游戏开发等领域有着广泛的应用。

本文将详细介绍UVW编辑器的基本用法,帮助用户更好地理解和使用这种工具。

二、UVW编辑器的基本概念1. U、V、W坐标:在三维空间中,任何一个点都可以由X、Y、Z三个坐标来确定其位置。

同样,对于一个二维平面上的点,我们也可以通过U、V两个坐标来确定其位置。

而W坐标则是用来控制点在三维空间中的深度。

2. UV映射:UV映射是一种将二维纹理图像映射到三维模型表面的技术。

在这个过程中,UV坐标被用来定义二维纹理图像在三维模型上的位置和方向。

三、UVW编辑器的界面介绍UVW编辑器的界面通常包括以下几个部分:1. 菜单栏:包含了所有的操作命令。

2. 工具栏:提供了一些常用的操作工具,如选择工具、移动工具等。

3. 属性栏:显示了当前选中对象的属性信息,如U、V、W坐标等。

4. 工作区:显示了当前的三维模型和二维纹理图像。

四、UVW编辑器的基本操作1. 选择对象:在工作区中点击鼠标左键,可以选择一个对象。

如果需要选择多个对象,可以按住Ctrl键的同时点击鼠标左键。

2. 移动对象:在选择了一个或多个对象后,可以使用移动工具来改变它们的位置。

在工具栏中选择移动工具,然后拖动鼠标,就可以移动选中的对象了。

3. 调整U、V坐标:在选择了一个对象后,可以在属性栏中看到它的U、V坐标。

直接修改这些坐标,就可以改变对象的形状。

4. 调整W坐标:W坐标用来控制对象在三维空间中的深度。

在属性栏中修改W 坐标,就可以改变对象的深度。

五、UVW编辑器的高级操作1. UV映射:UV映射是一种将二维纹理图像映射到三维模型表面的技术。

在UVW编辑器中,可以使用UV映射工具来实现这个功能。

2. UV展开:UV展开是一种将三维模型的表面展开为二维平面的操作。

在UVW 编辑器中,可以使用UV展开工具来实现这个功能。

计算机形学纹理映射基础知识全面解析

计算机形学纹理映射基础知识全面解析

计算机形学纹理映射基础知识全面解析计算机形学纹理映射是图形图像处理中一个重要的技术,它可以将纹理图像映射到三维模型的表面上,使得模型表面呈现出细腻的纹理效果。

在计算机图形学和计算机视觉领域,纹理映射被广泛应用于三维建模、游戏开发、虚拟现实、电影特效等方面。

本文将对计算机形学纹理映射的基础知识进行全面解析,包括纹理的表示、纹理坐标映射、纹理过滤和纹理映射技术的应用等内容。

一、纹理的表示纹理是一种通过图像来描述物体表面外观的技术。

计算机中,纹理可以用一幅位图来表示。

位图是由一系列像素点组成的二维矩阵,每个像素点的颜色值通过RGB模型来表示。

在纹理映射中,我们常用的纹理图像格式有BMP、JPEG、PNG等。

这些图像格式不仅可以表示颜色信息,还可以表示其他图像特征,比如透明度、反射率等。

纹理图像的大小通常是2的幂次方,例如256×256、512×512等。

二、纹理坐标映射纹理映射的基本原理是将纹理图像中的像素映射到模型表面上的坐标。

为了实现这一映射,需要给模型的每个顶点指定一个纹理坐标。

纹理坐标是一个二维坐标,通常用(u, v)表示。

顶点的纹理坐标决定了其在纹理图像中的采样位置。

通过对纹理坐标的插值或者变换,可以得到模型表面上每个点所对应的纹理坐标,从而获取纹理图像中的像素值。

这样,模型表面上的每个点都可以呈现出纹理图像中所对应的颜色。

三、纹理过滤纹理过滤是纹理映射中一个重要的技术,它处理了三维模型表面和纹理图像之间的采样问题。

在纹理映射中,对于模型表面上一个离散的点,需要从纹理图像中获取它所对应的纹理值。

由于纹理图像的像素点是有限的,而模型表面上的点是连续的,因此需要对纹理进行采样过滤。

常用的纹理过滤算法有最近邻采样、双线性插值、三线性插值等。

这些过滤算法可以有效减少纹理映射过程中的失真,提高纹理映射的质量。

四、纹理映射技术的应用纹理映射技术在计算机图形学和计算机视觉领域有着广泛的应用。

计算机形学的纹理映射

计算机形学的纹理映射

计算机形学的纹理映射计算机图形学中的纹理映射是一种常见且广泛应用的技术,用于增强三维模型的真实感和细节。

本文将探讨纹理映射的概念、原理和应用,并分析其在计算机图形学领域中的重要性。

一、概述纹理映射是一种将二维图像贴附到三维模型表面的过程。

它通过在三维模型的表面上粘贴纹理图像来模拟真实世界中的材质和细节。

纹理映射可以使平凡的三维模型变得生动,并为渲染引擎提供更真实的光照效果。

二、纹理映射的原理纹理映射的原理可简单描述为以下三个步骤:1. 纹理坐标的计算:为了将二维纹理贴附到三维模型表面上,首先需要计算每个顶点的纹理坐标。

纹理坐标是一个二维向量,指示了纹理图像中的像素位置。

2. 纹理插值:一旦获得了每个顶点的纹理坐标,渲染引擎会根据每个像素的位置在顶点之间进行插值计算,以确定其在纹理图像中的位置。

这样可以确保纹理图像均匀地覆盖整个三维表面。

3. 纹理采样:根据插值计算的纹理坐标,渲染引擎从纹理图像中采样像素值。

采样过程将决定每个像素的颜色和纹理特征。

三、纹理映射的应用纹理映射在计算机图形学中有广泛的应用。

以下是几个常见的应用领域:1. 视觉效果:纹理映射可用于创建逼真的视觉效果,如岩石、树木的表面纹理。

通过将真实世界的图像应用到模型上,可以使其看起来更加真实。

2. 游戏开发:游戏中的角色、场景和物体通常都需要进行纹理映射。

纹理映射可以为游戏提供更好的视觉效果,并增加游戏的沉浸感。

3. 虚拟现实:纹理映射是虚拟现实技术中不可或缺的一部分。

通过在虚拟环境中应用纹理,可以增强用户感知,使其更好地融入虚拟世界。

4. 增强现实:纹理映射在增强现实应用中也扮演着重要角色。

通过在现实世界中投射纹理,可以实现虚拟物体与真实世界的交互。

结论纹理映射是计算机图形学中的重要技术之一,通过将二维纹理应用于三维模型的表面,可以增强模型的真实感和细节。

它在视觉效果、游戏开发、虚拟现实和增强现实等领域都有广泛应用。

纹理映射的原理和应用需要综合考虑,以确保最佳的效果和性能。

Blender纹理映射教程 使用UV映射创建复杂材质

Blender纹理映射教程 使用UV映射创建复杂材质

Blender纹理映射教程:使用UV映射创建复杂材质在Blender中,纹理映射是一个重要的工具,可以为三维模型增加细节和真实感。

其中一种常用的纹理映射方法是使用UV映射。

UV映射允许我们将二维纹理映射到三维模型的表面上,创建出复杂且栩栩如生的材质。

本教程将向您展示如何在Blender中使用UV映射来创建复杂的材质。

首先,我们需要准备一个三维模型,可以是任何形状或大小的物体。

在Blender中,选择一个基本几何体或导入一个自定义模型作为起点。

确保您已经在编辑模式下选择了整个模型。

接下来,打开Blender的“UV编辑器”窗口。

您可以通过将窗口布局更改为“UV编辑器”来实现。

此时,您将在窗口中看到一个空白的网格,它代表了我们的模型的UV坐标空间。

选中模型后,在3D视图中按下“U”键,然后选择“展开”选项。

这将自动对整个模型进行UV展开,并将其映射到UV编辑器窗口中。

现在,我们需要将一个纹理映射到我们的模型上。

打开一个纹理文件,将其拖放到UV编辑器窗口。

您将看到纹理被加载到UV网格上。

然后,在“材质”选项卡中,您可以选择“新建”或“编辑”一个材质。

给材质命名后,选择“纹理”选项卡。

点击“新建纹理”按钮,然后在“纹理类型”下拉菜单中选择“影像”。

接下来,在“影像”选项卡中,点击“打开”按钮,选择您想要应用的纹理图像。

然后,将该纹理映射到模型上,我们需要设置纹理坐标的映射方式。

在“影像”选项卡的底部,有一个名为“坐标”(Coordinates)的下拉菜单。

将其设置为“UV”,这将告诉Blender使用UV映射方式。

现在,我们可以开始对纹理进行调整和编辑。

在UV编辑器窗口中,选择一个面孔或边缘,然后在纹理图像上进行调整,以控制模型上的纹理位置和大小。

您可以使用顶点、边缘和面的选择工具来直接对纹理进行编辑。

此外,您还可以使用Blender提供的一些工具来增加更多的细节。

比如,通过使用“投影”工具,在UV网格上添加细节和纹理效果。

纹理映射方法

纹理映射方法

纹理映射方法纹理映射方法是计算机图形学领域中非常重要的一部分,它能够为计算机生成的图像赋予更真实的外观和细节。

随着计算机技术的不断发展和进步,纹理映射方法也在不断演化和改进。

本文将详细介绍纹理映射方法的概念、原理、分类以及在计算机图形学领域中的应用,希望能够对读者有所帮助。

一、纹理映射方法的概念纹理映射是将一个二维图像或纹理图像映射到三维物体表面上的过程。

通俗地说,就是将一张图片贴到三维物体上,以增加真实感和细节。

纹理映射方法主要包括纹理坐标的映射和纹理像素的采样。

纹理坐标的映射是将三维物体上的顶点坐标映射到二维纹理坐标系上,从而确定纹理图像上相应的位置。

而纹理像素的采样则是根据纹理坐标从纹理图像中获取颜色信息,然后应用到物体表面上。

二、纹理映射方法的原理纹理映射的基本原理是在给定的纹理坐标系下,将三维物体表面上的点映射到二维纹理图像上,并根据映射到的位置从纹理图像中获取相应的颜色信息。

这样可以为物体表面赋予更加细致的纹理和外观,进而增加真实感和视觉效果。

三、纹理映射方法的分类根据不同的映射方式和实现技术,纹理映射方法可以分为多种类型,包括:简单纹理映射、投影纹理映射、环境纹理映射、积分纹理映射、多层纹理映射等。

简单纹理映射是最基本的纹理映射方法,它将纹理图像简单地贴到物体表面上。

投影纹理映射是根据投影方式将纹理映射到物体表面上,常见的有透视投影和正交投影。

环境纹理映射是根据物体表面法向量和观察者位置确定纹理颜色,实现物体表面的反射和折射效果。

积分纹理映射是通过对纹理图像进行积分来模拟散射光效果,以增加真实感。

多层纹理映射是将多个纹理图像叠加到物体表面上,以实现更加复杂的效果。

四、纹理映射方法在计算机图形学中的应用纹理映射方法在计算机图形学中有着广泛的应用,包括游戏开发、动画制作、虚拟现实等领域。

在游戏开发中,通过精细的纹理映射方法,可以使游戏场景和角色更加逼真,增加游戏的沉浸感和真实感。

动画制作中,纹理映射方法可以为角色表面赋予更加真实的皮肤质感和细节,提升动画的观赏性。

2d到3d转换 转换原理

2d到3d转换 转换原理

2d到3d转换转换原理
2D到3D转换是指将二维图像或平面几何对象转换为三维模型或场景的过程。

这种转换可以通过多种方法实现,其中一些常见的原理包括:
1. 视差原理,视差是指当我们从不同位置观察同一个物体时,物体在我们的视野中的位置发生变化。

通过分析图像中物体的视差信息,可以推断出物体的深度信息,从而实现2D到3D的转换。

2. 立体视觉原理,立体视觉是指我们通过两只眼睛同时观察物体时产生的立体感。

通过将两个视角的图像进行比较和匹配,可以计算出物体的深度信息,进而实现2D到3D的转换。

3. 结构光原理,结构光是一种通过投射特定的光纹或模式到物体上,并通过相机捕捉物体表面的形变来计算物体的深度信息的方法。

通过分析光纹的形变,可以实现从2D图像到3D模型的转换。

4. 激光扫描原理,激光扫描是一种通过激光器发射激光束,并通过接收器接收反射回来的激光束来获取物体表面的点云数据的方法。

通过获取物体表面的点云数据,可以重建出物体的三维模型。

5. 纹理映射原理,纹理映射是一种将二维图像或纹理映射到三维物体表面的方法。

通过将2D图像与3D模型进行对应,可以实现从2D到3D的转换。

这些原理可以独立或结合使用,具体的转换方法取决于应用场景和需求。

需要注意的是,2D到3D转换是一个复杂的过程,涉及到计算机视觉、图像处理、几何学等多个领域的知识和技术。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二维纹理映射一、实验目的和要求掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术。

二、实验原理纹理映射是真实感图形制作的一个重要部分,运用纹理映射可以方面地制作真实感图形,而不必花更多的时间去考虑物体的表面纹理。

如一张木制桌子其表面的木纹是不规范的,看上去又是那么自然,如果在图形制作中不用纹理映射,那么只是这张桌面纹理的设计,就要花费很大精力,而且设计结果也未必能像现实中那么自然。

如果运用纹理映射就非常方便,可以用扫描仪将这样的一张桌子扫成一个位图。

然后的具体的操作中,只需把桌面形状用多边形画出来,把桌面纹理贴上去就可以了。

另外,纹理映射能够在多边形进行变换时仍保证纹理的图案与多边形保持一致性。

例如,以透视投影方式观察墙面时,远端的砖会变小,而近处的砖就会大一些。

此外,纹理映射也可以用于其他方面。

例如,使用一大片植被的图像映射到一些连续的多边形上,以模拟地貌,或者以大理石、木纹等自然物质的图像作为纹理映射到相应的多边形上,作为物体的真实表面。

在OpenGL中提供了一系列完整的纹理操作函数,用户可以用它们构造理想的物体表面,可以对光照物体进行处理,使其映射出所处环境的景象,可以用不同方式应用到曲面上,而且可以随几何物体的几何属性变换而变化,从而使制作的三维场景和三维物体更真实更自然。

在OpenGL中要实现纹理映射,需要经历创建纹理、指定纹理应用方式、启用纹理映射、使用纹理坐标和几何坐标绘制场景几个过程。

用于指定一维、二维和三维纹理的函数分别为:Void glTexImage1D(GLenum target, Glint level, Glint components, GLsizei width, Glint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage2D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels);Void glTexImage3D(GLenum target, Glint level, Glint components, GLsizei width, GLsizei height, GLsizei depth, Glint border, GLenum format, GLenum type, const GLvoid *texels); 其中,参数target取值一般为GL_TEXTURE_1D, GL_TEXTURE_2D和GL_TEXTURE_3D,分别与一维、二维和三维的纹理相对应。

参数Level表示纹理多分辨率层数,通常取值为0,表示只有一种分辨率。

参数components的可能取值为1~4的整数以及多种符号常量(如GL_RGBA),表示纹理元素中存储的哪些分量(RGBA颜色、深度等)在纹理映射中被使用,1表示使用R颜色分量,2表示使用R和A颜色分量,3表示使用RGB颜色分量,4表示使用RGBA颜色分量。

参数width,height,depth分别指定纹理的宽度、高度、深度。

参数format和type表示给出的图像数据的数据格式和数据类型,这两个参数的取值都是符号常量(比如format指定为GL_RGBA,type指定为GL_UNSIGNED_BYTE,参数texels指向内存中指定的纹理图像数据。

在定义了纹理之后,需要启用纹理的函数:glEnable(GL_TEXTURE_1D);glEnable(GL_TEXTURE_2D);glEnable(GL_TEXTURE_3D);在启用纹理之后,需要建立物体表面上点与纹理空间的对应关系,即在绘制基本图元时,在glVertex 函数调用之前调用glTexCoord函数,明确指定当前顶点所对应的纹理坐标,例如:glBegin(GL_TRIANGLES);glTexCoord2f(0.0, 0.0); glVertex2f(0.0, 0.0);glTexCoord2f(1.0, 1.0); glVertex2f(15.0, 15.0);glTexCoord2f(1.0, 0.0); glVertex2f(30.0, 0.0);glEnd();其图元内部点的纹理坐标利用顶点处的纹理坐标采用线性插值的方法计算出来。

在OpenGL中,纹理坐标的范围被指定在[0,1]之间,而在使用映射函数进行纹理坐标计算时,有可能得到不在[0,1]之间的坐标。

此时OpenGL有两种处理方式,一种是截断,另一种是重复,它们被称为环绕模式。

在截断模式(GL_CLAMP)中,将大于1.0的纹理坐标设置为1.0,将小于0.0的纹理坐标设置为0.0。

在重复模式(GL_REPEAT)中,如果纹理坐标不在[0,1]之间,则将纹理坐标值的整数部分舍弃,只使用小数部分,这样使纹理图像在物体表面重复出现。

例如,使用下面的函数:glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);分别指定二维纹理中s坐标采用截断或重复处理方式。

另外,在变换和纹理映射后,屏幕上的一个像素可能对应纹理元素的一小部分(放大),也可能对应大量的处理元素(缩小)。

在OpenGL中,允许指定多种方式来决定如何完成像素与纹理元素对应的计算方法(滤波)。

比如,下面的函数可以指定放大和缩小的滤波方法:glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);其中,glTexParameteri函数的第一个参数指定使用的是一维、二维或三维纹理;第二个参数为GL_TEXTURE_MAG_FILTER或GL_TEXTURE_MIN_FILTER,指出要指定缩小还是放大滤波算法;最后一个参数指定滤波的方法。

补充:透视投影函数void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar); 它也创建一个对称透视视景体,但它的参数定义于前面的不同。

其操作是创建一个对称的透视投影矩阵,并且用这个矩阵乘以当前矩阵。

参数fovy定义视野在X-Z平面的角度,范围是[0.0,180.0];参数aspect 是投影平面宽度与高度的比率;参数zNear和Far分别是远近裁剪面沿Z负轴到视点的距离,它们总为正值。

三、实验内容在OpenGL中纹理映射所使用的纹理数据,既可以是程序生成的一组数据,也可以从外部文件中直接读取,参考示范代码完成以下两项内容:源码(// cgtest.cpp : Defines the entry point for the console application.//// test.cpp : 定义控制台应用程序的入口点。

//#include <stdio.h>#include "glut.h"#include <math.h>#include <Windows.h>//这是一个点的类,用于存储其中点的坐标class Point{public:int x, y;void setxy(int _x, int _y) {x = _x;y = _y;}};//点的数量static int POINTSNUM = 0;//用于存储点的集合,因为绘制的都是4个点的贝塞尔曲线,所以数组大小为4 static Point points[4];//初始化函数void init(void){glClearColor(1.0, 1.0, 1.0, 0); //设定背景为黑色glColor3f(0.0, 0.0, 0.0); //绘图颜色为白色glPointSize(2.0); //设定点的大小为2*2像素的glMatrixMode(GL_PROJECTION); // 设定合适的矩阵glLoadIdentity(); // 是一个无参的无值函数,其功能是用一个4×4的单位矩阵来替换当前矩阵,实际上就是对当前矩阵进行初始化。

也就是说,无论以前进行了多少次矩阵变换,在该命令执行后,当前矩阵均恢复成一个单位矩阵,即相当于没有进行任何矩阵变换状态gluOrtho2D(0.0, 600.0, 0.0, 480.0); //平行投影,四个参数分别是x,y范围}//绘制点void setPoint(Point p) {glBegin(GL_POINTS);glVertex2f(p.x, p.y);glEnd();glFlush();}// 绘制直线void setline(Point p1, Point p2) {glBegin(GL_LINES);glVertex2f(p1.x, p1.y);glVertex2f(p2.x, p2.y);glEnd();glFlush();}// 绘制贝塞尔曲线Point setBezier(Point p1, Point p2, Point p3, Point p4, double t) {Point p;double a1 = pow((1 - t), 3);double a2 = pow((1 - t), 2) * 3 * t;double a3 = 3 * t*t*(1 - t);double a4 = t*t*t;p.x = a1*p1.x + a2*p2.x + a3*p3.x + a4*p4.x;p.y = a1*p1.y + a2*p2.y + a3*p3.y + a4*p4.y;return p;}//display函数void display(){glClear(GL_COLOR_BUFFER_BIT);glFlush();}// 鼠标事件void mymouseFunction(int button, int state, int x, int y) {if (state == GLUT_DOWN) // 如果鼠标按下,不区分左右键的{points[POINTSNUM].setxy(x, 480 - y); // 这里求鼠标点的坐标的时候// 设置点的颜色,绘制点glColor3f(1.0, 0.0, 0.0);setPoint(points[POINTSNUM]);// 设置线的颜色,绘制线glColor3f(1.0, 0.0, 0.0);if (POINTSNUM > 0) setline(points[POINTSNUM - 1], points[POINTSNUM]);//如果达到了4个绘制贝塞尔曲线,并在之后给计数器清零if (POINTSNUM == 3) {//绘制贝塞尔曲线glColor3f(0.0, 0.0, 1.0); // 设定贝塞尔曲线的颜色Point p_current = points[0]; //设为起点for (double t = 0.0; t <= 1.0; t += 0.05){Point P = setBezier(points[0], points[1], points[2], points[3], t);setline(p_current, P);p_current = P;}POINTSNUM = 0;}else {POINTSNUM++;}}}int main(int argc, char *argv[]){glutInit(&argc, argv); //固定格式glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //缓存模式glutInitWindowSize(600, 480); //显示框的大小glutInitWindowPosition(100, 100); //确定显示框左上角的位置glutCreateWindow("");init(); // 初始化glutMouseFunc(mymouseFunction); // 添加鼠标事件glutDisplayFunc(display); // 执行显示glutMainLoop(); //进人GLUT事件处理循环return 0;}五、运行截图。

相关文档
最新文档