havok物理引擎快速入门指南翻译

时间:2022-09-09 00:00:40
花了2天时间完成了这个翻译, 需要有C++基础, 是通过haovk引擎做物理动画的基础.
到intel官方网站注册一个帐号可以免费获取havok SDK, 这是SDK中的一个文档的翻译.

[翻译]Havok_Physics_Animation_2011-3-0_Pc_Xs_Quickstart_Guide.pdf



havok

目录

1.havcok PC 指南

        1.1        简介

        1.2        评估清单

                1.2.1        havok 常规

                1.2.2        havok 物理

                1.2.3        havok 动画

        1.3        开始 havok

                1.3.1        从havok物理和动画的PC二进制版本开始

                1.3.2        简单应用

                1.3.3        组建一个Demo(演示)

                1.3.4        Demo命令行参数

                1.3.5        Demo控制

        1.4        手把手演示

        1.5        组建 havok

                1.5.1        havok 库

                1.5.2        havok 库链接顺序

                1.5.3        havok 头文件包含规范

                1.5.4        链接 havok

                1.5.5        调试 havok 库

                1.5.6        文件命名约定

        1.6        设置 Visual Debugger (可视化调试器)

                1.6.1        Windows/Linux VDB 安装

                1.6.2        Windows VDB 注意事项



1.1        简介


欢迎阅读havok PC 指南. 这个文档包括了在PC上使用Havok的的信息.

他解释所有关于Havok Demos的配置和运行需要的东西, 也包括所有PC上的特色。 以及怎么优化的使用Havok SDK.


1.2        评估清单

这个清单的意义在于收集当第一次尝试评估和整合havok运行时产品时要做的事情, 高级的产品特色和控制台/平台具体的讨论在相关的演示和文档中. 所有的项目被列出并且被推荐去尝试,除非另有说明, 另外,尽可能按顺序尝试每一个项目,因为后来的项目一般建立在早期的项目之上.

step by step demos, 是一系列最小化的基于控制台的演示,每一个设计演示一个具体的特色.Demo的详细内容能够在下面的 Step by Step Demo章节找到.


1.2.1        Havok 常规

所有的 Havok 产品依赖于最根本的常规库的基础设施. 一个最重要的好处是他提供一个高性能的平台不依赖于机器抽象.  更多的常规库的具体特色包括反射,序列化,线程,容器,内存管理,和数学支持。

        浏览和编译 Demo/StandAloneDemos/StepByStep 中的 MemoryUtilInit Step by Step 演示.

       

        通过你的内存系统查看Havok的内存的分配和释放。 看看Havok 基础库和自定内存的 SDK 文档

       

        实现你自己的错误处理机制. 这里一个小的努力的投入将为将来节省很多时间。可查看 SDK 文档关于 创建一个自定义错误处理。

       

        浏览和编译 Serialize Step By Step demo

        写一个 demo 使用 serialize 去储存和载入一个对象。


1.2.2        Havok 物理

        组建和运行 Havok 物理演示 和 控制台例子。

       

        浏览并编译 Physics 和 PhysicsVdb Step by Step demos

        在游戏运行时创建一个简单( 比如 盒子形状 ) 固定的/静态的 刚体

        连接Havok Visual Debugger  ( VDB ) 去观察这个简单的固定的对象

        在游戏中创建一些简单的动态刚体, 他们和简单的固定的对象以及他们自己之间相互碰撞.

       

        添加 VDB 用户摄像头到游戏中.( 这看起来很琐碎的工作, 但是他会为你的将来节省很多时间.). 查看SDK 文档的 Visual Debugger Game Side, Debug Display 和 HK_UPDATE_CAMERA.

在游戏渲染器中同步动态的对象. 使用游戏和VDB确认他们的一致性. 在VDB可视窗口中实验,查看形状, 接触点, 模拟岛, broadphase AABBs, 惯性张量, 统计 等等.

创建更多复杂的固定的物理几何形状, 如 多边形汤或者高度图.

可选的

        安装 Havok Content Tools ( HCT ) 用于建模


