查看: 2236|回复: 15

请教阴影问题!

[复制链接]

该用户从未签到

发表于 2009-4-15 11:21:15 | 显示全部楼层 |阅读模式
请教一下如何获取一个模型在某个平面上的阴影?

该用户从未签到

发表于 2009-4-15 11:32:20 | 显示全部楼层
您可以试一下osgShadow,不过个人不太推荐使用这个还不成熟的库做商业开发。不然的话,计算顶点在面上的投影也并非难事,下面的几行代码(源自osgModeling)即可实现此类功能,之后用这些顶点组成暗色的投影模型即可:
  1. osg::Vec3 calcProjection( const osg::Vec3& v, const osg::Plane& target )
  2. {
  3.     osg::Vec3 normal = target.getNormal();
  4.     double distance = v*normal + target[3];
  5.     return v - normal * distance;
  6. }
复制代码

[ 本帖最后由 array 于 2009-4-15 11:33 编辑 ]

该用户从未签到

 楼主| 发表于 2009-4-15 14:39:30 | 显示全部楼层
请教一下,如何再头文件里面引用calcProjection?以及如何添加到root节点? 还有就是osgModeling是否包含有对阴影区域做深度测试之类的操作函数?

该用户从未签到

发表于 2009-4-15 15:21:48 | 显示全部楼层
osgModeling不包含渲染相关的功能,它只注重于几何运算~~

calcProjection只是一个函数,输入一个顶点和一个要投影的面,返回值是投影到面上的点,没有什么添加到节点的说法

该用户从未签到

 楼主| 发表于 2009-4-15 15:36:22 | 显示全部楼层
如果说我要求的是一个很大的模型的阴影(比如说有很多点),是不是得对每个点都用一遍calcProjection?

该用户从未签到

发表于 2009-4-15 15:59:24 | 显示全部楼层
对,不过这个函数的内容其实很简单~~

该用户从未签到

 楼主| 发表于 2009-4-15 16:05:42 | 显示全部楼层
那岂不是计算量很大?有没有更简单一些的函数或者方法?还有一个问题就是,如何获取一个模型的所有顶点?假如我已经获取了所有顶点的坐标,并形成了阴影区域,能否只显示阴影的轮廓还不显示内部?多谢了,

该用户从未签到

发表于 2009-4-15 16:14:22 | 显示全部楼层
这个函数还不够简单吗?矢量的线性运算而已,我想不会有更简单的了~~

至于如何判断阴影的轮廓或内部,这个问题就很难解答了,恐怕国际上也没有一个好的解决方案。着色语言的诞生使我们可以从“逐像素”的观点来重新审视问题,个人认为各种基于GPU的阴影算法应该是未来的发展方向

该用户从未签到

 楼主| 发表于 2009-4-15 16:19:36 | 显示全部楼层
呵呵, 我现在正在试验osg和cuda的结合,以此来减轻计算量,如果我获得了所有的模型的顶点,没有一个函数就能直接得到模型阴影的区域吗?比如说参数是模型,返回值是一个阴影区域的节点?

该用户从未签到

发表于 2009-4-15 16:23:34 | 显示全部楼层
恐怕哪里都不会有这样的函数,当然您可以参考osgShadow的现有实现。轮廓的计算很麻烦,写几篇SCI论文应该不成问题

该用户从未签到

 楼主| 发表于 2009-4-15 16:32:10 | 显示全部楼层
为什么我拿 calcProjection生成的阴影总是一闪一闪的?当转动鼠标时,有时候显示一半阴影,有时候显示全部阴影?

该用户从未签到

发表于 2009-4-15 16:42:02 | 显示全部楼层
两个多边形面重叠的话会有Z-Fighting,用PolygonOffset解决吧

该用户从未签到

 楼主| 发表于 2009-4-15 16:46:11 | 显示全部楼层
问个很弱的问题PolygonOffset的作用是什么?osg:olygonOffset::PolygonOffset  ( float  factor,   float  units   ) 怎么设置?

该用户从未签到

发表于 2009-4-15 19:41:20 | 显示全部楼层
Just have a look at 'glPolygonOffset()'

该用户从未签到

 楼主| 发表于 2009-4-15 20:36:16 | 显示全部楼层
不好意思,我上网查了很多资料都没有说明 factor和units是什么意思,麻烦你简单说明一下,这两个数是干什么的?它们的设定范围是多少?谢谢

该用户从未签到

发表于 2009-4-15 20:44:30 | 显示全部楼层
在google上搜索glPolygonOffset,第一个搜索结果就是来自OpenGL官方的最权威解释……

C SPECIFICATION
   void glPolygonOffset( GLfloat factor,
GLfloat units )


PARAMETERS
   factor  Specifies a scale factor that is used to create a
   variable depth offset for each polygon. The initial
   value is 0.

   units   Is multiplied by an implementation-specific value to
   create a constant depth offset. The initial value is
   0.

而搜索OSG的源代码和例子程序,有不止一处用到了PolygonOffset,例如osghud,osgtexture2d。

自己动手是最好的学习方法,窃以为~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表