▉ 热情在慢慢消退,逐渐冷却,惰性的冰川大兵压境,步步紧逼。— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█ “冰临城下”
前言不搭后语
逃避和放弃永远是最容易的选择!人一旦通过努力做到了某件事,就会慢慢形成积极的做事态度和思维模式。放弃一件事没什么,值得警惕的是,养成了放弃的习惯!
本节内容
如何可视化地图数据&地理数据
本节要实现效果
.....
今天是42岁
第043天周五
68
这是写给Houdini的第068封“情书”
我是geo流程图
我是pointvop
04 置换海拔数据
//-- 1a 引入海拔属性
//-- 1b alt属性值在-1~1之间,乘32767把grid转换成米
//-- 1c 再加个比例因子,依据下载的Tile的经纬度计算tile的边缘长度
//但是因为地球表面有扭曲,这里乘引入的RSTM海拔信息,添加一个浮动滑块amp振幅
float offset = f@alt*32767.0*chf("amp");
//-- 3 判断偏移,高于1万的移入一个组,然后y轴=0
if(offset>30.0){
@group_error = 1;
offset=0;
v@Cd = {1,0,0};
f@alt = 0;
}
//-- 2 置换到y轴上
v@P.y += offset;
06 模糊“出错点”再次置换
float offset = f@alt*32767.0*chf("amp");
v@P.y += offset;
07 为海拔属性设置的经纬度坐标系
//-- 1 引入经纬度
//-- 1a 因为输入的面有些锯齿边缘所以不是整数;但经纬度是整数,所以四舍五入
float max_lat = rint(detail(1,"max_lat"));
float min_lat = rint(detail(1,"min_lat"));
float max_lon = rint(detail(1,"max_lon"));
float min_lon = rint(detail(1,"min_lon"));
//-- 2 通过相对坐标(0,0)到对角(1,1)映射,经纬度的最大最小值
float lon = fit01(v@uv.x,min_lon,max_lon);
float lat = fit01(v@uv.y,min_lat,max_lat);
//-- 3 创建矢量坐标
vector latlon = set(lat,lon,0.0);
//-- 4 创建属性
v@latlon = latlon;
09 osm的经纬坐标系匹配成alt海拔属性的经纬坐标系
//--osm的经纬坐标系匹配给alt海拔属性的latlon坐标系
//-- 1 同样引入osm的最大最小经纬度;
// float max_lat = rint(detail(0,"max_lat"));
// float min_lat = rint(detail(0,"min_lat"));
// float max_lon = rint(detail(0,"max_lon"));
// float min_lon = rint(detail(0,"min_lon"));
//-- 2 将经纬度转成矢量坐标系;
vector osm_latlon = set(f@latitude,f@longitude,0.0);
//-- 3 使用uvsample在各自的经纬度坐标上采样网格的位置,
//从1接口-想要匹配的位置采样,还有1上的lanlon属性;最后采样应用在0接口-的位置上
v@P = uvsample(1,"P","latlon",osm_latlon);
首先
制作步骤
○
小节提要
本节将学习:
01)获得&转换地图数据:
1 获取开放地图数据
2 转换获得的数据
02)海拔属性置换&纠正:
1 引入海拔属性进行置换
2 纠正出现错误的点。
03)引入开放地图数据:
1 通过uv坐标映射范围成最大最小经度纬度
2 osm的经纬度采样“海拔经纬度坐标属性”
接下来
正式制作
使用软件:houdini17.5.229
01 获得&转换地图数据
1获取开放地图数据
准备工作
首先)更新“游戏工具”标签
游戏标签增加了很多工具
○ 具体操作 ○
任务1) 首先需要“开放地图数据”
到“开放地图网站”下载有海拔信息的地图数据
a)进入开放地图网站: openstreetmap.org/export
b)左侧点击“手动选择不同的区域”
任务2)然后需要“海拔数据”
问题)这个网站没有此数据
❖解决方案)
A)另一网站获取文件(http://dwtkns.com/srtm30m/)
关于数据:SRTMHGT文件
1)Shuttle Radar Topography Mission:航天飞机雷达地形任务。
2)点击黄色瓷砖下载相应的数据。
3)Tiles(每块瓷砖)是从NASA服务器下载的纬度/经度投影(EPSG:4326)中以1弧秒分辨率(3601x3601像素)压缩的SRTMHGT文件。
B)找到某个区域的“左下角,右上角”“坐标”
执行)
A)下载文件:并且知道了“左下角”坐标。
1)点击一块Tile,首先注册一下NASA。点击才能“下载”
B)还有显示它的“左下角坐标”,但是没有“右上角坐标”
(这里是:左下角坐标N39W032)
问题) 没有“右上角坐标”,
分析)可以参考一下旁边有连续连接Tile的坐标规律,比如这个四个Tile区域;
❖解决方案)可以推断出“右上角坐标”N40W031
任务3)回到“开放地图”网站找到对应区域
执行)
1)输入对应的左下角=N39W032,右上角坐标N40W031:
2)点击下载API:文件名叫map
3)重命名azores.osm(亚速尔群岛)
2 转换获得的数据
○两个文件○
1).hgt文件。2)osm文件
○ 具体操作 ○
解决方案)
❖ 1)把.hgt改成 .raw格式。
❖ 2)用ps打开。
测试)
a)图像模式转成32位。
b)使用曝光命令调节,白色就是高度信息
3)保存tif格式。
02 海拔属性置换&纠正
1 引入海拔属性进行置换
○ 节点 ○
○ 具体操作 ○
1)geo内建立sop_osm_import节点
(osm=open street map开放地图)
1-1)导入osm
需求)几何表格里有点对应的“经度”“纬度”。 我们需要经纬度与SRTMHGT文件进行匹配。
执行)
2)建立分辨率3601*3601的grid:size=10*10
3)引入“海拔贴图”//azros.tif;//输出属性alt(altitude海拔)
(现在grid每个点上都由alt高度属性)
需求)将这些数据转换成高度
执行)
4)pointwrangle:
//-- 1a 引入海拔属性
//-- 1b alt属性值在-1~1之间,乘32767把grid转换成米
//-- 1c 再加个比例因子,依据下载的Tile的经纬度计算tile的边缘长度 但是因为地球表面有扭曲,这里乘引入的RSTM海拔信息,添加一个浮动滑块amp振幅
float offset = f@alt*32767.0*chf("amp");
//-- 2 置换到y轴上
v@P.y += offset;
问题1)产生一个非常高的海拔
解决方案)改变“比例因子amp”
amp=0.001
2 纠正出现错误的点
○ 节点 ○
○ 具体操作 ○
问题2)残留一些细竖线;这些就是ps中的那些白点
改进)
1) 判断偏移,高于30(这个数值参考几何图表看y轴的高度,作者的是一万,我的是高于30)的移入一个组,设置偏移=0
if(offset>30.0){
@group_error = 1;
offset=0;
}
问题2a)效果仍然有问题
解决方案)在attribfrommap1过滤设置中
问题2b)还是有些点要纠正
测试)将error组中的那些点设置成红色
v@Cd= {1,0,0};
这些要纠正的点,需要跟周围融合一下
解决方案)
通过模糊出错点的模糊属性,以适应整个地形
1)增加attributblur节点
2)新增加pointwrangle,条件判断取消
float offset = f@alt*32767.0*chf("amp");
v@P.y += offset;
问题2c)还是有点没有纠正过来
分析)因为模糊之前,这些要纠正的点alt属性也应该=0
float offset = f@alt*32767.0*chf("amp");
if(offset>300.0){
@group_error = 1;
offset=0;
//v@Cd = {1,0,0};
f@alt = 0;
}
//v@P.y += offset;
通过过滤和修正“海拔属性alt”引入到grid上
03 引入开放地图数据
1 通过uv坐标映射范围成最大最小经度纬度
○ 具体操作 ○
02)降低一下grid分辨率:360*360
03)pointwragle3
问题1)grid上需要“经度”“纬度”属性
分析)
sop_osm_import节点的几何图表
1)最大最小的“经度lontitude”“纬度 latitude”
2)理论上相当于下载的Tile的坐标。
3)引入“经纬度”为grid的点生成坐标。
执行)
1)sop_osm_import连接pointwrangle3的“槽2”
2)vex代码
//-- 1 引入经纬度
//-- 1a 因为输入的面有些锯齿边缘所以不是整数;但经纬度是整数,所以四舍五入
float max_lat = rint(detail(1,"max_lat"));
float min_lat = rint(detail(1,"min_lat"));
float max_lon = rint(detail(1,"max_lon"));
float min_lon = rint(detail(1,"min_lon"));
问题2)建uv坐标映射成纬度最大最小值建坐标属性
解决方案)
1)使用uv Texture 产生uv坐标属性
现在有了uv相对坐标属性
2)将uv坐标范围映射成“经纬度最小最大范围”
float lon = fit01(v@uv.y,min_lon,max_lon);
floatlat =fit01(v@uv.x,min_lat,max_lat);
3)创建经纬度坐标属性
//-- 创建矢量变量坐标
vector latlon =set(lat,lon,0.0);
//-- 创建经纬度属性
v@latlon = latlon;
2 osm的经纬度采样“海拔经纬度坐标属性”
执行)
1)pointwrangle4:
a)“槽1”连接sop_osm_import1b)"槽2"连接“pointwrangle3”
b) vex代码:
//-- 将经纬度转成矢量坐标系;
vector osm_latlon =set(f@latitude,f@longitude,0.0);
//-- 3 使用uvsample在各自的经纬度坐标上采样网格的位置,
//从1接口-想要匹配的位置采样,还有1上的lanlon属性;最后采样应用在0接口-的位置上
v@P =uvsample(1,"P","latlon",osm_latlon);
可视化地图数据&地理数据
今天就到这里,收功
教程翻译自entagma的网络教程
下一节::20180924 Crochet - Blending between Delaunay and Voronoi
电子邮箱:oneinchtime@126.com
公众号:
微信号