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模块

  1. 首先需要从官网下载Harfang3D SDK
  2. 构建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)
}

注意事项

  1. Go绑定目前处于实验性阶段,API可能会发生变化
  2. 需要先构建Harfang3D SDK并启用Go模块支持
  3. 确保将编译生成的hg_go模块添加到Go模块路径中

Harfang3D为Go开发者提供了一个强大的3D开发框架,可以用于游戏开发、可视化应用等领域。虽然Go绑定目前是实验性的,但它已经提供了足够的功能来创建复杂的3D应用程序。


更多关于golang跨平台3D引擎开发插件库Harfang3D的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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的核心库:

  1. 从官网(https://www.harfang3d.com)下载预编译库
  2. 或者从源代码编译

对于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)

注意事项

  1. Harfang3D的Go绑定需要通过cgo调用C接口,因此需要正确配置C编译器和链接器
  2. 资源路径需要正确设置,特别是模型和材质文件
  3. 不同平台的编译配置可能不同,特别是Android和iOS
  4. 性能关键部分可能需要直接使用C代码

Harfang3D提供了丰富的功能,包括:

  • 3D渲染管线
  • 物理模拟
  • 音频处理
  • 脚本系统
  • VR/AR支持
  • 多平台部署

更多详细用法可以参考官方文档和示例代码。

回到顶部