查看: 3110|回复: 18

求教:osg实现投影贴图问题

[复制链接]

该用户从未签到

发表于 2013-7-3 00:07:01 | 显示全部楼层 |阅读模式
main.cpp (4.63 KB, 下载次数: 38)

该用户从未签到

 楼主| 发表于 2013-7-3 00:07:31 | 显示全部楼层
代码在附件中

该用户从未签到

发表于 2013-7-3 13:35:27 | 显示全部楼层
这个问题以前我也考虑过,要去除从投影点来看呗遮挡部分的投影纹理必须知道相应的遮挡信息,可以考虑阴影的实现原理,从投影纹理渲染一张深度图,然后在投影纹理计算过程中比较判断是否被遮挡,如果是则不进行投影纹理计算。
上述方法仅仅适用于少数投影纹理的情况,如果是多个性能就不好。

所以这里也同求高档的简便解决方案。帮顶ing

该用户从未签到

发表于 2013-7-3 15:48:18 | 显示全部楼层
看了代码:
  提出观点:
      现象: (纹理贴图实际的问题在于)
       1.贴图本身正反都应该有的是正确的!就是一张透明的纹理四方纸!他不是问题的本身
       2.关键在于,你使用了相机投影矩阵设置,
          这个投影矩阵中相机的视锥内的所有几何顶点构成的面片都会被CullFace保留下来!
       3.贴图,就会投影贴图到到这些保留下来的CullFace上面!
   
参考解决办法:(自己没试过,根据原理应该能够解决)
       投影视锥的远剪裁面  设置小点,不要包含到牛肚子下面的点,这样CullFace,保留下来的面片就不包含腿部的节点了。
      

该用户从未签到

 楼主| 发表于 2013-7-3 18:16:09 | 显示全部楼层
谢谢大家的回复 ,我先试试 ,回头告诉你们结果

该用户从未签到

 楼主| 发表于 2013-7-3 23:41:49 | 显示全部楼层
VR_user_happy 发表于 2013-7-3 15:48
看了代码:
  提出观点:
      现象: (纹理贴图实际的问题在于)

改变远近裁剪面 不行

该用户从未签到

发表于 2013-7-4 03:08:24 | 显示全部楼层
上次粗略看了一下你的代码,现再次仔细查看了你的代码!
观点如下:
     1.实际上你只是把相机的视线平行矩阵赋给贴图环境(即是取得了视锥某个截面,作为坐标贴图的平面坐标)
    2. 用这个贴图坐标贴图对环境内的所有可见几何体面片作3D投影贴图
    3.你的CULLFACE,实际上不是你这个相机的视锥CULLFACE,而是主相机的CULLFACE,要不要都意义不大!
  
建议:

  1.这与你作投影映射贴图的目标是有差距的!(默认是对环境下几点下所有的几何面片做3D投影贴图)
2.方法:
  方法一:贴图的目标自己获得的不明确,首先要获取到这些你想要的faces
  遍历顶点坐标,计算点与贴图Mtrx的平面的距离符合的顶点的Geomtry中的PrimitiveSet::TRIANGLES集合
  方法二:或者先用所设的相机作为主相机,先获取一个视锥(得到一个远近剪裁适当的后,保存cutface 后得到的几何面片,或者视锥体与NODE几点先交的几何体),再做贴图
方法三:用一个平行截面把NODE节点一分为二,对需要的部分进行投影贴图

该用户从未签到

 楼主| 发表于 2013-7-4 13:13:21 | 显示全部楼层
VR_user_happy 发表于 2013-7-4 03:08
上次粗略看了一下你的代码,现再次仔细查看了你的代码!
观点如下:
     1.实际上你只是把相机的视线平行 ...

如果用您的方法3  设置了裁剪面 那另一面的模型  不就没有了吗? 如果我想从 多个位置 贴多张 图片 应该怎么办?

该用户从未签到

发表于 2013-7-4 16:26:42 | 显示全部楼层
如果你是用:方法三
  1. 你的目的是把模型拆解成2个NODE,不需要删除
  2.就是写个方法用一个平面把一个NODE 变成2个NODE;
3. 这样的你想多个贴图,就是对该方法的反复调用就可以了

该用户从未签到

