golang跨平台3D引擎开发插件库Harfang3D的使用
Golang跨平台3D引擎开发插件库Harfang3D的使用
HARFANG®3D 是一个全功能的3D可视化库,支持C++、Python、Lua和Go语言。它基于开源的bgfx库,支持Vulkan、Metal、DirectX(9到12)、OpenGL和OpenGL ES,可在Windows、Linux、Intel和ARM平台上构建。
主要特性
- 跨平台支持:Win32/Win64 Intel、Linux 64 Intel、Aarch 64 ARM
- 场景API:基于节点和组件的系统,性能优化
- 渲染管线:支持低规格PBR渲染管线和高规格"AAA"渲染管线
- VR支持:通过OpenXR和OpenVR/SteamVR
- 物理API:刚体、碰撞、机械约束、射线投射
- 音频API:支持WAV/OGG格式播放和3D音频空间化
Go语言支持
Harfang3D提供了Go语言绑定(实验性支持,需要Go 1+版本)。
安装Harfang3D Go模块
- 首先需要从官网下载Harfang3D SDK
- 构建SDK时需要启用Go模块支持:
cmake ../.. -G "Visual Studio 16 2019" -A x64 \
-DCMAKE_INSTALL_PREFIX:PATH="D:/harfang/build/install" \
-DHG_BUILD_HG_GO=ON
Go语言示例代码
下面是一个使用Harfang3D Go绑定的简单示例,创建一个3D窗口并显示一个立方体:
package main
import (
hg "github.com/harfang3d/harfang-go/v3"
)
func main() {
// 初始化Harfang3D
hg.InputInit()
hg.WindowSystemInit()
// 创建窗口
res_x, res_y := 1280, 720
win := hg.RenderInit("Harfang - Go Example", res_x, res_y, hg.RFVSync|hg.RFMSAA4X)
// 创建渲染管道
pipeline := hg.CreateForwardPipeline()
res := hg.NewPipelineResources()
// 创建场景
scene := hg.NewScene()
scene.GetEnvironment().SetBackgroundColor(hg.NewColor(0.1, 0.1, 0.1))
// 创建相机
cam := hg.CreateCamera(scene, hg.Mat4LookAt(hg.NewVec3(0, 2, -10), hg.NewVec3(0, 1, 0))
camera := scene.GetNode(cam)
camera.GetCamera().SetZNear(0.01)
camera.GetCamera().SetZFar(1000)
camera.GetCamera().SetFov(45)
// 创建立方体
cube := hg.CreateCube(scene, hg.Mat4Identity(), 1, 1, 1)
cube_node := scene.GetNode(cube)
cube_node.GetTransform().SetPos(hg.NewVec3(0, 1, 0))
// 创建光源
light := hg.CreateLinearLight(scene, hg.Mat4Identity(), hg.LightModelLinear)
light_node := scene.GetNode(light)
light_node.GetTransform().SetRot(hg.NewVec3(hg.Deg(45), hg.Deg(45), 0))
// 主循环
for hg.IsWindowOpen(win) {
hg.SetViewClear(0, hg.CFColor|hg.CFDepth, hg.NewColor(0.1, 0.1, 0.1), 1, 0)
hg.SceneUpdateSystems(scene, hg.GetClock())
view_id := uint16(0)
hg.SubmitSceneToPipeline(view_id, scene, hg.NewIntRect(0, 0, res_x, res_y), true, pipeline, res)
hg.Frame()
hg.UpdateWindow(win)
}
// 清理
hg.RenderShutdown()
hg.DestroyWindow(win)
}
另一个示例:加载3D模型
package main
import (
hg "github.com/harfang3d/harfang-go/v3"
)
func main() {
// 初始化
hg.InputInit()
hg.WindowSystemInit()
// 创建窗口
res_x, res_y := 1280, 720
win := hg.RenderInit("Harfang - Load Model Example", res_x, res_y, hg.RFVSync)
// 添加资源路径
hg.AddAssetsFolder("resources")
// 创建渲染管道
pipeline := hg.CreateForwardPipeline()
res := hg.NewPipelineResources()
// 创建场景
scene := hg.NewScene()
// 加载模型
model_ref := hg.LoadModelFromAssets("model/scene.gltf", hg.GetForwardPipelineInfo(), res)
hg.CreateModelFromAssets(scene, model_ref, res, hg.Mat4Identity())
// 创建相机
cam := hg.CreateCamera(scene, hg.Mat4LookAt(hg.NewVec3(0, 5, -10), hg.NewVec3(0, 1, 0))
camera := scene.GetNode(cam)
camera.GetCamera().SetZNear(0.1)
camera.GetCamera().SetZFar(1000)
camera.GetCamera().SetFov(45)
// 创建光源
light := hg.CreatePointLight(scene, hg.Mat4Translation(hg.NewVec3(0, 5, 0)), 10, hg.NewColor(1, 1, 1))
// 主循环
for hg.IsWindowOpen(win) {
hg.SetViewClear(0, hg.CFColor|hg.CFDepth, hg.NewColor(0.1, 0.1, 0.1), 1, 0)
hg.SceneUpdateSystems(scene, hg.GetClock())
view_id := uint16(0)
hg.SubmitSceneToPipeline(view_id, scene, hg.NewIntRect(0, 0, res_x, res_y), true, pipeline, res)
hg.Frame()
hg.UpdateWindow(win)
}
// 清理
hg.RenderShutdown()
hg.DestroyWindow(win)
}
注意事项
- Go绑定目前处于实验性阶段,API可能会发生变化
- 需要先构建Harfang3D SDK并启用Go模块支持
- 确保将编译生成的hg_go模块添加到Go模块路径中
Harfang3D为Go开发者提供了一个强大的3D开发框架,可以用于游戏开发、可视化应用等领域。虽然Go绑定目前是实验性的,但它已经提供了足够的功能来创建复杂的3D应用程序。
更多关于golang跨平台3D引擎开发插件库Harfang3D的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang跨平台3D引擎开发插件库Harfang3D的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Harfang3D - 跨平台3D引擎插件库使用指南
Harfang3D是一个轻量级的跨平台3D引擎,支持Windows、Linux、macOS、Android和iOS平台。它提供了完整的3D渲染、物理模拟、音频处理和VR支持等功能。下面我将介绍如何在Go语言中使用Harfang3D。
安装Harfang3D
Harfang3D主要通过C++实现,但提供了Go绑定。首先需要安装Harfang3D的核心库:
- 从官网(https://www.harfang3d.com)下载预编译库
- 或者从源代码编译
对于Go绑定,可以使用cgo来调用Harfang3D的C接口。
基本使用示例
下面是一个简单的Go程序,展示如何初始化Harfang3D并创建一个窗口:
package main
/*
#cgo CFLAGS: -I/path/to/harfang/include
#cgo LDFLAGS: -L/path/to/harfang/lib -lharfang
#include <hg.h>
*/
import "C"
import "unsafe"
func main() {
// 初始化Harfang3D
C.hg_AddAssetsFolder(C.CString("assets"))
// 创建窗口
win := C.hg_NewWindow(C.CString("Harfang3D Go Example"), 1024, 768, 32, C.hg_Window_Normal)
// 创建渲染器
renderer := C.hg_NewRenderer()
C.hg_ResetRenderer(renderer, win)
// 主循环
for C.hg_IsWindowOpen(win) == 1 {
// 处理窗口事件
C.hg_UpdateWindow(win)
// 清除屏幕
C.hg_SetViewClear(0, C.hg_CF_Color|C.hg_CF_Depth, 0x303050ff, 1.0, 0)
// 开始帧
C.hg_SceneReset(0, 1.0/60.0, C.hg_TimeSource_Engine)
// 结束帧并交换缓冲区
C.hg_Frame()
C.hg_Flip(win)
}
// 清理资源
C.hg_DestroyRenderer(renderer)
C.hg_DestroyWindow(win)
}
3D场景创建
下面是一个更完整的例子,展示如何创建一个3D场景:
package main
/*
#cgo CFLAGS: -I/path/to/harfang/include
#cgo LDFLAGS: -L/path/to/harfang/lib -lharfang
#include <hg.h>
*/
import "C"
import "unsafe"
func main() {
// 初始化
C.hg_AddAssetsFolder(C.CString("assets"))
win := C.hg_NewWindow(C.CString("3D Scene"), 1024, 768, 32, C.hg_Window_Normal)
renderer := C.hg_NewRenderer()
C.hg_ResetRenderer(renderer, win)
// 创建场景
scene := C.hg_NewScene()
// 创建相机
camera := C.hg_NewNodeWithName(scene, C.CString("camera"), C.hg_Matrix4Identity())
C.hg_SetupPerspectiveCamera(scene, camera, 0.1, 1000.0, C.hg_Deg(45.0))
C.hg_SetNodePosition(scene, camera, C.hg_Vec3(0, 1, -5))
// 创建光源
light := C.hg_NewNodeWithName(scene, C.CString("light"), C.hg_Matrix4Identity())
C.hg_SetNodePosition(scene, light, C.hg_Vec3(0, 2, 0))
C.hg_SetNodeRotation(scene, light, C.hg_Vec3(C.hg_Deg(45.0), C.hg_Deg(45.0), 0))
C.hg_SetLight(scene, light, C.hg_LightModel_Linear, 100.0, C.hg_Color(1, 1, 1, 1))
// 创建3D模型
model := C.hg_NewNodeWithName(scene, C.CString("model"), C.hg_Matrix4Identity())
C.hg_LoadModelFromAssets(scene, model, C.CString("model.geo"), C.CString("material.mat"))
// 主循环
for C.hg_IsWindowOpen(win) == 1 {
C.hg_UpdateWindow(win)
// 旋转模型
rot := C.hg_GetNodeRotation(scene, model)
rot.y += C.hg_TimeFromSec(1.0/60.0)
C.hg_SetNodeRotation(scene, model, rot)
// 渲染场景
C.hg_SetViewClear(0, C.hg_CF_Color|C.hg_CF_Depth, 0x303050ff, 1.0, 0)
C.hg_SubmitSceneToPipeline(0, scene, C.hg_IntRect(0, 0, 1024, 768), camera, nil)
C.hg_Frame()
C.hg_Flip(win)
}
// 清理
C.hg_DestroyScene(scene)
C.hg_DestroyRenderer(renderer)
C.hg_DestroyWindow(win)
}
物理系统集成
Harfang3D集成了Bullet物理引擎,下面是如何使用物理系统的示例:
// 初始化物理系统
physics := C.hg_NewPhysicsSystem()
C.hg_InitPhysicsSystem(physics)
// 为场景节点添加刚体
ground := C.hg_NewNodeWithName(scene, C.CString("ground"), C.hg_Matrix4Identity())
C.hg_CreatePlane(physics, ground, C.hg_Vec3(0, 1, 0), 0) // 静态地面
// 创建动态刚体
box := C.hg_NewNodeWithName(scene, C.CString("box"), C.hg_Matrix4Identity())
C.hg_SetNodePosition(scene, box, C.hg_Vec3(0, 5, 0))
C.hg_CreateBox(physics, box, C.hg_Vec3(1, 1, 1), 1.0) // 1x1x1的盒子,质量1kg
// 在主循环中更新物理
C.hg_StepPhysicsSystem(physics, C.hg_TimeFromSec(1.0/60.0))
VR支持
Harfang3D支持OpenVR,下面是如何初始化VR系统的示例:
// 初始化VR
vr := C.hg_NewVRSystem()
if C.hg_InitVRSystem(vr) == 1 {
// 创建VR渲染器
vrRenderer := C.hg_NewVRRenderer()
C.hg_ResetVRRenderer(vrRenderer, vr, renderer)
// VR主循环
for C.hg_IsWindowOpen(win) == 1 {
// 更新VR状态
C.hg_UpdateVRSystem(vr)
// 渲染VR场景
C.hg_SubmitSceneToVRPipeline(0, scene, vr, camera, nil)
// 渲染VR镜面
C.hg_RenderVREyesToDisplay(vrRenderer)
}
C.hg_DestroyVRRenderer(vrRenderer)
}
C.hg_DestroyVRSystem(vr)
注意事项
- Harfang3D的Go绑定需要通过cgo调用C接口,因此需要正确配置C编译器和链接器
- 资源路径需要正确设置,特别是模型和材质文件
- 不同平台的编译配置可能不同,特别是Android和iOS
- 性能关键部分可能需要直接使用C代码
Harfang3D提供了丰富的功能,包括:
- 3D渲染管线
- 物理模拟
- 音频处理
- 脚本系统
- VR/AR支持
- 多平台部署
更多详细用法可以参考官方文档和示例代码。