千家信息网

rust下的图形绘制库valora有什么特性

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要介绍了rust下的图形绘制库valora有什么特性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。valora特性valor
千家信息网最后更新 2025年12月03日rust下的图形绘制库valora有什么特性

这篇文章主要介绍了rust下的图形绘制库valora有什么特性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。


valora特性

  • valora包含了rng(Random Number Generator)
  • 在不改变composition scale的情况下复现任意分辨率的图形
  • 使用了type-safe color可以保证色彩的印刷一致性
  • 充分利用硬件资源
  • 充分利用Rust特性,大幅减少了调试工作量

下面我们参考valora网站上的教程来体验绘制功能

开发环境

  • Windows 10
  • cargo version: cargo 1.45.0-nightly (9fcb8c1d2 2020-05-25)
  • rustc --version: rustc 1.45.0-nightly (56daaf669 2020-06-03)

初始化新的rust工程之后使用命令安装

cargo install cargo-edit && cargo add valora

注意:由于valora的依赖项中有些包使用了测试版本,所以需要使用rustc nightly版本才能顺利安装。如果使用rustc stable版本会报错。

切换stable到nightly版本

rustup default nightly

体验valora绘制功能

接下来我们通过valora主页中Introduction部分的例子来体验绘制功能

原始代码如下:

use valora::prelude::*;
fn main() -> Result<()> { run_fn(Options::from_args(), |_gpu, world, _rng| { Ok(move |ctx: Context, canvas: &mut Canvas| { canvas.set_color(LinSrgb::new(1., 1., 1.)); canvas.paint(Filled(ctx.world));
let max_radius = world.width / 3.; let radius = ctx.time.as_secs_f32().cos().abs() * max_radius;
canvas.set_color(LinSrgb::new(1., 0., 0.)); canvas.paint(Filled(Ellipse::circle(world.center(), radius))); }) })}

接下来我们通过修改原始代码中的一些参数来体验valora绘制的可玩性。

首先我们准备对例子中的背景色和圆形色彩下手。至于例子代码中相对细节的ctx, _gpu等关键部分现阶段可以不用深入了解。

valora使用的色彩定义LinSrgb是均一化的rgb,通常来说rgb取值范围为0 ~ 255,均一化就是0 ~ 1。值得注意的是赋值使用了浮点数(1., 0., 0.),一般来说图形范畴内使用浮点数很普遍。

有了这些概念我们可以去找个在线color picker去选择一下我们想要的背景色和圆的颜色。

经过一番picker之后

  • 背景色选择了 rgb(153, 204, 255),类似天空蓝色。
  • 圆形的颜色用个橙色类似的 rgb(255, 153, 51)

那么我们把选定的色彩粘贴到代码中,同时做个均一化的除法

// color of background canvas.set_color(LinSrgb::new(153./255., 204./255., 255./255.));
// color of circle canvas.set_color(LinSrgb::new(255./255., 153./255., 51./255.));

原始代码中圆形只是在中间位置scale缩放,有点呆。

结合一点写代码的背景知识,一般来说带有绘制功能的视觉库都是用一个二维或者三位维向量来做位置参数,旋转用个3X3矩阵之类的套路。

再结合一点线性代数知识,向量外层乘以固定系数应该还是个向量。

那么我们直接把上面负责变形的代码复制粘贴到位置矩阵旁边,同时做个乘法,让圆心的x和y等尺度变化。

这样就可以实现了类似高空摄像机向下拍摄一个弹跳皮球运动的视觉误差,复制粘贴走起(主要是懒)

canvas.paint(Filled(Ellipse::circle(world.center() * ctx.time.as_secs_f32().cos().abs(), radius)));

修改之后运行一下看看效果,还凑合


感谢你能够认真阅读完这篇文章,希望小编分享的"rust下的图形绘制库valora有什么特性"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

0