发表于 2013-7-4 16:39:25 | 显示全部楼层
还有就是如果用方法2:
可以尝试:
1. 先吧投影相机设置为主相机,调节远剪裁面,这样CALLFACE,是不包含牛腿部的;
2.试着做一定时间的延时,即过一定数量帧后,再恢复主相机;(没有试过,不知道是否可行)

该用户从未签到

发表于 2013-7-4 17:28:36 | 显示全部楼层
利用楼上的cullface,采用多遍渲染也可以,但慢

该用户从未签到

 楼主| 发表于 2013-7-4 20:33:34 | 显示全部楼层
VR_user_happy 发表于 2013-7-4 16:39
还有就是如果用方法2:
可以尝试:
1. 先吧投影相机设置为主相机,调节远剪裁面,这样CALLFACE,是不包含 ...

谢谢 您的回复 , 我在试试 ,有结果了  给您回复

该用户从未签到

 楼主| 发表于 2013-7-8 00:10:09 | 显示全部楼层
我试了好多方法,还是不能解决问题,   只能继续求助, 各位大神多指点一下小弟

该用户从未签到

发表于 2013-7-8 01:14:10 | 显示全部楼层
实际就是把一个模型变变成两个模型节点,对符合要求的模型节点贴图
1.笨办法:
    把1个模型手工分成2个模型
2.加载两次clidNode,剪裁不同的区域,只对需要的节点贴图
3.纯数学计算,plane 与triangle集合的相交检查,计算,将1个TRIANGLE 插入点分割点变成2个TRIANGLE, 重现图元并再着色

该用户从未签到

 楼主| 发表于 2013-7-8 21:35:41 | 显示全部楼层
VR_user_happy 发表于 2013-7-8 01:14
实际就是把一个模型变变成两个模型节点,对符合要求的模型节点贴图
1.笨办法:
    把1个模型手工分成2个 ...

非常感谢您得回复,您说的用裁剪面和直接计算点的纹理坐标,我能明白。后来我用shader实现了一下 投影纹理映射, 但是效果和用普通的opengl程序是一样的,我现在就是不明白,我的投影矩阵换成了自己的矩阵为什么还是那个效果。    gl_TexCoord[1] = texMatrix *gl_Vertex;

该用户从未签到

发表于 2013-7-8 22:12:27 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-7-8 22:13 编辑

信息不够无法知道你的问题所在:
如果你想说的是改变那个矩阵,最简单的测试办法就是将原矩阵右乘一个旋转矩阵,看效果是否发生变化:
--- 原矩阵:
        osg:: Matrix MVPT = MVP *
                osg:: Matrix:: translate(1.0,1.0,1.0) *
                osg:: Matrix:: scale(0.5,0.5,0.5);


---改变后的矩阵:
osg:: Matrix MVPT = MVP *
                osg::Matrix:: translate(1.0,1.0,1.0) *
                osg::Matrix:: scale(0.5,0.5,0.5)*
               osg::Matrix:: Rotate(osg:: quat(osg:: PI/3,osg:: vec3(0.0,0.0,1.0)) ;// 这个旋转矩阵是自定义的绕Z轴旋转60度

后面依旧执行:       
texgen->setPlanesFromMatrix(MVPT);

该用户从未签到

发表于 2013-7-9 19:00:58 | 显示全部楼层
我现在直接用ShadowMap的方法来做Overlay的渲染,效果非常好,效率也非常高。您可以考虑借鉴这一思路

该用户从未签到

 楼主| 发表于 2013-7-9 19:18:57 | 显示全部楼层
VR_user_happy 发表于 2013-7-8 22:12
信息不够无法知道你的问题所在:
如果你想说的是改变那个矩阵,最简单的测试办法就是将原矩阵右乘一个旋转 ...

旋转肯定是有效果,, 我的意思是 改 投影矩阵的远近裁剪面,无效果

该用户从未签到

 楼主| 发表于 2013-7-9 19:25:27 | 显示全部楼层
array 发表于 2013-7-9 19:00
我现在直接用ShadowMap的方法来做Overlay的渲染,效果非常好,效率也非常高。您可以考虑借鉴这一思路

array您好, 我看了一下,osgShadow::ShadowMap ,我感觉也是用自动生成纹理做的,没看出什么不一样,您能详细的指点一下吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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