PhysX入门教程(全)

一、安装

在国际上出名的物理引擎有Havok,Vortex,ODE,Novodex,Takamak等等其中ode是一个免费开源的物理引 擎,而Novodex就是PhysX的前身被Ageia收购之后改名为PhysX,是一个可以免费用于非商品用途的引擎。在这里选用PhysX来作为
入门教程,主要是因为它的帮助比较丰富而且开发包可以免费获得。

关于PhysX sdk的安装.首先要进入http://support.ageia.com下载SDK,网站http://support.ageia.com下載安裝 文件.請注重的是Ageia的SDK只对注册用户开放下载。注册是免费的,但似乎要经过审核才会开通,不过一般都会通过的。我注册的时候似乎是第二天才收 到开通邮件。有两个安装文件是必须下载的System Software.exe和PhysX 2.3.3 SDK Core.exe前一个是底层驱动后一个是程序内核最新的SDK是2.4.1但是只针对商业客户开放。对于初学者来说最好把PhysX
2.3.3 SDK Training Pragrams.exe也一起下载,里面包含了从初级到高级的一系列教程,对学习这个引擎很有帮助。把所有东西下载下来之后,接着是安装了安装很简 单一路next下去就可以了但是为了让VC中设置方便一点建设把PhysX 2.3.3 SDK Core.exe的安装路径改短一点例如我的就是安装在D:/PhysX中。

安装好了之后后开始对VC编译环境进行设置。

首先在Tools→Options→Directories→Inclund Fik中加入以下目录.

D:/PhysX/SDKS/Physics/include

D:/PhysX/SDKS/Founddation/include

D:/PhysX/SDKS/PhysXLoader/include

然后在…àLibrary Fiks中加入以下目录:

D:/PhysXdks/LIB/Win32

以 上用到的“D:/PhysX”指的是sdk安装目录以你机器中的安装路径为准本教程的示例程序用到了opengl和glut作为渲染引擎你的计算机 如何没有安装glut库那也请先到www.opengl.org上www.opengl.org下载一个安装上去。在这里就不打算深入讨论glut了, 没有基础的朋友可以先自学一下。

二.、PhysX概述

首先来介绍一下PhysX编程的几个术语以及它们之间的相互联系。

1. Scene场景:就像演员表演都需要一个舞台一样 PhysX的所有物理运动都在这个scene中进行。

2. Actor角色:在场景中所有参与运算的实体都是一个角色或许我这样表达不是很准确大家慢慢体会吧!

3. bosy刚体:用来记录物体之间世界交互的各种系数如速度阻尼等.

4. shape形状:描述和表达某一角色的形状PhysX中提供4种基本形状,盒子,球,胶囊以及平面。

从 上面图可以看到,PhysX编程其实很简朴首先定义各种不同的角色(actor)然后指定每个角色的形状(shape)属性和刚体(body)属 性,最后是把这些角色都加入到场景(scene)空间中去这样就可以构造出一个完整的物理世界。下面我将详细描述编程的步骤.

三.编程实现

1.创建scene

NxsceDesc sceneDesc:

SceneDesc.grauity = gDefaultGravity;//指定重力加速度(-9.81f)

SceneDesc.broadphase = NX_BROADPHASE_COHERENT;

SceneDesc.collisionDetection= true; //是否开启碰撞检测

Gscene =gPhysicsSDK→createScene(sceneDesc);

首先我们要创建一个场景的描述(Descriptor),PhysX SDK就利用这个场景描述结构来创建生成一个场景实例.

描述(Descriptor)在整个SDK编程过程中会被广泛地使用。描述其实就是一个数据结构主要是用来保存各种在创建实体时所需要的相关信息。你可以调整描述体中各种参数来达到不同的效果当然你可以不作任何修改这样的话实体在创建时会使用描述体的默认值。

在本例子中我们创建一个指定了重力加速以及碰撞检测算法的场景实例。PhysX SDK中提拱了三种碰撞检测算法提拱给大家选择.这里选用的是“broad phase-coheret collison detoction”。

2.给场景(scene)增加物理材质(Materials)

物理材质指的是某一详细物体的表面属性和碰撞属性这些属性可以确定一个物体和另一个物体发生碰撞时,是如何在该的物体上反弹滑动或者滚动的。

你可以给场景中的所有物体指定一个相同的默认物理材质。

//创建默认材质

Nxmaterial* defaultMaterial=gscene → getMaterialFromIndex(0);

Default Material→setRestitution(0.9);//还原系数为0的时候没有还原.

DefaultMaterial→setStaticFriction(0.5);//静摩擦系数.

DefaultMaterial→setDynamicFricfion(0.5);//动摩擦系数.

