golang高性能2D/3D数学计算插件库go3d的使用

Golang高性能2D/3D数学计算插件库go3d的使用

go3d是一个面向性能的2D和3D图形向量和矩阵数学计算包。

基本概念

  • 每种类型都有自己的子包,并以T命名。例如vec3.T表示3D向量类型
  • 每个向量和矩阵类型都有String()方法和Parse()函数
  • 除了T的方法外,包中还有函数,如vec3.Dot(a, b)
  • float64目录下的包使用float64值而不是float32

矩阵组织方式

矩阵被组织为列数组,这也是OpenGL期望的矩阵格式。DirectX期望"行数组"矩阵,可以使用Transpose()方法进行转换。

方法链式调用

不返回特定值的方法会返回指向结构体的指针,以允许方法链式调用。

示例:

a := vec3.Zero
b := vec3.UnitX
a.Add(&b).Scale(5)  // 链式调用

方法返回值

过去式的方法名会返回结构体的副本而不是指向它的指针。

示例:

a := vec3.UnitX
b := a.Scaled(5) // a仍然等于vec3.UnitX

性能设计

该包在必要时优先考虑性能而非易用性。这就是为什么许多参数通过指针引用传递而不是通过值传递的原因。

完整示例

下面是一个完整的go3d使用示例:

package main

import (
	"fmt"
	"github.com/ungerik/go3d/vec3" // 导入3D向量包
)

func main() {
	// 创建零向量
	zero := vec3.Zero
	fmt.Println("Zero vector:", zero)

	// 创建X轴单位向量
	unitX := vec3.UnitX
	fmt.Println("Unit X vector:", unitX)

	// 向量加法
	v1 := vec3.T{1, 2, 3}
	v2 := vec3.T{4, 5, 6}
	v1.Add(&v2)
	fmt.Println("Vector addition:", v1)

	// 向量缩放
	v1.Scale(2)
	fmt.Println("Scaled vector:", v1)

	// 点积计算
	dot := vec3.Dot(&v1, &v2)
	fmt.Println("Dot product:", dot)

	// 叉积计算
	cross := vec3.Cross(&v1, &v2)
	fmt.Println("Cross product:", cross)

	// 向量长度
	length := v1.Length()
	fmt.Println("Vector length:", length)

	// 向量归一化
	v1.Normalize()
	fmt.Println("Normalized vector:", v1)
}

矩阵运算示例

package main

import (
	"fmt"
	"github.com/ungerik/go3d/mat4" // 导入4x4矩阵包
	"github.com/ungerik/go3d/vec3" // 导入3D向量包
)

func main() {
	// 创建单位矩阵
	identity := mat4.Ident
	fmt.Println("Identity matrix:\n", identity)

	// 创建旋转矩阵
	rotation := mat4.Ident
	rotation.RotateX(3.14159 / 2) // 绕X轴旋转90度
	fmt.Println("Rotation matrix:\n", rotation)

	// 创建平移矩阵
	translation := mat4.Ident
	translation.Translate(&vec3.T{1, 2, 3})
	fmt.Println("Translation matrix:\n", translation)

	// 矩阵乘法
	result := mat4.Mult(&rotation, &translation)
	fmt.Println("Matrix multiplication result:\n", result)

	// 矩阵转置
	transposed := result.Transposed()
	fmt.Println("Transposed matrix:\n", transposed)

	// 矩阵与向量相乘
	vec := vec3.T{1, 0, 0}
	transformedVec := result.MulVec3(&vec)
	fmt.Println("Transformed vector:", transformedVec)
}

注意:使用前需要先安装go3d包:

go get github.com/ungerik/go3d

更多关于golang高性能2D/3D数学计算插件库go3d的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能2D/3D数学计算插件库go3d的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go3D - 高性能2D/3D数学计算库

Go3D是一个专为Golang设计的高性能2D和3D数学计算库,提供了向量、矩阵、四元数等基本数学结构的实现,适用于游戏开发、图形处理和科学计算等领域。

安装

go get github.com/ungerik/go3d

核心功能与示例

1. 向量运算

package main

import (
	"fmt"
	"github.com/ungerik/go3d/float64/vec2"
	"github.com/ungerik/go3d/float64/vec3"
)