1.2.3        havok 动画

        查看上面 " Havok 常规" 中的所有内容

       

        使用 HCT 去创建骨骼, 动画 和 皮肤 ( 可选的 ). 浏览 Havok Preview Tool 中的所有元素.

        从 HCT 中序列化 Havok Animation 数据 到游戏中运行.

        使用 VDB 可视化 骨骼造型 ( 不必担心 蒙皮和游戏渲染 )

        通过转换最终的角色造型到游戏蒙皮.


1.3        开始 Havok

1.3.1        从 Havok Physics 和 Havok Animation PC 二进制版 开始.

如果你已经成功安装这个版本,你将看到一下的目录结构

        hkXXX

               

                - Build

                - Demos

                - Docs

                - Lib

                - Source

                - Tools

这个XXX是指定的版本号( 如. 2010_1_0_r1  表示 2010.1.0发布的的后选1号版本 ). 另外你能看到组建编号,当你运行demos或者在 任何头文件的底部.

1.3.1.1        运行Demos

在 Demo/Demos 文件夹中你能找到主要的可执行的demo. 这个可执行的demo包括500多个demo, 我们使用这些demo演示和测试Havok. 如果你运行他,你将看到一个菜单画面, 你能在Demo control中找到控制和导航菜单.

Demos 分类为 API demos, 特色 demos 和 示例 demos. API demos 说明 怎么使用 API. 他们通常非常简单和易用的.他们的代码被设计为可以复制和粘贴到你的应用程序中. 特色Demo 被设计成展示特定的功能. ( 比如 vehicle SDK 或者 character contrller ). 最后,示例 demo 汇集多方面的特色,以显示在更复杂的场景中使用 Havok. 我们建议你花时间运行每一个demos 以查看Havok Physics 和 Havok Animation 提供的广泛的特色集合.

注意:

得到完全视觉和听觉的高品质的示例demo,保证你已经安装了 Microsoft DirectX 2010.7 或者 更高


1.3.2        简单应用

Havok demo 框架包括以系列的有用的demo,以演示SDK的各个部分( 可在以下的how to builde demos 中查看相关的信息 ). 这些demos 是被设计来参考的,当你读通这个文档的时候,但是,你可能会喜欢创建一个和Havok demo 框架无关的简单的主要的应用程序.

在Havok 版本中( 在Demo/StandAloneDemos 文件夹中 )包含的样本展示了配置和和运行Havok的最小量的代码.

为了组建这些:

        确定你的 Havok keycode(s) 是在 Source/Common/Base/KeyCode.h.

        选择一个你希望组建和运行的项目或者这平台的makefile和编译器.

        组建和运行 demo - 为指定的平台配置,看下面

更多关于怎么链接和组建你自己的项目,请查看 Havok 库链接顺序和 Havok 头文件包含规范 章节.


1.3.2.1        简单控制台应用程序

这个应用程序创建了一个场景,包括一个在一个盒子上下落的圆球,并且这个场景模拟5分钟.这个简单的应用程序也做了设置 Havok Visual Debugger的最小的初始化工作.

当你运行这个简单的控制台程序的时候, 他将初始化适当的平台,然后开始关于一个球掉落在一个盒子上的的模拟,然后停下.球下落的每一秒中的位置都显示在屏幕上.

         havok物理引擎快速入门指南翻译              

 图 1.1: 显示一个简单的控制台应用程序


1.3.2.2        链接 Visual Debugger

尽管这个应用程序没有图像输出 他已经初始化和打开了一个通道和Havok Visual Debugger 通信. 这个visual debugger 在用户手册里面有详细的描述. 但基本上他能使模拟成为一个能跨越网络的流. 连接到一个客户端程序也能显示和模拟. 这个visual debugger 客户端在 Tools\VisualDebugger\hkVisualDebugger.exe ,并且他有全部的说明怎么设置Visual debugger 到你自己的的应用程序中, 这个说明在能够在下面的 Platform Specific 章节找到.

在这个应用程序中. 一个 visual debugger 服务器 被创建并且他能够使用 hkVisualDebugger.exe来连接.( 运行他然后单击 Network > Connect... > OK ) , 用来连接的IP地址如下:


windows        使用运行这个程序的机器的IP. 客户端能够运行在其他任何的网络上的电脑.包括

