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)
}
}
性能优化技巧
- 重用内存:尽量复用已分配的向量/矩阵,减少内存分配
- 使用指针:方法通常接受指针参数,避免值拷贝
- 选择精度:库提供float32和float64版本,根据需求选择
- 批量操作:对大量数据使用SIMD优化
// 重用内存示例
var temp vec3.T
for i := 0; i < 1000; i++ {
vec3.Add(&temp, &v1, &v2)
// 使用temp...
}
与其他库对比
- gonum:更专注于科学计算,缺少3D图形专用功能
- glm:Go的GLM移植,但Go3D更轻量级
- mumax:专注于GPU加速计算
Go3D在游戏开发和实时图形处理场景中表现优异,提供了专门优化的2D/3D数学运算。
总结
Go3D是一个高效、专注的数学库,特别适合需要高性能2D/3D计算的Go应用。其清晰的API设计和优化的实现使其成为游戏引擎、CAD软件和计算机视觉应用的理想选择。