以上材质的系数最小值都是0最大值是1,假如要实现一个物体落在地上会自动弹跳那就得把还原系数设得大一点。

3.创建地面

在本程序例子中只有两个角色实体地面和盒子.我们首先来看如何创建地面.

NxPlane shapeDesc planeDesc;

NxActorDesc actorDesc;

actorDesc.shapes.pushBack(&phane Desc);

gscene→createActor(AcforDesc);

创建一个地面角色这可能是角色创建的最简朴的方法了只用到了四行代码首先分别创建一个平面形状描述和角色描述两个描述都不作任何修改也就是使用它们的默认值.平面的中央位于世界坐标原点(000)处,而法线则是指向y轴的正方向。

第二步把平面描述添加到角色描述中的形状列表中去,从这里我们也可以看到,一个角色是可以包含多个形状物体的。

第 三步就是把角色加到场景(scene)中去,也许你会注意到,前面我们所说的一个角色实体必须包括形状描述和刚体描述,两大部份,为什么这里只有形状描 述呢?其实,刚体描述也是存在的,当你没有为它指定的时候,角色创建时会自动生成一个默认的刚体描述。一个刚体的默认值是这样的:它不会移动但是会把与它 发生碰撞的物体反弹回去。因为它的质量是无限大的。

4、 创建盒子

前面介绍了如何创建一个地面,这是场景中最简朴的一个角色了下面我们将要创建一个稍为复杂一点的角色,一个盒子。

Int size=5

NxBodyDesc BodyDesc;

BodyDesc.angularDamping=0.5f;

BodyDesc.linearVelocity=NxUec3(0.0f0.0f0.0f)

NxBoxShapeDesc BoxDesc;

BoxDesc.dinesions=NxUec3(float(size)float(size)float(size));

NxActorDesc BoxActorDesc;

BoxActorDesc.shapes.pushBack(&BosDesc);

BosActorDsec.body= &BodyDesc;

BoxActorDesc.desity=0.10f;

BoxActorDesc.globalpose.t=NxVec3(0.0.20.0.0.0);

Gscene→createActor(BoxActorDesc)→userData=(viud*)size;

这 里我们创建了一个叫“Box”的场景角我。我们可以看到,盒子角色完整地包含了形状和刚体两大部份。和创建平面角色不同的是盒子角色描述中多了 “desity”“globalpose”两个分量分别指的是密度和初始位置SDK会根据密度和体积来自动计算角色的质量。

“globalpose”指的是在世界位标中的相对位置值得注重的是:

PhysX中与坐标尺寸相关的数值其单位都是“米”(m)。

5.绘制与运动

完成了以上的预备工作之后接下来便是检验成果的最后冲刺了.

Whik(nbActors--)

NxActor*actor=*actors++;

If(!actor->userData) continue;

glpushMatrix();

float glamat[16];

actor->getGlobalPose().getColumnMajor44(glmat);

glColor4f(1.0f1.0f1.0f1.0f);

glMultMatrix(glmat);

glutWireCube(float(int(actor→userData))*2.0f);

glPopMatrix();

上面是绘制场景的程序这里因为不需要绘制地面因此第一行跳过平面角色直接绘制盒子.

OK现在我们可以让程序运行起来了在窗口可以看见生成的一个立方体盒子.但是为什么那个盒子不会落下来,不会运动呢?这是因为我们还没有加入实时运算函数。在绘制盒子之前加入以下三行:

Gscene→fetchResults(NX_RIGID_BODY_FINFSHED);

gsceng→Simulate(1/60.0f);

gscene→flushstream();

这样盒子就会产生自由落体运动其中simulate(1/60.0)是一个积分函数用来求位移.这里用到了固定间隔时间1/60.0秒其实最好是使用一些系统时间函数来计算上一次刷屏到现在的时间,这样会让物体运动更加逼真。

四.总结

这 是一个PhysX物理引擎的Hello World入门程序为了让大家更清楚地看到程序总体框架我把程序的功能尽量写得简朴。在接下来的一段时间里我会写一些复杂的相关教程希望各位网友 友持。当然,我也是一边学一边写,难免会出现错差,假如你们发现我的文章有问题的话,请E-mail:[email protected] 告诉知我,也欢迎在这方面有共同爱好的朋友来信交流.

特殊感谢我身边一个朋友的支持!

五、源代码

// A minimal Novodex application test.

// 以下代码,先安装好PhysX SDK,及按要求配置好路径之后才能编译。

// 建义用使用VC2003以上版本,VC6.0在我这里有一个“return”错误,把“return”去掉就可以编译通过。

// 运行的时候假如提示缺少DLL文件,请在/bin/win32 目录中找到相应的DLL文件把它拷贝到工程文件夹中,

// 或者拷贝到系统systems32/ 文件夹中