func main() {
	// 2D向量
	v1 := vec2.T{1.0, 2.0}
	v2 := vec2.T{3.0, 4.0}
	
	// 向量加法
	sum := vec2.Add(&v1, &v2)
	fmt.Println("2D向量和:", sum) // [4 6]
	
	// 点积
	dot := vec2.Dot(&v1, &v2)
	fmt.Println("点积:", dot) // 11
	
	// 3D向量
	v3 := vec3.T{1.0, 2.0, 3.0}
	v4 := vec3.T{4.0, 5.0, 6.0}
	
	// 叉积
	cross := vec3.Cross(&v3, &v4)
	fmt.Println("叉积:", cross) // [-3 6 -3]
	
	// 归一化
	normalized := v3.Normalized()
	fmt.Println("归一化:", normalized)
}

2. 矩阵运算

package main

import (
	"fmt"
	"github.com/ungerik/go3d/float64/mat3"
	"github.com/ungerik/go3d/float64/mat4"
)

func main() {
	// 3x3矩阵
	m1 := mat3.Ident
	fmt.Println("单位矩阵:\n", m1)
	
	m2 := mat3.T{
		1, 2, 3,
		4, 5, 6,
		7, 8, 9,
	}
	
	// 矩阵乘法
	var result mat3.T
	mat3.Mul(&result, &m1, &m2)
	fmt.Println("矩阵乘法结果:\n", result)
	
	// 4x4矩阵 - 常用于3D变换
	translation := mat4.Translate(&vec3.T{10, 20, 30})
	fmt.Println("平移矩阵:\n", translation)
	
	rotation := mat4.RotateX(1.57) // 旋转90度(1.57弧度)
	fmt.Println("X轴旋转矩阵:\n", rotation)
	
	// 组合变换
	var transform mat4.T
	mat4.Mul(&transform, &translation, &rotation)
	fmt.Println("组合变换矩阵:\n", transform)
}

3. 四元数

package main

import (
	"fmt"
	"github.com/ungerik/go3d/float64/quaternion"
	"github.com/ungerik/go3d/float64/vec3"
)

func main() {
	// 创建四元数
	q1 := quaternion.T{0.707, 0, 0.707, 0} // 绕Y轴旋转90度
	q2 := quaternion.FromEulerAngles(0.5, 0.2, 0.3)
	
	// 四元数乘法
	var qProduct quaternion.T
	quaternion.Mul(&qProduct, &q1, &q2)
	fmt.Println("四元数乘积:", qProduct)
	
	// 旋转向量
	v := vec3.T{1, 0, 0}
	rotated := q1.RotatedVec3(&v)
	fmt.Println("旋转后的向量:", rotated)
	
	// 转换为矩阵
	rotationMatrix := q1.Mat4()
	fmt.Println("旋转矩阵:\n", rotationMatrix)
}

4. 几何运算

package main

import (
	"fmt"
	"github.com/ungerik/go3d/float64/vec3"
	"github.com/ungerik/go3d/float64/plane"
)

func main() {
	// 平面
	p := plane.FromPoints(
		&vec3.T{0, 0, 0},
		&vec3.T{1, 0, 0},
		&vec3.T{0, 1, 0},
	)
	fmt.Println("平面方程:", p.Normal, p.Distance)
	
	// 点到平面距离
	point := vec3.T{1, 1, 1}
	dist := p.Distance(&point)
	fmt.Println("点到平面距离:", dist)
	
	// 射线与平面相交
	rayOrigin := vec3.T{0, 0, 1}
	rayDir := vec3.T{0, 0, -1}
	intersection, ok := p.IntersectRay(&rayOrigin, &rayDir)
	if ok {
		fmt.Println("交点:", intersection)
	}
}

性能优化技巧

  1. 重用内存:尽量复用已分配的向量/矩阵,减少内存分配
  2. 使用指针:方法通常接受指针参数,避免值拷贝
  3. 选择精度:库提供float32和float64版本,根据需求选择
  4. 批量操作:对大量数据使用SIMD优化
// 重用内存示例
var temp vec3.T
for i := 0; i < 1000; i++ {
	vec3.Add(&temp, &v1, &v2)
	// 使用temp...
}

与其他库对比

  1. gonum:更专注于科学计算,缺少3D图形专用功能
  2. glm:Go的GLM移植,但Go3D更轻量级
  3. mumax:专注于GPU加速计算

Go3D在游戏开发和实时图形处理场景中表现优异,提供了专门优化的2D/3D数学运算。

总结

Go3D是一个高效、专注的数学库,特别适合需要高性能2D/3D计算的Go应用。其清晰的API设计和优化的实现使其成为游戏引擎、CAD软件和计算机视觉应用的理想选择。

回到顶部