和linux           运行这个程序的PC.

                        表格 1.1: Visual Debugger IP 地址


注意: 当你连接初始化 它时,他需要占用30秒来显示可视化画面.如果服务器端的网络接口已经初始化,请查看他.

        运行visual debugger 可用的 应用程序

        打开一个控制台,输入 ping <IP地址> 使用像上面说的相同的IP地址

        你将看到一个目标机器的回复.

       

havok物理引擎快速入门指南翻译

        图 1.2: SimpleConsoleApp在Visual Debuugger上的显示


1.3.3        组建Demos

注意在Havok demos 能够编译和运行之前,他们必须被配置为匹配你安装的Havok的产品. 更多的信息请在文档目录中的参考 Havok Setup Guide.pdf 文档.

在你已经完成配置之后,检查你想要使用的编译器和你的havok版本库的所使用的编译器相同,这个信息能够在Docs/PackageDetails 目录中找到.他包含一个文本文件,为每一个Havok SDK 包描述的的编译器,编译器版本等等.使用他去组建


1.3.3.1 从Win32组建

        使用Microsaft Visual Studio 打开你的版本的Demo/Demos子文件夹中的 Demo 项目.

        确定你的 Havok keycode(s) 在 Source/Common/Base/KeyCode.h.

        选择 Win32 - Release Multithreaded Dll 作为激活的配置

        组建和运行

可执行的Demos_win32-net_9-0_debug_multithrea_dll.exe将在 Demo/Demos中创建.

(这个例子中的 "net_9-0" 对应 Visual Studio 2008 ) .

DirectX

如果你只组建 Demos 项目. 那么你不需要安装 Microsoft DirectX SDK ( 你能够安全的跳过这节 ). 如果你需要重建整个Havok 版本.你需要安装 DirectX SDK( 为了组建 hkgGraphics 库)

默认情况下爱. Havok demos 使用 Microsoft的 DirectX来渲染, 在某些示例demo中也使用了DirectX声音.(比如 布料拉扯和爆炸试验).

如果你硬件安装了 DirectX SDK, 你也应该按照如下内容修改的IDE选项. 入股你没有DirectX SDK, 下载并且安装最新的版本( version 11.0 ), 当SDK已经安装你需要修改你的IDE选项.比如,

在 Visual Studio ( 2005 和更高 ) 到 Tools > Options ..> Projects and Solutions > VC++ Directories > Show Directories 这里你需要增加一个路径为你安装 DirectX的的路径. 比如 Include 文件/ " C:\DXSDK\include” 和 Library 文件 "C:\DXSDK\lib”( 默认的DirectX安装路径 )

下面的一些在Windows Vista下 Visual Studio 2008相关的选项

           havok物理引擎快速入门指南翻译

     图 1.3: 设置DirectX的库选项

 

havok物理引擎快速入门指南翻译

                图 1.4 设置 DirectX 的包含选项.

注意:

另外,你能够在 OpenGl中运行demo ,需要传递 "-ogl"作为命令行参数给 demo. 在这个情况下.你能也能剥离 DirectX 依赖,从 Demo的源代码中, 从而不需要安装DirectX. 我们强烈推荐使用DirectX,因为他是最简单的.

1.3.4 Demo 命令行参数

命令行参数能够使用标准的命令行方式或者使用 hkdemo.cfg 文件(如下)被传递到 Havok Demo 框架. 使用 "-?" 在命令行后面能显示命令行参数的全部列表, 一部分最有用的选项如下:



1.3.4.1        使用hkdemo.cfg文件

hkdemo.cfg多用于不便于使用命令行参数的平台或这从一个控制台上的CD运行.hkdemo.cfg文件必须在demos可执行程序的同一文件夹下.文件的格式非常简单,本质上是一个命令行参数的副本,如

; --- hkdemo.cfg ---

; this is a comment

; run the visual debugger server and the pyramid demo

-d -g Pyramid

; run in full screen mode and lock to sixty FPS

-f -l60


1.3.4.2 Win32 渲染器选项

