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,感觉自己没救了。

补遗

rskynet 里隐含了一个很小的花活,在渲染点集时,使用了 POV Ray 提供的一个模拟锈迹的纹理,其名为「Rust」。碰巧 rskynet 是用 Rust 语言写的,因此该纹理的名字颇为应景。

在 rskynet 源码目录的子目录 data 内,有 mesh.off 文件,包含了曲面网格数据。使用 rskynet 处理该数据,即

$ rskynet --mesh mesh.off

在生成的 mesh_object.inc 文件里,有以下代码:

#include "textures.inc"
#include "mesh_mesh.inc"
object {
  mesh_data
  texture {pigment {color Gray50}}
}

#include "mesh_vertices.inc"
object {
  mesh_vertices_data
  texture {Rust scale 0.3 * sky_r}
}

//#include "mesh_edges.inc"
//object {
//  mesh_edges_data
//  texture {pigment {color Gray}}
//}

可以看到,曲面网格顶点集合的纹理是 texture {Rust scale 0.3 * sky_r}

本想将 Rust 纹理用于曲面渲染,尝试之后,发现会导致曲面细节不容易分辨,而且有时会令渲染结果观感颇为诡异,例如

这种渲染效果让我一度想换成其他纹理,只是忽然想到,若将该纹理施于点集,点集的离散性应当有助于瓦解这种观感的诡异性,试验后发现的确如此,如下图所示

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


5.9k 声望
1.9k 粉丝
0 条评论
推荐阅读
《Lua-in-ConTeXt》10:缓冲区魔法
基于 ConTeXt 的缓冲区(Buffe)及其对 Lua 语言的支持,可以实现大段排版内容的预处理。所谓预处理,是指在 TeX 编译器对排版内容进行断行分页之前的处理,通常由排版者负责。

garfileo阅读 353

2023-01-02 技术周刊
阅读与一句话奋斗只是一种行动的昭示,而实际的行动却应该有详细的计划,清楚的段落,坚定的意志和力量。——戴尔·卡耐基资讯Stack Overflow 2022 年度开发者调查报告全新 QQ Linux 3.0 正式上线 其他平台的客户端 ...

magnesium1阅读 340

封面图
简单测试下hyperf框架和其他语言主流框架的压测对比(娱乐版)
php8出来后带来了好多新东西,正好闲来无事,就想看看php8加上swoole的加持下和其他主流语言的框架有啥差距(当然只是简单测试,单纯的输出hello word,说明不了什么问题,仅供娱乐)

vanve阅读 900

字节跳动在 Rust 微服务方向的探索和实践
近日, Qcon全球软件开发大会2022(上海站)圆满落幕,大会是由InfoQ 中国主办的综合性技术盛会,近百位国内外技术大咖现场分享前沿技术案例与创新实践。本文整理自字节跳动火山引擎基础架构服务框架工程师吴迪于...

CloudWeGo阅读 746

封面图
Rust 初步研究
StackOverflow 公布了报告 Rust 连续 7 年成为“最受欢迎”的语言。越来越多的公司准备在新项目上运用它来加强安全和性能上的保障: Gooogle、FaceBook、亚马逊等大公司内部都有开始在底层系统上用 Rust 替代部分C/...

混沌福王阅读 619

GaiaX开源解读 | 给Stretch(Rust编写的Flexbox布局引擎)新增特性,我掉了好多头发
GaiaX(盖亚),是在阿里文娱内广泛使用的Native动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX开源解读》,带大家看看过去三年GaiaX的发展过程。

阿里巴巴文娱技术阅读 570

初学 Rust 有感而发 20221221
前言最近,宇润突然想学下很火热的 Rust 语言,毕竟连著名大喷子 linus 都接纳了 Rust,肯定有它的可取之处。通过这篇文章来分享一下,我学习 Rust 语言的经验心得,如有说得不对请轻喷。Rust 语言官网:[链接]竟...

宇润阅读 559

5.9k 声望
1.9k 粉丝
宣传栏