// NxBoxes by Pierre Terdiman (01.01.04)

// author: [email protected]

#define NOMINMAX

#ifdef WIN32

#include

#include

#include

#elif LINUX

#include

#include

#elif __APPLE__

#include

#include

#elif __CELLOS_LV2__

#include

#endif

#include

// Physics code

#undef random

#include "NxPhysics.h"

//#include "ErrorStream.h"

#pragma comment( lib "PhysXLoader.lib" )

static bool gPause = false;

static NxPhysicsSDK* gPhysicsSDK = NULL;

static NxScene* gScene = NULL;

static NxVec3 gDefaultGravity(0.0f -9.81f 0.0f);

static float gRatio=1.0f;

static void InitNx()

{

// Initialize PhysicsSDK

gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION 0 NULL);

if(!gPhysicsSDK) return;

gPhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY -0.05f);

// Create a scene

NxSceneDesc sceneDesc;

sceneDesc.gravity = gDefaultGravity;

sceneDesc.broadPhase = NX_BROADPHASE_COHERENT;

sceneDesc.collisionDetection = true;

gScene = gPhysicsSDK->createScene(sceneDesc);

NxMaterial * defaultMaterial = gScene->getMaterialFromIndex(0);

defaultMaterial->setRestitution(0.9f);

defaultMaterial->setStaticFriction(0.1f);

defaultMaterial->setDynamicFriction(0.1f);

// Create ground plane

NxPlaneShapeDesc PlaneDesc;

PlaneDesc.d = -5.0f;

NxActorDesc ActorDesc;

ActorDesc.shapes.pushBack(&PlaneDesc);

gScene->createActor(ActorDesc);

//CreateCube(NxVec3(0.020.00.0)5);

// Create body

//////////////////////////////////////////////////////////////

int size = 5;

NxBodyDesc BodyDesc;

BodyDesc.angularDamping = 0.5f;

// BodyDesc.maxAngularVelocity = 10.0f;

BodyDesc.linearVelocity = NxVec3(0.0f0.0f0.0f);

NxBoxShapeDesc BoxDesc;

BoxDesc.dimensions = NxVec3(float(size) float(size) float(size));
NxActorDesc BoxActorDesc;

BoxActorDesc.shapes.pushBack(&BoxDesc);

BoxActorDesc.body = &BodyDesc;

BoxActorDesc.density = 0.10f;

BoxActorDesc.globalPose.t = NxVec3(0.020.00.0);

gScene->createActor(BoxActorDesc)->userData = (void*)size;

}

static void RenderCallback()

{

// Clear buffers

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Setup camera

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(60.0f 1.0 1.0f 10000.0f);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

gluLookAt(0.0 5.1 50.0 0.0 0.0 0.0 0.0f 1.0f 0.0f);

gScene->fetchResults(NX_RIGID_BODY_FINISHED);

gScene->simulate(1/60.0f);

gScene->flushStream();

// Keep physics &graphics in sync

int nbActors = gScene->getNbActors();

NxActor** actors = gScene->getActors();

while(nbActors--)

{

NxActor* actor = *actors++;

if(!actor->userData) continue;

glPushMatrix();

float glmat[16];

actor->getGlobalPose().getColumnMajor44(glmat);

glMultMatrixf(glmat);

glColor4f(1.0f 1.0f 1.0f 1.0f);

glutWireCube(float(int(actor->userData))*2.0f);

glPopMatrix();

}

glutSwapBuffers();

}

int main(int argc char** argv)

{

// Initialize Glut

printf("PhysX Hello World!");

glutInit(&argc argv);

glutInitWindowSize(512 512);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

int mainHandle = glutCreateWindow("PhysX Hello World!");

glutSetWindow(mainHandle);

glutDisplayFunc(RenderCallback);

glutIdleFunc(RenderCallback);

// Setup default render states

glClearColor(0.3f 0.4f 0.5f 1.0);

glEnable(GL_DEPTH_TEST);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_CULL_FACE);

glEnable(GL_LIGHTING);

// Physics code

InitNx();

// ~Physics code

// Run

glutMainLoop();

if(gPhysicsSDK &&gScene) gPhysicsSDK->releaseScene(*gScene);

gPhysicsSDK->release();

return 0;

}

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchiwns/p/10344920.html

时间: 2024-08-13 08:24:09

PhysX入门教程(全)的相关文章

安卓开发入门教程全-PopupWindow用法大全

都是一群技术宅,先给大家说一个严酷的现实吧,现在是6月份,多少人顶着大太阳在找工作,现在我们既然有不错的工作或者想通过安卓学好的,我都希望每一个人去实践,就像Android开发入门QQ群:175229978很多人一样,肯去敲代码,不嫌弃麻烦. 首先给大家介绍安卓PopupWindow,不要嫌弃我讲解的有些详细. Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于:AlertDialog的位置固定,而PopupWindow的位置可以随意AlertDial