"-r" 参数指定使用哪个渲染器, 对于控制台只能用"-r none", 他禁用渲染器. 但是在Win32 你可以选择下面任何的 DirectX 种类: "d3d8", "d3d9", "d3d9s", 或者 "ogl" 用于 OpenGL模式. 默认情况下 Win32用户使用shader version of DirectX 9 版本. "d3d9s" 是 shader-only version of the DirectX 9 版本.

1.3.5        Demo 控制

控制demo,我们使用抽象用户界面类. 这个类返回关于虚拟鼠标,方向键,摇杆和一系列的数字键.

控制台控制器没有实现拾取.

以下的表格显示了各个平台指定的的控制如何映射到我们的虚拟用户输入设备的.

当你玩demos时按下Pause控制键,你就能看到一个对应你的平台的控制键的选项的菜单.当按下暂定后,显示的信息,允许你选择这些选项.,再按暂停键,将返回demo

如果你不确定你的平台上的哪个控制(键)对应显示在屏幕菜单中的哪个控制图标. 你可以从demo的主菜单选择 common - gamepad .将显示控制图标. 使用正确的的控制,对应的图标将会高亮显示


havok物理引擎快速入门指南翻译


1.4 Step By Step Demos

有些时候去查看需要哪些"支持"的代码才能让Havok在应用程序中工作可能会比较困难.为了尝试和演示基础的Havok整合具体需要什么,demos套件现在包含了"Step By Step” demos. 这些demos被设计的尽可能的简单的显示一步一步的添加指定的特色到你的应用程序需要做什么.这些demos都是控制台demos(他们没有图形组件) ,所有的需要的代码在一个简单文件main.cpp里面,入口是'main'函数

Step By Step Demos 能在目录  Demo/StandAloneDemos/StepByStep中找到.每个demo有他自己的文件夹,包括一个项目文件或者makefile对应支持的平台.main.cpp包含demo代码. 这些demo像主Havok Demos程序同样的编译方法

“MemoryUtilInit" Demo 有一个解释,就是去整合Havok到你的应用程序需要什么的基本结构.

#include <Common/Base/hkBase.h>

#include <Common/Base/Memory/System/Util/hkMemoryInitUtil.h>

#include <Common/Base/Memory/Allocator/Malloc/hkMallocAllocator.h>

#include <Common/Base/Fwd/hkcstdio.h>

hkBase.h 包含 用于访问基础的Havok 常规库特色.hkMemoryInitUtil提供了一个方法.这个方法使我们更容易设置内存分配. hkMallocAllocator是hkMallocAllocator接口的一个实现,使用平台标准的内存分配.一般是C标准库malloc. 因为Havoks 内存分配实现对Havok的性能有极大的优化 - 还需要分配他们自己的内存池.

最后 cstdio的包含在havok中不在需要.对于需要调用C标准库函数如 printf的demo.

static void HK_CALL errorReport(const char* msg, void* userContext)

{

using namespace std;

printf("%s", msg);

}

当Havok由 hkBaseSystem::init启动时,他需要一个函数用来报告任何的错误.这里因为例子只是一个控制台应用程序, 任何的错误能通过printf显示在终端,根据不同的程序和平台,有时候更适合吧错误写到log文件中.

int HK_CALL main(int argc, const char** argv)

{

// Perfrom platform specific initialization for this demo - you should already have something similar in your own code.

PlatformInit();

hkMallocAllocator baseMalloc;

hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault(&baseMalloc,hkMemorySystem::FrameInfo(0) );

hkBaseSystem::init( memoryRouter, errorReport );

{

HK_WARN_ALWAYS(0x417ffd72, "Hello world!");

}

hkBaseSystem::quit();

hkMemoryInitUtil::quit();

return 0;

}

这是应用程序的主入口. 使用hkMemoryInitUtil通常你需要一个分配器,这个分配器提供低级的内存分配.hkMemoryInitUtil::initDefault 将包装这个分配器到其他有良好性能和其他特色的分配器中.在这个例子中一个,hkMallocAlloctor的实例将用于底层的分配器.

一旦内存系统被配置. 整个havok就能被启动. hkBaseSystem::init用来启动.使用前面创建的 memoryRouter. 还有前面说的errorReport 函数

#include <Common/Base/keycode.cxx>

