用OpenInventor实现的NeHe OpenGL教程-第四十四课

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
 
NeHe教程在这节课向我们介绍了3D光晕的技术。当摄像机镜头对准太阳的时候就会出现这种效果,这种技术经常用在游戏场景中。为了完成这种效果,我们需要一些数学知识,用来检测某个点或球是否在当前的视景体内。我们还需要一些纹理作为我们的光晕效果。
 
程序中关键的函数有:
BOOL glCamera::SphereInFrustum(SbVec3f p, float Radius)
{
     int i;
     for(i = 0; i < 6; i++)
     {
         // If the point is outside of the plane then its not in the viewing volume.
         if(m_Frustum[i][0] * p[0] + m_Frustum[i][1] * p[1] + m_Frustum[i][2] * p[2] + m_Frustum[i][3] <= -Radius)
         {
              return(FALSE);
         }
     }
     return(TRUE);
}
这个函数用来判断一个球体是否在视景体内。使用的方法和NeHe教程相同
 
 
bool glCamera::IsOccluded(SbVec3f p)
{
     SbRotation SbPitch(SbVec3f(1,0,0),m_PitchDegrees / 180.0 * 3.1415926);
     SbRotation SbHeading(SbVec3f(0,1,0),m_HeadingDegrees / 180.0 * 3.1415926);
     SbRotation SbModel = SbPitch * SbHeading;
     SbModel.multVec(p,p);
 
     SoRayPickAction RayPickAction(g_pOivView->getViewportRegion());
     RayPickAction.setRay(p,SbVec3f(0,0,1));
     RayPickAction.apply(g_pOivSceneRoot);
     if(RayPickAction.getPickedPoint())
         return true;
     else
         return false;
}
这个函数用来判断一个点是否在视景体内。使用OpenInventor的 SoRayPickAction方法.
 
其它的函数基本上和NeHe教程类似,只要读者明白NeHe教程,理解我们的代码也应该是很容易的。
 
现在编译运行我们程序,屏幕会显示一个不断旋转的圆柱体,。按下w,s,a,d变换摄像机的方向,就会出现一道光晕。效果和NeHe教程第四十四课是相同的。
 
 
本课的完整代码 下载。(VC 2003 + Coin2.5)
 
 
后记
OpenInventor是一种基于OpenGL的面向对象的三维图形软件开发包。使用这个开发包,程序员可以快速、简洁地开发出各种类型的交互式三维图形软件。这里不对OpenInventor做详细的介绍,读者如果感兴趣,可以阅读我的blog中的这篇文章《 OpenInventor 简介》。
 
NeHe教程是目前针对初学者来说最好的OpenGL教程,它可以带领读者由浅入深,循序渐进地掌握OpenGL编程技巧。到目前为止(2007年11月),NeHe教程一共有48节。我的计划是使用OpenInventor来实现所有48节课程同样的效果。目的是复习和巩固OpenGL的知识,同时与各位读者交流OpenInventor的使用技巧。
 
       因为篇幅的限制,我不会介绍NeHe教程中OpenGL的实现过程,因为NeHe的教程已经讲解的很清楚了,目前网络中也有NeHe的中文版本。我将使用VC 2003作为主要的编译器。程序框架采用和NeHe一样的Win32程序框架,不使用MFC。程序也可以在VC Express,VC 2005/2008中编译。我采用的OpenInventor开发环境是Coin,这是一个免费开源的OpenInventor开发库。文章 《 OpenInventor-Coin3D开发环境》 介绍了如何在VC中使用Coin。我使用的Coin版本是2.5。读者可以到 www.coin3d.org 中免费下载。
 
       读者可以在遵循GNU协议的条件下自由使用、修改本文的代码。水平的原因,代码可能不是最优化的,我随时期待读者的指正和交流。转载请注明。谢谢。
我的联系方式:
屏幕坐标向OpenGL坐标的转换 从屏幕坐标向OpenGL坐标要经过两步,第一步是屏幕坐标向视景体坐标转换,第二步是视景体坐标向OpenGL坐标转换。 参考资料:http://chiefman.blog.hexun.com/5400795_d.html 立即下载

相关推荐

Open Inventor练习-SoRayPickAction和SoMouseButtonEvent点选操作

SoRayPickAction是三维物体射线选择操作,SoPickedPoin用来存放选择的坐标,SoMouseButtonEvent用来鼠标操作信息处理。例子中获得鼠标点击物体的类型和坐标位置信息,在Console控制台窗口中输出。代码如下。 #define COIN_DLL #define SOWIN_DLL // 加载COIN库文件 #ifdef _DEBUG #pra...

huozheleisi 337

Coin3D三维可视化教程3

命名约定 在Inventor中基本数据类型的名字都是以字母Sb开始的,例如: SbColor SbViewVolume 除了上面的基本数据以外,在Inventor中所有其他的类都是以字母So作为前缀(场景对象)。例如: SoCone SoPerspectiveCamera SoMaterial SoTransform 方法和变量使用小写字母作为开头字母。在类、方法、变量的名字中,...

love code, love life. 2539

Open Inventor 2024.1.1 for VS2022[2024.4.4]

Open Inventor 的早期版本中,当与具有大量数据(即至少几 GB)的正交切片或斜切片交互时,可能会观察到许多挂起。任何需要更新大部分切片以进行渲染的更改都可能导致挂起

控件与插件之大全 1280

Coin3D三维可视化教程6

路径(Paths ) 路径用于区分场景中某个特定对象。假设,我们想使用机器人的左脚。在图 3-10 (上一节,机器人)中那个节点能代表左脚呢?我们不能简单地认为是 foot 节点,因为这个节点(foot)是被左腿和右腿同时使用的。答案是使用路径(或称为链)来表示左脚。路径起始于 robot 节点(根节点),沿着图形向下直至通到 foot 节点。图 3-12 指出了表示左脚的路径。路径包含有一个节...

