乐趣区

关于rust:rskynet

rskynet 是用 Rust 语言编写的小程序,尽管它的名字叫天网(Skynet),但它确实是一个小程序,代码有余千行,当前也不会有更多的代码。之所以写这个程序,一是为了相熟 Rust 语言,二是为了便于可视化我的一些三维数据。rskynet 的前身是一份用 Python 3 写的脚本,名字叫 hamal [1]。二者性能基于一样,但 rskynet 在抉择三维场景的察看方位更为容易,因为它实现了当初我的一个构想 [2],即在场景的突围球上,以经纬度的形式结构察看方位。

源码的获取和编译

$ git clone https://gitee.com/garfileo/rskynet.git
$ cd rskynet
$ rustc -O rskynet.rs

用法

在 rskynet/data 目录,我提供了 5 份三维数据文件作为示例,其类型别离是点集(points.asc)、矢量集(vectors.asc)、线段集(paths.asc)、轴向盒集(boxes.asc),曲面网格(mesh.off),要实现它们的可视化,只需

# 渲染点集
$ rskynet --points points.asc
$ povray +A +P points.pov

# 渲染矢量集
$ rskynet --vectors vectors.asc
$ povray +A +P vectors.pov

# 渲染门路集
$ rskynet --paths paths.asc
$ povray +A +P paths.pov

# 渲染轴向盒集
$ rskynet --boxes boxes.asc
$ povray +A +P boxes.pov

# 曲面网格
$ rskynet --mesh mesh.asc
$ povray +A +P mesh.pov

rskynet 输入了什么?

以点集为例,将点集文件 foo.asc 输出 rskynet,亦即

$ rskynet --points foo.asc

rskynet 可在当前目录输入以下文件:

.
├── foo.inc
├── foo.ini
├── foo_object.inc
├── foo.pov
└── foo_view.inc

其中,foo.pov 用于汇总其余文件内容,造成残缺的三维场景。

上述示例生成的 foo.pov 内容如下:

#version 3.7;
#include "colors.inc"
global_settings {assumed_gamma 1.0}

// 相机参数(可依据须要,自行批改)#declare sky_u = 0;
#declare sky_v = 0;
#declare theta = 0;
#declare odc = 3; // Object distance coefficient.

// 零碎参数(不倡议自行批改)#declare bs_center = <-0.278, 4.010, -2.365>; // 突围球核心
#declare bs_r = 156.802; // 突围球半径
#declare sky_r = odc * bs_r; // 天球半径

// 点、矢量、线段的尺寸参数
#declare point_size = 0.0025 * sky_r;
#declare line_width = 0.75 * point_size;
#declare arrow_size = point_size;

#include "foo_view.inc"
#include "foo_object.inc"

即便对 POV Ray 场景语言不相熟也不妨,只需晓得以下参数决定着三维场景的察看方位:

// 相机参数(可依据须要,自行批改)#declare sky_u = 0;
#declare sky_v = 0;
#declare theta = 0;
#declare odc = 3; // Object distance coefficient.

其中,sky_usky_v 示意场景突围球的经度和纬度,其值若为负数别离示意东经和北纬,正数示意西经和南纬。theta 示意相机倾角,负数向右歪斜,正数示意向左歪斜。odc 是决定了场景突围球的大小,其值为 1 时,场景突围球近似为场景中所有三维数据的突围球,能够通过 odc 管制场景的放大和放大。

三维察看

下图是基于默认的相机参数的渲染后果:

假使将相机的经度参数批改为

#declare sky_u = 90;

则渲染后果变为:

将相机歪斜角度参数批改为

#declare theta = -90;

渲染后果变为

假使将 sky_utheta 固定下来,一直批改 sky_v 的值,相当于在东经 90 度的经线上的各个维度查看图形。

假使将 odc 的值放大,能够察看到三维数据的部分,为了近距离看到点数据,也能够将 point_size 的值增大,例如:

#declare odc = 0.3;
... ... ...
#declare point_size = 0.01 * sky_r;

可得以下后果:

在通过经纬度和相机倾角结构察看方位时,务必记住,默认的初始方位是经纬皆为 0,且相机歪斜角度为零,此时相当于相机在赤道的经纬度为 0 的地位,头朝正北,向下鸟瞰。假使将相机挪动到其余经纬坐标时,其顶端朝向与经线相切且指向南方,此时须要将心比心思考相机的倾角如何调整以取得合乎须要的察看方位。

结语

若感觉 rskynet 有些用途,最好学一些 POV Ray 的基本知识,置信我,没那么难,浅尝辙止亦可。

Rust 不好用,特地是泛型,束手束脚,仿佛是心愿大家写代码时最好别用泛型……相形之下,我还是喜爱 C,感觉本人没救了。

[1] https://segmentfault.com/a/11…
[2] https://segmentfault.com/a/11…

退出移动版