包含的keycode.cxx 文件公开了你的购买havok产品许可正的关键信息. 这些是用做内部检查许可证的有效性,如果产品许可证无效,那么产品将不会运行.

// We’re not using anything product specific yet. We undef these so we don’t get the usual

// product initialization for the products.

#undef HK_FEATURE_PRODUCT_AI

#undef HK_FEATURE_PRODUCT_ANIMATION

#undef HK_FEATURE_PRODUCT_CLOTH

#undef HK_FEATURE_PRODUCT_DESTRUCTION

#undef HK_FEATURE_PRODUCT_BEHAVIOR

#undef HK_FEATURE_PRODUCT_PHYSICS

// Also we’re not using any serialization/versioning so we don’t need any of these.

#define HK_EXCLUDE_FEATURE_SerializeDeprecatedPre700

#define HK_EXCLUDE_FEATURE_RegisterVersionPatches

#define HK_EXCLUDE_FEATURE_RegisterReflectedClasses

#define HK_EXCLUDE_FEATURE_MemoryTracker

// This include generates an initialization function based on the products

// and the excluded features.

#include <Common/Base/Config/hkProductFeatures.cxx>

这个部分 关掉了程序中我们不会用到的产品.

用不定义相关的 HK_FEATURE_PRODUCT宏.

接下来的指定特色被排除,

使用相关的 HK_EXCLUDE_FEATURE 宏.最后包含 hkProductFreatures.cxx来使用上面定义/和不定义的的符号的顺序来编译适合的库.


1.5 组建 Havok

1.5.1 havok 库

当你组建你的应用并不需要所有的havok 库. 这些表格显示在版本中的每一个库的详细的依赖和需求.

1.5.2 Havok 库链接顺序

一个包含havok库的全部立标和他们的依赖在 Docs/SourceCodeLevels.txt.

1.5.3 Havok Header 包含规范

任何的库,他有一些头文件需要被包含在每一个文件中. 按照惯例, 这个文件命名来和库名相同. 通常的规范是在包含库中的其他的任何文件之前包含这个库头文件.

// Include the hkbase header before any other hkbase includes.

#include <Common/Base/hkBase.h>

#include <Common/Base/System/Io/IStream/hkIstream.h>

// more hkbase headers

相似的:

// Include the hkpDynamics header before any other hkpDynamics includes.

#include <Physics/Dynamics/hkpDynamics.h>

#include <Physics/Dynamics/World/hkpWorld.h>

// more hkpDynamics headers

注意,很多库的的头文件包含了其他的库的文件,比如hkpDyamics.h 包含了 hkBase.h.

所以,例如 如果一个文件已经被包含在上面的块中,那么只要简化的写为

#include <Physics/Dynamics/hkpDynamics.h> // hkBase.h included

#include <Common/Base/System/Io/IStream/hkIstream.h>

#include <Physics/Dynamics/World/hkpWorld.h>


1.5.4 链接 Havok

Havok SDK 有4个组建配置: Release, Debug, FullDebug 和 Hybrid. 这些库能够在 Havok SDK 文件夹 /lib/Platform/Configuration 下找到

        Release

        Release 组建配置是一个完全优化的havok组建. 他没有包含调试断言. 因为没有断言. Havok可能会崩溃,如果使用不当. 这里没有错误检查. 因为这个原因.推荐所有开发情况下使用Havok 的 Debug 或者 FullDebug配置. 包含在Release的符号组建在于性能开销无关的平台上.

        Debug

        Debug组建配置是一个完全优化的havok组建. 他包含了调试断言和符号. Havok的断言将捕捉会导致崩溃的错误. 断言提供给用户出问题的文件和行号.还提供一个简要的说明出了什么问题. 然后程序停止执行.这运行用户看到所有的调用栈.作为一个编译器已经完全优化的代码.单步步进Havok 代码容易出错.推荐哪些每天工作在和系统相关的的Hvaok 产品的开发者使用Havok Debug 库来连接.对于开发者而言,任何错误的出现都能够通过断言明确的捕捉到. 比如在Release库中一个错误可能导致随后的一连串的崩溃.这将很难诊断.

        FullDebug

        FullDebug 配置没有优化. 包括 断言和 调试符号. 如果用户想要调试到Havok 代码内部.这个组建配置是非常有用的. 推荐那些直接使用 Havok SDK接口来写代码的开发者使用FullDebug 库.

        Hybird

