用opengl 2.0制作天空盒缝隙消除的问题

[豆丁]基于OPENGL的虚拟场景建模技术的研究与实践
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
[豆丁]基于OPENGL的虚拟场景建模技术的研究与实践
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口&&&&opengl中天空盒的绘制
opengl中天空盒的绘制
opengl中天空盒的绘制,纹理的贴图,四周的移动
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
课程资源下载排行二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
借夜阑静处 独看天涯星
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
&& 封装成一个Sky类,可以直接调用。在使用前必须为天空指定一个纹理,可以使用自定义的函数进行天空的初始化CSky::InitSky(),最后在需要显示的地方调用显示函数CSky::ShowSky()。#ifndef _SKY_H#define _SKY_H#include &gl/glut.h&class Sky{public: Sky(); //初始化天空的位置,半径和纹理 void InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture); //显示天空 void ShowSky(void); //获得天空的属性 float GetSkyX(void); float GetSkyY(void); float GetSkyZ(void); float GetSkyR(void); unsigned int GetSkyTexture(void);public: float X; float Y; float Z; float R; unsigned int T; GLUquadricObj *};#endif#include "sky.h"Sky::Sky(){ X = 0; Y = 0; Z = 0; R = 100;}void Sky::InitSky(float skyX,float skyY,float skyZ,float skyR,unsigned int texture){ X = skyX; Y = skyY; Z = skyZ; R = skyR; T = // qobj = gluNewQuadric(); gluQuadricNormals(qobj,GLU_SMOOTH); gluQuadricTexture(qobj,GL_TRUE);}void Sky::ShowSky(){ static float r=0.0; r+=0.08; glEnable(GL_TEXTURE_2D); glPushMatrix();// glFrontFace(GL_CCW); glCullFace(GL_BACK); glBindTexture(GL_TEXTURE_2D, T); glTranslatef(X,Y,Z);& glRotatef(r,0.0f,1.0f,0.0f); //天空慢慢旋转,模拟云流动 glRotatef(90,1,0,0); glColor4f(1,1,1,1); gluSphere(qobj,R,32,32); glPopMatrix(); glDisable(GL_TEXTURE_2D);}float Sky::GetSkyR(){ return R;}float Sky::GetSkyX(){ return X;}float Sky::GetSkyY(){ return Y;}float Sky::GetSkyZ(){ return Z;}
阅读(3493)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_087065',
blogTitle:'OPENGL创建圆形天空盒',
blogAbstract:'&& &在OpenGL中模拟天空,是制作场景的必要技术。一般天空的构造可以使用天空盒或者一个球体贴上纹理来模拟。天空盒是绘制一个四方体,然后在各个面贴上贴图。这就要求6个面的贴图要有机结合,不然会出现缝隙或者不连续。这种技术可以模拟高山等。本文提供的则是天空顶技术。就是绘制一个球体然后赋予材质,可以很好的达到模拟天空的效果。使球体慢慢移动,就可以模拟云彩流动的效果。&& 封装成一个Sky类,可以直接调用。在使用前必须为天空指定一个纹理,可以使用自定义的函数进行天空的初始化CSky::InitSky(),最后在需要显示的地方调用显示函数CSky::ShowSky()。#ifndef _SKY_H#define _SKY_H',
blogTag:'float,sky,天空,unsigned,void',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'借夜阑静处 独看天涯星',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}文章来自:在进行3D场景渲染时,天空是必不可少的因素。对于3D天空的模拟在视景仿真系统、计算机游戏、三维动画中有着广泛的应用。但是,目前对于天空的仿真还存在很多不足,一些模拟方法中存在实现复杂、计算耗时、图像分辨力不高,真实感不强且只能生成静态图像等问题。本文在研究了前人仿真天空算法的基础上,利用目前3D图形行业中流行的OpenGL技术和有被誉为"大自然的几何学"美称的分形理论,提出了一种更加简单实用的仿真3D天空的方法,可以仿真出具有动态效果和不同天气的3D天空,绘制速度快,真实感强。l构造天空模型1.1 OpenGL技术[1.2]OpenGL作为一套图形标准,由数百个功能函数组成,提供了访问图形硬件的所有特性,其严格按照计算机图形学原理设计而成,符合光学和视觉的原理,非常适合可视化仿真系。其优势在于:首先,在OpenGL中,允许视景对象用图形方式表达;其次,OpenGL通过光照处理能表达出物体的三维特性,其光照模型是整体光照模型。可视化仿真图像的颜色体现着物体与视点以及光源之间的空间位置关系,具有很强的三维效果。此外,为弥补图形方法难于生成复杂自然背景的不足,OpenGL提供了对图像数据的使用方法,即直接对图像数据读、写和拷贝,或者把图像数据定义为纹理与图形方法结合在一起生成视景图像以增强效果。本文研究了基于OpenGL技术的3D天空仿真,使得算法易于实现,并且有很好的可视化效果。1.2 传统模型在传统的3D游戏中,对于天空的仿真,程序员往往从实时简单的角度出发,采用非常简化的天空模型,通常包括以下3种方法[3-5]:用一种接近天空的淡蓝色来清除背景;采用天空盒(skyBox)的方法:即首先绘制一个多边形,然后进行立方体纹理贴图;八棱锥天空模型:定义一个天顶,以这个顶点为中心绘制一圈三角形扇,然后进行纹理映射。这3种方法都具备了实时性,方法简单的优点,但同时也存在明显的不足,第一种方法绘制的天空效果看起来太平面化,简单粗糙,逼近度不高。第二种方法对纹理的要求非常高,如果纹理使用得不好,在一个比较大的多边形上的纹理就容易产生拉伸变形的副作用。此外,雾化设置也会产生问题,如果雾的设置靠近观察点,则天空的颜色会变淡甚至没有。第三种方法有明显的天顶。显然,在如今这种对3D场景仿真要求越来越高的时代,这些方法已经不适应时代的要求,需要寻求一种渲染速度快,真实感强,有一定交互能力的3D天空模型。1.3 半球型天空模型地球是球型的,所以天空像半个球一样笼罩在大地之上。在用计算机仿真3D天空时,半球型天空模型显然符合真实世界的天空模型。利用数学中的球面方程,可以建立如下模型:P是球面上一点,R为球的半径。在球面坐标系下方程改写为:对于一个半球.φ为纬度,其变化范围是O≤φ;θ为经度,其变化范围是O≤θ。采用球型(DOme)的方法,比起采用盒子(BOx)的方法,有很多优点。首先由于球形方法绘制的天空具有更多的顶点,雾化效果可以绘制得更加均匀[5]。同时也可以实时改变单个顶点的颜色,这样可以获得一些非常好的效果,如一天不同时刻的太阳光。半球型天空模型也存在不足:(1)顶点数目过多,影响渲染速度。N为所需要绘制的顶点总数;△φ,△θ为绘制球型天顶的顶点经纬度间隔,值越小、网格越密,绘制越精细。由于采用OpenG技术中的三角形带绘制(GL-TRIANGLE一STRIP),每次绘制4个顶点,每个顶点被绘制4次,故需要乘以4。(2)三角函数的运算过多。在单一场景的渲染中不会影响渲染速度,但在复杂的3D场景中,渲染速度的劣势会体现出来。因为在计算机中三角函数的运算较之加、减、乘、除等运算要慢的多。1.4 曲面天空模型为保持球型天空模型的优势并弥补该算法的不足,本文研究了一种渲染速度更快的曲面天空模型,该模型如图1所示。该模型类似于将一个经过细分的平面的4个角点向下拉,形状看上去像一个撑开的降落伞,将他罩在场景之上,可以模拟3D天空。曲面的长度为S为:顶点坐标(x,y,z)的计算公式为:&其中△s为曲面细分间隔;j,i为循环参数。曲面天空模型仍然可以用OpenGL技术中的三角形带((GLTRIANGLE_STRIP)绘制,但他避免了三角函数的运算,且顶点数目比相同精度的球型天空模型少,故增加了渲染速度。2 天空云图2.1 分形云图分形[4]方法建造的物体模型结构精细、算法控制相对简单,适合于描绘云、树等结构精细的物体。本文利用分形理论中的插值算法产生静态天空云图纹理,算法如下:(1)在平面上划分正方形网格n×n,随机给A1,A2,A3,A4这4个角点的颜色。如图2所示。(2)计算中点值,B1=(A1+A2+A3+A4)×0.25+ξ×scale,其中ξ是一个随机量;Scale一(1/2)H(标度)H即Hurst指数,他也是分形维数D的度量:D一2一H,如图3所示。&(3)根据A1,A4,B1点和网格外一虚拟点,重复第(2)节,得到边中点c1的颜色值。同理,可计算出C2,C3,C4边中点的颜色值。(4)递归步骤(2),(3),使其正方形网格不断细化,直到达到预期的递归深度。以上步骤中,正方形初始点的颜色是随机赋予的,但正方形网格内的所有点不是随机分布的。通过采用分形插值算法,使得网格内相邻点之间建立了某种联系,从而使生成体内部过渡得更加自然。这样,通过分形插值算法,得到一个2维数组,将数组中的每一个元素值看成是云的不透明度数据。最小数组值代表最蓝色,天空中云最少的部分,最大的值代表最白色,天空中云最重的部分。分析数组并生成蓝天白云纹理图如图4所示。2.2 纹理映射纹理映射技术[1.2]也叫纹理贴图技术(Texture Map-ping),与建造模型的方法相比,在摸拟物体表面细节方面,纹理映射是一个较有效的方法。景物表面纹理细节的模拟在真实感图形合成技术中起着非常重要的作用,这种将景物表面纹理细节的模拟称为纹理映射技术。现在,纹理映射已经成为三维图形世界中最为常用的技术之一,其数学过程十分复杂,但OpenGL已对其进行处理,于是编程者可以利用几个函数就可以完成纹理贴图。执行纹理贴图的步骤可以概括为:定义纹理贴图;控制纹理;说明纹理贴图方式;激活纹理映射;定义纹理坐标等。在一个球面上进行纹理映射是比较复杂的,采用不同的映射方式将产生不同的问题。如果采用平面映射的方式将在连续处产生纹理拉伸现象,如果采用球面映射,最大的问题是在球面的极点产生纹理的聚集现象,对于好的纹理,这种现象可以缩减到最小。根据球面几何知识,可以得到纹理坐标的具体计算公式:加上1/2的原因是为了使U,V坐标的值处于(0.0,1.0)范围内。3 动态仿真本文采用定时器技术和改变纹理矩阵坐标的方法实现云的流动效果。首先定义一个100 ms的定时器,每隔100ms纹理坐标改变一次。其次,使用多重纹理来添加一个单独的云彩贴图,通过变换纹理矩阵坐标实现流动。变换纹理坐标的方法是先将当前矩阵类型设置为纹理矩阵(GL-TEXTURE),然后调用glTranslate(),glRotate()和glScale()函数实现坐标的平移、旋转和缩放。这样,云就可以缓慢地在天空中移动。此外,通过添加按键响应函数,在函数体中利用()penGL的模型变换函数,如glRotate(),可以以任意角度旋转3D天空,达到用户与3D场景的交互的效果。4仿真结果本仿真实验在CPU为P4,主频为1.7 GHz,内存为256 M,集成显卡上完成。仿真结果如图5~图8所示。天空中的云彩可以沿球形天空缓慢移动,客户可以通过上下左右键旋转3D天空。该模型在实时3D场景仿真中可以笼罩在场景之上,有很好的3D效果,并且真实感强。采用半球型天空模型的帧速率为250~285 f/s;采用曲面型天空模型的帧速率为324~340 f/s,在保证真实感和交互性的前提下,从渲染速度上看曲面天空模型优于半球型天空模型。&&&5 结 语本仿真系统的软件平台为VC++6.O,通过OpenGL图形库函数实现可视化仿真。利用球形方程、平面方程、三角函数等几何原理建立各种3D天空模型,运用分形理论中的插值算法编写天空纹理,并通过OpenGL函数进行三角形带绘制天空框架,纹理映射技术,映射出具有真实效果的3D天空。从仿真结果来看,真实感强,实时性好,此外,通过按键响应函数,可以以任意角度旋转,任意高度升降3D天空,交互性强,非常适合3D游戏的户外场景仿真。&&&&OpenGL天空盒实现
&OpenGL天空盒实现
这是基于OPENGL框架下的天空盒的实现编码,对读者您一定会有收获的。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
积分不够下载该资源
如何快速获得积分?
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
OpenGL天空盒实现
所需积分:1
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
VIP服务公告:

我要回帖

更多关于 opengl 2.0 的文章

 

随机推荐