第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第1张图片

▉ 浮生碌碌-你动或不动。都要跟随地球每天日行八万里,是否可以推理:地球上所有人都在背井离乡?— 每天翻译一篇教程,这就是我写给houdini的情书。【首发于同名公众号:“致houdini的情书”】

懒惰的马只会嫌路途遥远。-蒙古族格言

何以为家

    人类在地球上流浪。地球在宇宙中流浪,宇宙在时间里流浪,我们都是游牧民族。

迁徙成了这个时代的主题。而且随着交通工具的越来越发达,越来越频繁。每天我们都日行八万里,家也在这个流浪的地球上永远地球自转的路上。只要时间的河流存在,就永不停息。定居只是一个相对概念,不断迁徙不断变化才是生命的真面目。

    我的姥姥家是据说是唐山人,旧社会她的父亲叔叔都是开火车的,小时候生活在当时首都南京,抗日时期,火车一路南下到广州,两家人在此分开,辗转四川资阳,48年妈妈在湖南出生,然后又回到了济南,最后又跟随姥爷一家到了3线北方瓷都。大串联妈妈独自还南下她叔叔家,后来就断了音信,然后妈妈与祖居此地的爸爸相遇。另一边老婆一家祖籍河南,支援边疆,父辈到了新疆,在吐鲁番几地辗转,当会计的岳父曾牵着驮着要发工资的骆驼被风暴埋在沙漠里,最后在边界定居下来,89届的哥哥大学毕业辗转大半个中国,潦倒在海南,最后回到北京算有些起色,将一家人接到到北京,我北漂,与老婆有缘千里,儿子又生在hk,现在南征北战分居两地,上演双城记。这一代的我们继续拥抱变化,四处迁徙!

    让变化成为计划的一部分,也让迁徙也成为了生命的一部分,生命不息,流浪不止!

今天这节内容:

    如何导入csv数据,视觉化全球航线。

这一节要实现的效果....

▉今天是42岁第020天周三

这是写给houdini的

第046封“情书”

我是geo流程图

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第2张图片

我是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

球形经纬度度数如何转换乘卡笛尔坐标 

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第3张图片

全球机场的位置信息图

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

如何创建航线起点和终点之间的连线

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第4张图片

航班之间的连线图

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第5张图片

1) 创建连线需要三个条件:a)prim。b)point。c)vertex

====准备工作=====

    a)现在“槽0”的几何图形只有“起始地”和“目的地”id信息。

    b)通过这个Id信息从获取起始地目的地“槽1”几何图形中对应的id,函数findattribvalsrc=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

如何让直线变成贴在地球表面的弧线

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第6张图片

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导入增加了一些功能,例如导入已被分割成单个文件的数据。或者过滤输入日期。 

分析数据

编辑器打开数据文件:

用到的数据是:

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第7张图片

接下来

开始正式制作

使用软件houdini16.5

问题1:如何使用地理数据

==创建routs航线数据==

1)tableimport1 // 导入数据后,按一下输入

都是整数;属性长度=1

    a)src起始地(source);第3列

    b)dst目的地( destination目的地 );第5列

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第8张图片

==导入实际机场位置==

2)tableimport2  //  <>

我们需要将机场的位置可视化:(连接机场的航线,需要机场的位置和id)

A)位置: “纬度latitude”第6列;“经度longitude”第7列

B)ID:第0列。

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第9张图片

  番外  //这里有个翻译器自动翻译经度和纬度。理论上可以把经纬度坐标系,转成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);

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第10张图片

问题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);

}

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第11张图片

==删除多余点==

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);

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第12张图片

问题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来做判断。

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第13张图片
第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第14张图片

今天就到这儿了,收功

教程翻译自entagma的网络教程

下一节:第047封“Premium Course Volumes 101 Preview

第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017_第15张图片

     本文图片全部原创,版权归原作者所有

你可能感兴趣的:(第046封“情书”:流浪地球Visualizing Flight Paths In Houdini<Entagma>Houdini 2017)