Hybird 组建是 FullDebug 链接针对 Release C runtime 库的.这个主要的用于 调试写来建模的havok 插件( 比如 :Autodesk 3DSMax,Softimage(XSI) or Maya ),作为建模者使用的release C runtime library.

在一些平台,编译器会硬编码Havok的源文件的路径到Havok库中, 在这些平台上. 当程序执行停在Havok code 内部时,可能不能定位当前的调用栈到对应的源码, 一些调试器允许用户手动的定位磁盘上对应的代码.有些则不行. 所以, 在本地重新组建 Havok 库,在吧新版的组建的库放到你的源码控制系中是十分有优势的.这可以保证源码文件的路径是正确的. 当程序停在havok 库内部时,调试器能够正确的打开对应的文件. 注意: 一些 Havok 内部库不能重建.

Debug 和 FullDebug 库将显示 调试进信息 / 日志 / 警告 到 TTY. 也可能需要外部依赖平台指定的调试库. Release 库将不依赖任何的调试库.

在PC, 也有 Release, Debug 和 FullDebug 的DLL库. 这些库被设计成连接到任何依赖的DLL版本.


1.5.4.1

在Havok SDK 的存储数据中的被用在运行时模拟的许多类. 比如物理对象, 角色动画. 等等.

hkSerialize 包含了存储这个数据和载入的功能.

Havok 的序列化类必须要注册到 serialization 设施 才能使用. 做到这些,需要添加以下代码. 将检查在 Keycode.h 中的关键代码去诊断哪个Havok 产品被使用以及注册相应的Havok 类.

// Register Havok classes.

#include <Common/Base/KeyCode.h>

#define HK_CLASSES_FILE <Common/Serialize/Classlist/hkKeyCodeClasses.h>

#include <Common/Serialize/Util/hkBuiltinTypeRegistry.cxx>

这个代码片段是默认配置Havok 序列化并运行的方法. 他也可以增加用户自己创建的类只注册一部Havok 类. 更多的信息,可以参考Havok 通用手册Type Registation章节

1.5.5        调试 Havok 库

根据你的许可证, Havok 提供了很多必须的源码去调试库.

但是,调试的时候. Microsoft Visual Studio可能会提示你定位原始的源来代替自动打开相关的源.这是因为发布给客户的用户编译的Havok 库的源文件的二进制是不一致的. 日期,组建时间和法律样本被添加到版本源中.虽然行号是匹配的. 为了避免这个,需要导航到Microsoft Visual Studio每个源文件, 到 Tool > Options... >Debugging > General 去掉 "Require source files to exactly match the original version" 前面的勾.

havok物理引擎快速入门指南翻译

1.5.6 文件命名约定

havoke 的使用扩展到

.h: C++ 声明

.inl: 被列入 .h 文件的 C++ 内联函数和方法定义

.cpp C++ 定义

.cxx 被列入.cpp文件的源文件. 比如超级宏文件(hkBuiltinTypeRegistry.cxx),和在编译时选择的实现(hkStackTracerWin32.cxx).

1.6 配置 Visual Debugger( VDB)

1.6.1 Windows / Linux VDB 安装

你的游戏的IP地址是visual debugger 游戏运行在的机器的IP. 这可以运行你的游戏和visual debugger 程序在相同的机器, 虽然这是不推荐的,至少你要有个多核的机器. 使用"localhost"或者"127.0.0.1" 做为IP地址连接到你的游戏运行的机器.如果你想要连接到远程PC,过程是一样的,你会使用机器的名字或者IP.以windows为例,你能在命令行的提示符后输入"ipconfig /all"命名来获取这个信息.

1.6.2 Windows VDB 注意事项

这个平台目前还没有问题.




我自己的看法:

上古5目前要实现良好的动作效果. havok是一个可行的的突破口.比如hkx文件到底给havok物理引擎传递了什么数据.hkx文件是否能够被二次开发等等.这些都需要先熟悉havok物理引擎.