love code, love life. 2031

OpenGLnehe教程第一学习笔记

nehe教程的第一主要讲了OpenGL程序的创建。 它引用了最基本的gl.h、glu.h、glaux.h三个头文件。 包含了五个函数,分别是InitGL、ResizeGLScene、DrawGLScene、WinProc、winMain。 winMain函数是程序的入口,它负责创建windows窗口,将openGL程序引到该窗口(通过调用WinProc函数),并通过窗口句柄

lzh1590的博客 2697

OpenInventor实现NeHe OpenGL教程-第十

OpenInventor实现NeHe OpenGL教程-第十         这节我们将加载一个3D场景,并在这个场景中做自由漫游。读者将看到加载3D场景不是一件很难的事情,难点是3D场景的数据组织。不过这些是美工的事情,和我们程序员关系不大 ^_^ 。        在程序开始的部分我们新定义了一些变量,这些变量的作用和NeHe教程中定义的变量有相同的作用。SoTexture2*                 g_pTexture = NULL; //场景的纹理对象SoComplexity*  

Augusdi的专栏 1802

OpenInventor实现NeHe OpenGL教程-第一

OpenInventor实现NeHe OpenGL教程-第一        OpenInventor是一种基于OpenGL的面向对象的三维图形软件开发包。使用这个开发包,程序员可以快速、简洁地开发出各种类型的交互式三维图形软件。这里不对OpenInventor做详细的介绍,读者如果感兴趣,可以阅读我的blog中的这篇文章《OpenInventor 简介》。 NeHe教程是目前

RobinHao的专栏 5725

OpenInventor实现NeHe OpenGL教程-第三十

OpenInventor实现NeHe OpenGL教程-第三十         NeHe教程在这节介绍了碰撞检测。碰撞检测是一种比较复杂的技术。NeHe教程只是检测平面、球体、圆柱体等这些规则物体之间的碰撞检测。OpenInventor提供了任意形状物体之间的碰撞检测,当然这样的碰撞检测需要更多的计算时间。 碰撞检测的算法在NeHe教程中已经做了详尽的解释,我们就

RobinHao的专栏 3910

OpenInventor实现NeHe OpenGL教程-第十二

 用OpenInventor实现NeHe OpenGL教程-第十二         NeHe这节主要讨论OpenGL的显示列表功能。OpenGL的显示列表是加速OpenGL性能的一种重要的手段。但在OpenInventor中,我们根本就不需要关心是否使用显示列表,因为OpenInventor内部有缓存功能,而这个缓存功能就是使用显示列表来实现的。所以我们只需要实现程序逻辑

RobinHao的专栏 1912

OpenInventor实现NeHe OpenGL教程-第十六

 用OpenInventor实现NeHe OpenGL教程-第十六          这节我们将在前面讲述的第七节程的基础上,对场景增加上“雾 ”的效果。在OpenInventor中添加“雾 ”效果还是很容易的。OpenInventor提供了一个叫做SoEnvironment的节点类,通过这个节点类,我们就可以实现“雾 ”的效果。        下面的代码是在第

RobinHao的专栏 1492

OpenInventor实现NeHe OpenGL教程-第二十九

 用OpenInventor实现NeHe OpenGL教程-第二十九         NeHe教程在这节中介绍了如何把一块纹理贴到另一块纹理上(即多重纹理)。这节的内容不是很难,主要是如何读取raw数据格式文件,如何计算图像的透明度等。 OpenInventor对多重纹理直接提供支持,所以我们也可以利用多重纹理来实现相同的效果。具体的代码见BuildCube2

RobinHao的专栏 3504

OpenInventor实现NeHe OpenGL教程-第四十八

 NeHe教程在这节向我们介绍了轨迹球技术。轨迹球技术可以让用户使用鼠标直接旋转物体,这是所有交互式3D软件必须提供的最基本的功能。NeHe教程提供的方法是在其它人的基础上做了一些修改和优化。但他的方法仍然有一些小的错误,例如,在将鼠标2D坐标位置映射到3D球体上时,他没有考虑透视因素,因此可能会稍微有些误差,不过对于一般应用来说已经足够用了。        Open Invento

RobinHao的专栏 5524

OpenInventor实现NeHe OpenGL教程-第四十

<br />用OpenInventor实现NeHe OpenGL教程-第四十  NeHe教程在这节向我们介绍了如何模拟一根绳子的运动状态,简单的说,就是把绳子先离散化,把它想象成一个个紧密排列的点,每两个点之间有弹性约束。其实这就是简单的有限元思想。这节的内容和上节一样,主要是和物理、数学有关系,和图形图像的关系不大。我们的代码基本上和NeHe代码的原理类似,这里就不再详细说明了。  本的完整代码 下载。(VC 2003 + Coin2.5)  后记OpenInventor是一种基于OpenG

Augusdi的专栏 1439

OpenInventor实现NeHe OpenGL教程-第三十四

<br /> 用OpenInventor实现NeHe OpenGL教程-第三十四   NeHe教程在这节向我们介绍了如何从一个2D的灰度图创建地形。这节的内容比较简单,只是从一个2D灰度图中读取灰度数据,然后将灰度数据转换成高度数据,最后将这些数据显示出来就可以了。  首先定义一些全局变量,这些变量的含义和NeHe教程完全一致#define       MAP_SIZE  1024   // Size Of Our .RAW Height Map (NEW)#define       STEP

Augusdi的专栏 2051
上一篇: 用OpenInventor实现的NeHe OpenGL教程-第四十三课
下一篇: 用OpenInventor实现的NeHe OpenGL教程-第四十五课
RobinHao
博客等级 码龄25年 234粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值