▉ 浮生碌碌-你动或不动。都要跟随地球每天日行八万里,是否可以推理:地球上所有人都在背井离乡?— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】
█懒惰的马只会嫌路途遥远。-蒙古族格言
何以为家:
人类在地球上流浪。地球在宇宙中流浪,宇宙在时间里流浪,我们都是游牧民族。
迁徙成了这个时代的主题。而且随着交通工具的越来越发达,越来越频繁。每天我们都日行八万里,家也在这个流浪的地球上永远地球自转的路上。只要时间的河流存在,就永不停息。定居只是一个相对概念,不断迁徙不断变化才是生命的真面目。
我的姥姥家是据说是唐山人,旧社会她的父亲叔叔都是开火车的,小时候生活在当时首都南京,抗日时期,火车一路南下到广州,两家人在此分开,辗转四川资阳,48年妈妈在湖南出生,然后又回到了济南,最后又跟随姥爷一家到了3线北方瓷都。大串联妈妈独自还南下她叔叔家,后来就断了音信,然后妈妈与祖居此地的爸爸相遇。另一边老婆一家祖籍河南,支援边疆,父辈到了新疆,在吐鲁番几地辗转,当会计的岳父曾牵着驮着要发工资的骆驼被风暴埋在沙漠里,最后在边界定居下来,89届的哥哥大学毕业辗转大半个中国,潦倒在海南,最后回到北京算有些起色,将一家人接到到北京,我北漂,与老婆有缘千里,儿子又生在hk,现在南征北战分居两地,上演双城记。这一代的我们继续拥抱变化,四处迁徙!
让变化成为计划的一部分,也让迁徙也成为了生命的一部分,生命不息,流浪不止!
今天这节内容:
如何导入csv数据,视觉化全球航线。
这一节要实现的效果....
▉今天是42岁第020天周三
这是写给houdini的
第046封“情书”
我是geo流程图
我是pointwrangle代码图
==创建全球机场位置==
//--创建球面到卡笛尔坐标系的函数,次函数返回一个矢量--
//--Function for converting sphercial to cartesian coordinates--
vector SpherToCart(float lat,lon,rad){
//--从球形到卡笛尔的转换函数
return rad*set(-cos(lat)*cos(lon), sin(lat), cos(lat)*sin(lon));
}
//--执行函数--//将纬度经度从度转换为弧度,半径=1
v@P = SpherToCart(radians(@lat),radians(@lon),1.0);
//---为点增加法线---
v@N = normalize(@P);
==创建全球机场出发点和目的地的连线==
//--首先引入机场的位置信息---
//--point=点属性的类,id=这个类名称,i@scr=来源数值中查找的值--
//--findattribval函数返回与指定属性@src和给给定值idp匹配的第一个点或prim的id,
//槽1几何图形获得-始发点和目的地的id
int src = findattribval(1,"point","id",i@src);
int dst = findattribval(1,"point","id",i@dst);
//---创建polyline,和它的归属组------
if(src >= 0 && dst >= 0){
int newprim = addprim(0,"polyline");
setprimgroup(0,"new",newprim,1);
//槽1几何图形的起始点,目的地的位置--
vector v1 = point(1,"P",src);
vector v2 = point(1,"P",dst);
//--根据位置,在槽0几何图形增加起点p1,终点p2--
int p1 = addpoint(0,v1);
int p2 = addpoint(0,v2);
//--始末点距离--
float distance = distance(v1,v2);
//--为点设置距离属性--
setpointattrib(0,"dist",p1,distance);
setpointattrib(0,"dist",p2,distance);
//--增加顶点--
addvertex(0,newprim,p1);
addvertex(0,newprim,p2);
}
==将路径上所有点铁道球的表面==
//所有点回到原来的位置
v@P = normalize(@P);
//给点增加法线
v@N = normalize(@P);
==线条从球体表面抬起的距离==
float scale = chf("Lift_Scale");
//--点的curveu属性以0作为curve的开始到1结束--
float lift = chramp("Lift_Amount",@curveu);
float width = chramp(“width”,@curveu);
//--计算新的点位置—
//scale=考虑两点之间的距离;
vector liftpos = v@P + (v@N * lift * scale * @dist );
v@P=liftpos;
f@width = width * 0.0005;
本节需要注意的知识点:
1
球形经纬度度数如何转换乘卡笛尔坐标
全球机场的位置信息图
1) 创建一个函数:
SpherToCart(float lat,lon,rad),
只输入经度lat,纬度lon,半径r,(注:)返回一个点的空间坐标。
1-1)函数内部:用rad*set(x,y,z)得到转换的点的度数
vector SpherToCart(float lat,lon,rad){
return rad*set(-cos(lat)*cos(lon), sin(lat), cos(lat)*sin(lon));
}
2)执行函数:得到位置P
需要用radians函数把经纬度的度数转换成弧度。
v@P = SpherToCart(radians(@lat),radians(@lon),1.0);
3)增加法线:N
v@N = normalize(@P);
2
如何创建航线起点和终点之间的连线
航班之间的连线图
1) 创建连线需要三个条件:a)prim。b)point。c)vertex
====准备工作=====
a)现在“槽0”的几何图形只有“起始地”和“目的地”的id信息。
b)通过这个Id信息从获取起始地和目的地在“槽1”几何图形中对应的id,函数findattribval:src=findattribval(1,"point","id",i@src);
c)在通过这个ID获取它们对应的空间位置P(v1,v2)【vectorv1 = point(1,"P",src);】
====创建连线=====
a)prim:不受条件值首先建立 newprim = addprim(0,"polyline");【补充,为这个newprim创建一个组:setprimgroup(0,"new",newprim,1); 后面调用它来删除多余的prim】
b)point:根据位置v1,v2,在 “槽0”的几何体中addpoint函数增加起点和终点id【intp1 = addpoint(0,v1);】
c)vertex:addvertex(0,newprim,p1);
==== 创建后面用到的变量=====
a)起点与终点的距离distance:
disance(v1,v2)【后面抬起线段中心会用到】
b)为点创建距离属性dist:
setpointattrib(0,"dist",p1,distance);
setpointattrib(0,"dist",p2,distance);
3
如何让直线变成贴在地球表面的弧线
1)首先增加点 resample a)Length=0.02; b)勾选 Curve U Attribute:curveu后面让弧线中间抬高会用到。
2)然后pointwrangle //
//因为半径是1,所以标准化以后,点自然回到了半径为1的地球表面。
v@P = normalize(@P);
//增加法线
v@N = normalize(@P);
4
如何抬升弧线中间部分
1)调用curveu属性,创建chramp斜坡参数
2)抬起位置变量liftpos=当前点+(法线*可调变量lift*scale*距离@dist)。
3)最后位置变量赋给当前位置v@P
接下来
准备工作
csv数据库
网站
01)首先需要一个数据;这里有个免费的机场航空公司航线数据库网站:https://openflights.org/data.html下载两个文件
A)Download: airports.dat (Airports only, high quality)
B)Download: routes.dat (~2 MB)
(番外:作者推荐他的朋友的做一个有用的houdini的节点库https://github.com/NiklasRosenstein/houdini-library)
点击:otl:一些针对houdini的csv导入增加了一些功能,例如导入已被分割成单个文件的数据。或者过滤输入日期。
分析数据
编辑器打开数据文件:
用到的数据是:
接下来
开始正式制作
使用软件houdini16.5
问题1:如何使用地理数据
==创建routs航线数据==
1)tableimport1 // 导入数据后,按一下输入
都是整数;属性长度=1
a)src起始地(source);第3列
b)dst目的地( destination目的地 );第5列
==导入实际机场位置==
2)tableimport2 // <>
我们需要将机场的位置可视化:(连接机场的航线,需要机场的位置和id)
A)位置: “纬度latitude”第6列;“经度longitude”第7列
B)ID:第0列。
番外 //这里有个翻译器自动翻译经度和纬度。理论上可以把经纬度坐标系,转成houdini的坐标系,但是并不成功,所以还是手动建立
问题2:如何创建全球机场位置图
3)pointwrangle // 创建球面到卡笛尔坐标系的函数,返回一个矢量。
//--Function for converting sphercial to cartesian coordinates--
vector SpherToCart(float lat,lon,rad){
//--从球形到卡笛尔的转换函数
//-----x轴值-------//---y轴值---//------z轴------
return rad*set(-cos(lat)*cos(lon), sin(lat), cos(lat)*sin(lon));
}
//--执行函数--//将纬度经度从度转换为弧度,半径=1
v@P = SpherToCart(radians(@lat),radians(@lon),1.0);
//---为点增加法线---
v@N = normalize(@P);
问题3:如何将全球航线连接起来
4)pointwrangle2 // 槽2接<3>节点
//--首先引入机场的位置信息---
int src = findattribval(1,"point","id",i@src);
int dst = findattribval(1,"point","id",i@dst);
//---创建polyline,和它的归属组------
if(src >= 0 && dst >= 0){
int newprim = addprim(0,"polyline");
setprimgroup(0,"new",newprim,1);
//--起始点,目的地的矢量位置--
vector v1 = point(1,"P",src);
vector v2 = point(1,"P",dst);
//--增加点--
int p1 = addpoint(0,v1);
int p2 = addpoint(0,v2);
//--始末点距离【后面抬起线段中心胡用到】--
float distance = distance(v1,v2);
//--为点设置距离属性--
setpointattrib(0,"dist",p1,distance);
setpointattrib(0,"dist",p2,distance);
//--增加顶点--
addvertex(0,newprim,p1);
addvertex(0,newprim,p2);
}
==删除多余点==
5)balst//
a) group:new
b)勾Delete Non Selected
问题4:如何将连线弧形与地球表面
6)resample //
a)Length=0.02
b)勾选 Curve U Attribute:curveu
把这些点投射到sphere表面
7)pointwrangle //
//所有点回到原来的位置,因为半径是1,标准化后,点自然回到了半径1的位置
v@P = normalize(@P);
v@N = normalize(@P);
问题5:如何抬高弧线中心区域
这里就用到curveu属性
a)路径上的点从起点0到终点100%,对应的curveu从0~1,可以做一个映射;
b)抬起位置变量liftpos=当前点+(法线*可调变量lift*scale*距离@dist)。
C)最后位置变量赋给当前位置v@P
float scale = chf("Lift_Scale");
//--点的curveu属性以0作为curve的开始到1结束--
float lift = chramp("Lift_Amount",@curveu);
float width = chramp(“width”,@curveu);
//--计算新的点位置—
//scale=考虑两点之间的距离;
vector liftpos = v@P + (v@N * lift * scale * @dist );
v@P=liftpos;
f@width = width * 0.0005;
【】scale控制抬起的高度。lift则控制形态,而这都是通过curveu来做判断。
今天就到这儿了,收功
教程翻译自entagma的网络教程
下一节:第047封“Premium Course Volumes 101 Preview
本文图片全部原创,版权归原作者所有