PhysX学习记录 二
2014-03-03 08:44
387 查看
原文地址:http://blog.csdn.net/heartrude/article/details/7768139
首先是2.8.1 SDK下载,最近NVidia Develop官网发生了账号丢失问题。不能访问了,使用如下链接吧:http://download.csdn.net/detail/heartrude/4441402
安装方面,一键安装即可,没有什么需要注意的。
参考/SampleBoxes/src/NxBoxes.cpp和官方文档,就可以直接完成一个简单的,有着完整逻辑的PhysX案例了。并且可以解决两个问题:
1.PhysX内存消耗
2.PhysX的多场景并行实现
详细代码见附件,这里记录一下关键API调用。
包含的头文件
#include "NxPhysics.h"
如果在包含该头文件前已经包含windows.h. 需要定义该宏。保证不会存在min和max的预定义
#define NOMINMAX#include <windows.h>
1.NxCreatePhysicsSDK 初始化SDK函数。该函数调用成功,直接增加160M的内存。
[cpp] view
plaincopy
gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, NULL, new ErrorStream(), desc, &errorCode);
if(gPhysicsSDK == NULL)
{
printf("\nSDK create error (%d - %s).\nUnable to initialize the PhysX SDK, exiting the sample.\n\n", errorCode, getNxSDKCreateError(errorCode));
return false;
}
2.有了这个代码和SAMPLES_USE_VRD宏定义。只要在启动程序前启动了VRD(Visual RemoteDebugger),程序启动后就可以在VRD中看到创建的场景和模型了。还可以看到具体的数据。还不错。
[cpp] view
plaincopy
#if SAMPLES_USE_VRD
// The settings for the VRD host and port are found in SampleCommonCode/SamplesVRDSettings.h
if (gPhysicsSDK->getFoundationSDK().getRemoteDebugger())
gPhysicsSDK->getFoundationSDK().getRemoteDebugger()->connect(SAMPLES_VRD_HOST, SAMPLES_VRD_PORT, SAMPLES_VRD_EVENTMASK);
#endif
3.创建场景。场景的内存不多,几K吧。
[cpp] view
plaincopy
gScene = gPhysicsSDK->createScene(sceneDesc);
if(gScene == NULL)
{
printf("\nError: Unable to create a PhysX scene, exiting the sample.\n\n");
return false;
}
4.simulate. 输入参数是该次调用和前次调用之间需要模拟的时间差。最后一定要对应调用fetchResults。否则会报错。具体参数后续再说。
[cpp] view
plaincopy
gScene->simulate(1.0f/60.0f);
gScene->fetchResults(NX_RIGID_BODY_FINISHED, true);
5.创建对象。该对象有一个速度linearVelocity ,所以是运动的
[cpp] view
plaincopy
// Create body
NxBodyDesc bodyDesc;
bodyDesc.angularDamping = 0.5f;
if(initialVelocity) bodyDesc.linearVelocity = *initialVelocity;
NxBoxShapeDesc boxDesc;
boxDesc.dimensions = NxVec3((float)size, (float)size, (float)size);
NxActorDesc actorDesc;
actorDesc.shapes.pushBack(&boxDesc);
actorDesc.body = &bodyDesc;
actorDesc.density = 10.0f;
actorDesc.globalPose.t = pos;
gScene->createActor(actorDesc)->userData = (void*)size_t(size);
6.删除场景
[cpp] view
plaincopy
gPhysicsSDK->releaseScene(*gScene);
7.删除资源
[cpp] view
plaincopy
NxReleasePhysicsSDK(gPhysicsSDK);
到此就是一个完整的逻辑了。
测试代码中,我创建了2个Scene。两个Scene创建不同大小的Cube。最后在VRD中两个场景中的Cube是显示在一起的。但是相互自己没有碰撞。独立的。
总结:
SDK实例化使用了160M左右的内存,而且该对象是一个单键。无法同一进程创建多份的。
同一个SDK,创建两个Scene。一个Scene就是一个世界的概念。能够完全独立。
每个Cube所占用的内存很少。4K左右。是否这么多不是很确定。
首先是2.8.1 SDK下载,最近NVidia Develop官网发生了账号丢失问题。不能访问了,使用如下链接吧:http://download.csdn.net/detail/heartrude/4441402
安装方面,一键安装即可,没有什么需要注意的。
参考/SampleBoxes/src/NxBoxes.cpp和官方文档,就可以直接完成一个简单的,有着完整逻辑的PhysX案例了。并且可以解决两个问题:
1.PhysX内存消耗
2.PhysX的多场景并行实现
详细代码见附件,这里记录一下关键API调用。
包含的头文件
#include "NxPhysics.h"
如果在包含该头文件前已经包含windows.h. 需要定义该宏。保证不会存在min和max的预定义
#define NOMINMAX#include <windows.h>
1.NxCreatePhysicsSDK 初始化SDK函数。该函数调用成功,直接增加160M的内存。
[cpp] view
plaincopy
gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION, NULL, new ErrorStream(), desc, &errorCode);
if(gPhysicsSDK == NULL)
{
printf("\nSDK create error (%d - %s).\nUnable to initialize the PhysX SDK, exiting the sample.\n\n", errorCode, getNxSDKCreateError(errorCode));
return false;
}
2.有了这个代码和SAMPLES_USE_VRD宏定义。只要在启动程序前启动了VRD(Visual RemoteDebugger),程序启动后就可以在VRD中看到创建的场景和模型了。还可以看到具体的数据。还不错。
[cpp] view
plaincopy
#if SAMPLES_USE_VRD
// The settings for the VRD host and port are found in SampleCommonCode/SamplesVRDSettings.h
if (gPhysicsSDK->getFoundationSDK().getRemoteDebugger())
gPhysicsSDK->getFoundationSDK().getRemoteDebugger()->connect(SAMPLES_VRD_HOST, SAMPLES_VRD_PORT, SAMPLES_VRD_EVENTMASK);
#endif
3.创建场景。场景的内存不多,几K吧。
[cpp] view
plaincopy
gScene = gPhysicsSDK->createScene(sceneDesc);
if(gScene == NULL)
{
printf("\nError: Unable to create a PhysX scene, exiting the sample.\n\n");
return false;
}
4.simulate. 输入参数是该次调用和前次调用之间需要模拟的时间差。最后一定要对应调用fetchResults。否则会报错。具体参数后续再说。
[cpp] view
plaincopy
gScene->simulate(1.0f/60.0f);
gScene->fetchResults(NX_RIGID_BODY_FINISHED, true);
5.创建对象。该对象有一个速度linearVelocity ,所以是运动的
[cpp] view
plaincopy
// Create body
NxBodyDesc bodyDesc;
bodyDesc.angularDamping = 0.5f;
if(initialVelocity) bodyDesc.linearVelocity = *initialVelocity;
NxBoxShapeDesc boxDesc;
boxDesc.dimensions = NxVec3((float)size, (float)size, (float)size);
NxActorDesc actorDesc;
actorDesc.shapes.pushBack(&boxDesc);
actorDesc.body = &bodyDesc;
actorDesc.density = 10.0f;
actorDesc.globalPose.t = pos;
gScene->createActor(actorDesc)->userData = (void*)size_t(size);
6.删除场景
[cpp] view
plaincopy
gPhysicsSDK->releaseScene(*gScene);
7.删除资源
[cpp] view
plaincopy
NxReleasePhysicsSDK(gPhysicsSDK);
到此就是一个完整的逻辑了。
测试代码中,我创建了2个Scene。两个Scene创建不同大小的Cube。最后在VRD中两个场景中的Cube是显示在一起的。但是相互自己没有碰撞。独立的。
总结:
SDK实例化使用了160M左右的内存,而且该对象是一个单键。无法同一进程创建多份的。
同一个SDK,创建两个Scene。一个Scene就是一个世界的概念。能够完全独立。
每个Cube所占用的内存很少。4K左右。是否这么多不是很确定。
相关文章推荐
- PhysX学习记录 一
- PhysX学习记录 三
- PhysX学习记录 三
- PhysX学习记录 一
- PhysX学习记录 四 参数杂记
- PhysX学习记录 五 Actor对象
- PhysX学习记录 六 Joint
- PhysX学习记录 八 Spherical Joint
- PhysX初步学习内容记录
- PhysX学习记录 七 冲突检测
- PhysX学习记录 八 Spherical Joint
- PhysX学习记录 四 参数杂记
- PhysX学习记录 六 Joint
- PhysX学习记录 九 Shape参数说明
- PhysX学习记录 五 Actor对象
- PhysX学习记录 二
- PhysX学习记录 七 冲突检测
- PhysX学习记录 九 Shape参数说明
- vue 学习记录
- HashSet与HashMap的关系(学习记录)