Windows XP-android环境搭建-【 潭州安卓开发入门教程全】

最近我们课堂很多人都不会搭建环境,今天我们潭州安卓的老师就讲了一下怎么Windows XP-android环境搭建,我偷偷做了下笔记,希望对咱们更多学习安卓的同学有帮助,慢慢一步步跟着操作是不会有太大问题的. 注:本教程是讲解在Windows XP下搭建安卓开发环境的,不是XP系统的朋友请绕行! 在开始搭建之前,请大家先到本人的网盘中下载所需的6个文件. 下载球球裙:175229978 安装目录: 步骤1à安装JDK---------------------------------对应的安装文件

【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析(转)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20911629 作者:毛星云(浅墨)    邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.8 在这篇文章里,我们一起学习了在OpenCV中如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像

目前见到的最傻瓜全面的STRUTS入门教程^_^

目前见到的最傻瓜全面的STRUTS入门教程^_^ 一  Jakarta Struts学习之新手上路 Web 应用开发早期曾经是那么的“简单”,那个时候还只是纯HTML页面和浏览器特效而已.由于还涉及不到动态数据操作和商业应用,也就省去了很多麻烦.但是这 样的“简单”只是过眼云烟,如今我们不得不为复杂的基于Web的商业应用开发采用诸多技术. 本文将介绍如何利用Struts进行应用开发的前台整合的开发过程.Struts是一个为开发基于模型(Model)-视图(View)-控制器 (Controlle

[整理]Node入门 » 一本全面的Node.js教程 - Demo实践所遇到的问题

花了一个上午看完[转载]Node入门 » 一本全面的Node.js教程 根据里面的Demo自己手动实现过程中还是需到写问题,特整理在此. <1>.由于node.msi安装包已经自动添加了系统环境变量,所以可以在任意地方路径下运行node xxx.js.<2>.确定2个环境变量是否已添加(1)一个是PATH上增加node.exe的目录C:\Program Files\nodejs,(已自动添加)(2)一个是增加环境变量NODE_PATH,值为C:\Program Files\node

C语言编程:一本全面的C语言入门教程(第三版)PDF下载

网盘下载地址:C语言编程:一本全面的C语言入门教程(第三版)PDF下载 – 易分享电子书PDF资源网 作者: (美)Stephen Kochan 出版社: 电子社博文视点资讯有限公司 译者: 张小潘 出版年: 2006年 页数: 543 页 定价: 59.00元 装帧: 平装 ISBN: 9787121007354 内容简介 · · · · · · 本书是极负盛名的C语言入门经典教材,其第一版发行至今已有20年的历史.本书内容详实全面,由浅入深,示例丰富,并在每个章节后面附有部分习题,非常适合读

gitbook 入门教程之小白都能看懂的 Gitbook 插件开发全流程

什么是插件 Gitbook 插件是扩展 GitBook 功能(电子书和网站)的最佳方式. 只要是 Gitbook 默认没有提供的功能,基于插件机制都可以自行扩展,是插件让 Gitbook 变得更加强大. 本文将全面介绍插件的相关知识并重点介绍插件开发的全流程,只有熟悉插件开发流程才能做到有的放矢,心中有数,进而开发出自己的插件. 关于插件请参考 Gitbook 入门教程高级进阶系列文章,本文重点讲解开发 Gitbook 的基本流程. gitbook 入门教程之插件介绍 gitbook 入门教程之

一条数据的HBase之旅,简明HBase入门教程-Write全流程

如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发,以及RegionServer侧将数据写入到Region中的全部流程. NoSQL漫谈 本文整体思路 前文内容回顾 示例数据 HBase可选接口介绍 表服务接口介绍 介绍几种写数据的模式 如何构建Put对象(包含RowKey定义以及列定义) 数据路由 Client侧的分组打包 Client发RPC请求到Regi

TestNG 入门教程&lt;Java 入门&gt;

TestNG 入门教程 摘要:http://www.cnblogs.com/TankXiao/p/3888070.html 国庆7天假期,大部分朋友都出去旅游了,微信圈里全是晒旅游的照片, 东南亚游,欧洲游呀,真是羡慕呀. 悲惨的我只去了上海野生动物园, 在家休息,利用这段假期,把之前学过的东西都总结下. 我前段时间加班太多了,每天忙碌工作,都没精力去管自己的学习新技能的计划, 博客也没写几篇,很多想做的事情都因为工作太忙而耽搁了. 所以工作太忙了也不好,没有精力关注工作以外的事情. 最近写自动