#vec3 #3d #graphics

gfxmath-vec3

一个简单的3D数学库

5个版本

0.1.4 2021年2月23日
0.1.3 2021年2月23日
0.0.0 2021年2月14日

#693 in 图形API

Apache-2.0

27KB
460

gfxmath-vec3

一个简单的3D数学库,用于计算三维向量。

用法

Vec3

Vec3使用标准的{x, y, z}坐标系。我们可以通过调用其成员来获取每个轴的系数。

Vec3的结构如下

pub struct Vec3<T> {
    pub x: T,
    pub y: T,
    pub z: T
}

可以通过多种方式创建Vec3对象。

use gfxmath_vec3::Vec3;

// Standard construction
let v = Vec3 { x: 3.0, y: 1.0, z: 0.5 };

// Using `new` function
let v = Vec3::new(3.0, 1.0, 0.5);

// Using tuples
let v: Vec3<f32> = (3.0, 4.0, 9.0).into();

// Using macros
use gfxmath_vec3::vec3;
let v = vec3!(3.0, 4.0, 9.0);

assert_eq!(3.0, v.x);
assert_eq!(1.0, v.y);
assert_eq!(0.5, v.z);

运算符

Vec3实现了常见的数学运算符。

  • + , +=
  • - , -=
  • * , *=
  • / , /=
// Reminder: Rust automatically infers floats to `f64` and integers to `i64`.

let v1 = Vec3::new(3.0, 9.0, 2.5);
let v2 = Vec3::new(4.0, 5.0, 3.0);

let res = v1 + v2;

assert_eq!( 7.0, res.x);
assert_eq!(14.0, res.y);
assert_eq!( 5.5, res.z);

叉乘

use gfxmath_vec3::ops::Cross;
use gfxmath_vec3::Vec3;

let a = Vec3::new(1.0, 3.0, 2.5);
let b = Vec3::all(2.0);

let res = a.cross(b);

assert_eq!(1.0, res.x);
assert_eq!(3.0, res.y);
assert_eq!(-4.0, res.z);

点乘

use gfxmath_vec3::{Vec3, ops::Dot};
 
let a = Vec3::new(3.0, 4.0, 5.0);
let b = Vec3::new(2.0, 1.0, 3.0);
 
let res = a.dot(b);
 
assert_eq!(25.0, res);

归一化

生成一个单位向量。

use gfxmath_vec3::ops::Norm;
use gfxmath_vec3::Vec3;

let a = Vec3::<f32>::new(3.0, 4.0, 0.0);
let an = a.norm().unwrap();

assert_eq!(3.0/5.0, an.x);
assert_eq!(4.0/5.0, an.y);
assert_eq!(    0.0, an.z);

已知限制

左手原语

需要注意的是,当左侧是原语时,运算符的支持有限。这是由于特质的实现限制。在Rust语法中,impl <T> Add<Vec3<T>> for T是非法的(由于尾随的T),因为实现必须针对已知类型进行非局部特质的类型。由于Add来自core包,而T(要实现的类型)没有从本地特质派生,所以这是不可能的。

在撰写本文时,适用于左侧的常见运算符的原语包括f32f64i32i64

// Works
let lhs: f32 = 4.0;
let rhs = Vec3::<f32>::new(3.0, 4.0, 2.5);
let res = lhs + rhs;

// NOT SUPPORTED!!
let lhs: u32 = 4;
let rhs = Vec3::<u32>::new(3, 4, 2);
let res = lhs + rhs;

哈希实现

目前,以下类型的哈希实现有限制

  • f32
  • f64
  • i32
  • i64
  • u32
  • u64

展示

drawing

许可

Apache 2.0

依赖关系

~1.5MB
~35K SLoC