查看: 4542|回复: 10

如何动态修改heightfield顶点坐标

[复制链接]

该用户从未签到

发表于 2012-3-14 19:17:42 | 显示全部楼层 |阅读模式
我用程序生成一个路面,现在想知道如何动态修改heightfield顶点,从而达到修改地形的目的。

该用户从未签到

 楼主| 发表于 2012-3-14 22:01:14 | 显示全部楼层
小弟正在做一个项目,采用heightfield 生成一个平面,现在要是的heightfield某些顶点实现改变,象波浪般,如何实现

该用户从未签到

发表于 2012-3-15 09:56:53 | 显示全部楼层
CPU端的方案:VBO建立几何体,每帧遍历顶点和修改,dirty()
GPU端的方案:纹理参数表传入数据,然后vertex displacement

该用户从未签到

 楼主| 发表于 2012-3-15 12:04:23 | 显示全部楼层
array大大能否在说的详细点,CPU端和GPU端不太懂,我看到以前您给别人回复的一个帖子:
**********************************
longlong_fhl 发表于 2011-6-21 21:41:29

如何动态编辑VPB生成的地形,挖方等
我已经通过给每一个地形块设置一个读取回调,在读取地形块的时候,在和terrainTile相关的geometryTechnique的init函数里面,获得terrainTile的heightField,然后判断出在我指定多边形内的网格点,用setHeight来指定一个高程值。

这样以来,我发现每次只有在地形块被重新读取(比如我把场景拉远,再拉近,这样我修改过的地形块就被重新读取了)才可以实现挖方的效果。但是我不动场景的话,挖方效果就没有实现。

请问高手,如何实现?

array 发表于 2011-6-22 10:06:32

对于包含HeightField的那个Drawable,要重构它的显示列表和包围盒:
dirtyDisplayList()
dirtyBound()

*****************************

我感觉我的问题和上面的有点象,是不是设置Drawable,并且把Dynamic,然后再
dirtyDisplayList()
dirtyBound()
就可以了。
VBO还是不太熟悉,看您的书,那一段没看懂。。。

该用户从未签到

 楼主| 发表于 2012-3-15 12:05:21 | 显示全部楼层
关键问题在于
dirtyDisplayList()
dirtyBound()

这两函数是在哪儿写呢?在回调里面?

该用户从未签到

 楼主| 发表于 2012-3-15 18:25:17 | 显示全部楼层
今天我用VBO的方式,在回调里dirty成功,用dirtyDisplayList()和dirtyBound()还是没有成功。感觉VBO在debug下非常慢,在release下基本可以接受。汇报完毕,谢谢Array。接下来的问题,我想问,如何动态更改上述顶点的贴图呢,比如我改变了一篇数据,比如就是一个矩形,如何在改变这个矩形的贴图??

该用户从未签到

发表于 2012-3-16 09:48:23 | 显示全部楼层
CPU端的做法必然速度较慢,还有就是您说的这个问题基本上只能将这几个顶点单独抽离出来组成新的Geometry然后变纹理坐标来解决。或者放在另一个纹理通道并且在shader作出相应的设置,但是有纹理单元数的限制

该用户从未签到

 楼主| 发表于 2012-3-23 23:23:47 | 显示全部楼层
又进行了一个星期,非常令人沮丧,当我的地图上升到20x6m,分辨率为0.02时,无论采用VBO还是dirtyDisplayList速度都是非常的慢。
其实我的项目是根据车轮的动力学行为计算出车辙印迹,动力学引擎采用Vortex,一个加拿大开发的物理引擎。每一帧计算出动力学行为后,可以求解出当前步长下得沉陷量,然后将当前点的高程减去沉陷,从而获得车辙。基本想实现的过程就是这样。
目前还存在两个大问题:
1、上面说的计算速度的问题。开启VBO后,在上述分辨率下非常的慢。原来我一开始做5x5地图大小的测试时,计算速度尚可。因此,我考虑过采用LOD对地形进行分块,但是上面说了,物理引擎要求与几何保持对等物理模型,我不知怎么把LOD的各层级赋值给物理引擎的地形。我采用了一个比较土的办法,就是在车移动过程中,根据车的质心位置,周围动态生成一个5x5的地形,并通过左边换算把5x5的地形的网格和大地形对齐,并把两层地图重叠显示。这样一来,每次VBO只是一个5x5的地形,计算速度倒还是可以,问题在于车一旦走出5X5地图,车辙印迹就会消失了,直观效果不太好。

不知描述清楚没有,我想问处理类似场景时,基本思路如何开展?我一直很纠结,因为有车辙在,车还得乱走,那么我的分辨率只能在0.02m。这么小的分辨率,但是速度又上不去,一对矛盾啊。

该用户从未签到

 楼主| 发表于 2012-3-23 23:29:55 | 显示全部楼层
第2个问题,就是车辙印迹显示非常不明显。我的想法有两种,一是能否通过纹理映射,随着车辙产生,动态产生新的纹理贴图,至少能将轮廓给显示出来。第二,就是Array‘说的想改变顶点颜色,并混合显示。但是由于车辙印迹可能重复压过,会产生很多重复的点,用这种点来构造新的Geometry,最后还要叠加显示,似乎比较困难吧?用heightfield类来构造的Geometry,又不知道网格点与Geometry的Vorties是一个什么什么关系,能否通过网格点直接访问到Geometry点数组,改变顶点颜色呢?

该用户从未签到

 楼主| 发表于 2012-3-23 23:37:25 | 显示全部楼层
GPU端,那个高级了,我首次接触三维,opengl完全不会,有点菜菜的了。
有一个情况向汇报一下,在那个物理引擎Vortex中,自带了一个例子,可以显示车辙,但是收费,在自己的程序里不能用,发布不了,而且很多封装成dll。有一个现象我一直想不通,请各位大侠帮分析一下:它在代码中读入1副贴图,比如说dust01.jpg格式的,是一副实际拍摄的沙地图,非常奇怪的是,在debug模式下这幅图像是实际显示出来的,这个时候车轮压下去,车辙一样不明显。而在release模式下,就不一样了,整个地图贴图后就是一副均匀的黄色,而原来图案没有了,此时车辙就非常明显了。我从头文件可以看出有几点怀疑的,一个是用了osg::shader ,第二个是用了纹理动画。

上述现象,大家能否判断一下,老外的基本实现路线是什么呢?

该用户从未签到

发表于 2012-3-29 17:55:25 | 显示全部楼层
如何调度海量数据是无论任何人都要考虑的话题,建立LOD和空间索引结构,保证同时渲染和操控的点在某个范围内,这是您必须考虑的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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