PhysX3.3.4 snippets—SnippetHelloWorld (3)

PhysX3.4文档(3) --Geometry Geometry introduction 这部分主要讨论Physx的几何类。geometry主要用来构建刚体的形状,刚体的形状主要用来作碰撞的触发和physx中的屏幕查询系统的量。Physx也提供独立的function用来做两个geometry的相交性检测,射线扫描和几何体扫描(sweep geometry)。 geometry是值类型,并且所有的geometry类都继承自共同的基类PxGeometry。每一个geometry类都定义了一个可以定位的体积或者表面。transform指明了geometry在 阅读详情

    这一篇我们讨论renderGeometry()函数是怎样使用OpenGL实现shape的渲染的。

    该函数传递的参数是PxGeometryHolder类型,它保存了shape的Geometry。函数内部通过switch语句判断Geometry的类型来进行gl绘图,eBOX,eSPHERE等可以通过OpenGL的一条语句画出,但是复杂几何体就不行了。那么PhysX中的网格shape类型eTRIANGLEMESH和eCONVEXMESH是如何绘制的呢?这里一是要弄明白PhysX-Geometry中这两种数据结构,二是要掌握OpenGL顶点数组的渲染方式。

    首先对于后者,顶点数组渲染方式的思想是将三维网格的所有顶点坐标存放在OpenGL的一个数组中,用一条专门的函数语句来访问这个数组,这样可以避免因为重复调用简单绘图语句,节省开销。除了顶点数组,OpenGL中还有存储顶点法向量的数组等8个顶点数组定义。实现顶点数组方式一般分为三步:启用数组,指定顶点数组数据,解引用与渲染。详细的函数可以参考OpenGL红宝书。

    eCONVEXMESH部分:代码注释如下

case PxGeometryType::eCONVEXMESH:
		{
			
			//Compute triangles for each polygon.
			const PxVec3 scale = h.convexMesh().scale.scale;
			PxConvexMesh* mesh = h.convexMesh().convexMesh;  //获取convexMesh
			const PxU32 nbPolys = mesh->getNbPolygons();     //多边形个数
			const PxU8* polygons = mesh->getIndexBuffer();   //顶点索引数组
			const PxVec3* verts = mesh->getVertices();		 //顶点数组
			PxU32 nbVerts = mesh->getNbVertices();			 
			PX_UNUSED(nbVerts);

			PxU32 numTotalTriangles = 0;        //三角形图元计数        
			for(PxU32 i = 0; i < nbPolys; i++)  //外循环,访问所有多边形
			{
				PxHullPolygon data;             
				mesh->getPolygonData(i, data);	//获取多边形数据

				const PxU32 nbTris = data.mNbVerts - 2;   //三角形个数等于顶点数-2
				const PxU8 vref0 = polygons[data.mIndexBase + 0];   //该多边形的首顶点
				PX_ASSERT(vref0 < nbVerts);
				for(PxU32 j=0;j<nbTris;j++)     //内循环,循环次数等于多边形内所有三角形个数
				{
					const PxU32 vref1 = polygons[data.mIndexBase + 0 + j + 1];  //剩余两个顶点
					const PxU32 vref2 = polygons[data.mIndexBase + 0 + j + 2];

					//generate face normal:
					PxVec3 e0 = verts[vref1] - verts[vref0];  //两条边的向量
					PxVec3 e1 = verts[vref2] - verts[vref0];

					PX_ASSERT(vref1 < nbVerts);
					PX_ASSERT(vref2 < nbVerts);

					PxVec3 fnormal = e0.cross(e1);  //法向量
					fnormal.normalize();  //OpenGL的法向量需要归一化
			
					if(numTotalTriangles*6 < MAX_NUM_MESH_VEC3S)
					{
						gVertexBuffer[numTotalTriangles*6 + 0] = fnormal;      //交替存储顶点的法向量和坐标
						gVertexBuffer[numTotalTriangles*6 + 1] = verts[vref0];
						gVertexBuffer[numTotalTriangles*6 + 2] = fnormal;
						gVertexBuffer[numTotalTriangles*6 + 3] = verts[vref1];
						gVertexBuffer[numTotalTriangles*6 + 4] = fnormal;
						gVertexBuffer[numTotalTriangles*6 + 5] = verts[vref2];
						numTotalTriangles++;  //总三角形个数+1
					}
				}
			}
			glPushMatrix();
			glScalef(scale.x, scale.y, scale.z);
			glEnableClientState(GL_NORMAL_ARRAY);  //启用法向量数组
			glEnableClientState(GL_VERTEX_ARRAY);  //启用顶点数组
			glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gVertexBuffer);      
			glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gVertexBuffer+1);  //指定顶点数组的数据
			glDrawArrays(GL_TRIANGLES, 0, numTotalTriangles * 3);  //解引用与渲染
			glPopMatrix();
		}
		break;

对于该类型shape的解析工作是将它转换成OpenGL可以渲染的三角形基本图元,并将顶点和法向量存储在顶点数组中。首先从PxGeometryHolder类型h变量中获取convexMesh的基本信息,包括三部分:多边形个数nbPolys,顶点坐标数组vertices,索引数组indexBuffer

nbPolys主要负责控制循环次数,因为接下来要对每个多边形进行解析。vertices和indexBuffer配合使用,后者的每一个元素都对应于一个顶点的索引值,即vertices中的元素下标。但是indexBuffer是按照多边形的次序存储的,即先存储多边形0的n0个顶点索引值,接着是多边形1的n1个顶点索引值…如何访问每个多边形呢?通过PxHullPolygon类型对象,这个类的成员包括平面方程参数、该多边形的顶点个数、在indexBuffer中的偏移量mIndexBase(详细可以参照API文档),获取该多边形中顶点坐标的方式如下

const PxU8* faceIndices = indexBuffer + face.mIndexBase;
    for(PxU32 j=0;j<face.mNbVerts;j++)
    {
        vertices[offset+j] = convexVerts[faceIndices[j]];
        normals[offset+j] = PxVec3(face.mPlane[0], face.mPlane[1], face.mPlane[2]);
    }

这样我们就可以设计程序来获取最终渲染所需的三角形图元顶点数组了!在每个多边形中,snippetHelloWorld保持首顶点不变,依次访问所有三角形。另外,法向量的计算通过了求三角形两个边向量×积的方式,其实我们也可以像上面的代码一样直接通过PxHullPolygon类型的mPlane[4]成员获取,它的前三个值就是平面法向量。在编程的时候,还要注意数据类型的大小,小心计算偏移量,以Px开头的数据类型定义可以在API中查找到,我们要搞清楚它与OpenGL和C++中数据类型的关系。

    eTRIANGLE类型就更简单了,索引数组indexBuffer直接按照顺序依次存储了每一个三角形的顶点索引值,因此直接访问就可以了。需要注意的是,这里indexBuffer值可能是16位或32位的,需要做一个判断,否则以32位的index查找16位index的顶点数组会发生错误。

    至此,SnippetHelloWorld代码就解释完了。除了学习之外,它的代码结构完全可以当成一个简单的PhysX框架来用。像本篇所讨论的renderGeometry()就是一个通用的渲染PhysX-shape的函数,其它还有一些窗口、相机的函数都是可以直接用的。大致说来,我们只要重写initPhysics()和renderCallback()中的代码来创建不同的场景并进行渲染,修改keyboardCallback()和mouseCallback()中的代码实现自己的事件监听就可以了。


PhysX3.3.4 snippets—SnippetHelloWorld (1) 从GitHub上下载PhysX3.3源代码,里面包含了snippet系列示例。相比于sample,snippet更加简单,它使用OpenGL和glut工具包作为渲染和窗口系统依赖项。此外,运行snippet不需要计算机有Nvidia显卡(sample代码使用cuda)。我们从SnippetHelloWorld开始,学习构建PhysX程序的主要步骤。   HelloWorld示例在窗口中渲染了一些 阅读详情

相关推荐

Physx3.3 source code

花了一个下午找到的,带工程文件的,至于怎么顺利运行还是大家自己研究。

PhysX3学习笔记

哟,姿爷昨天交了

zhe13 1311

linux虚拟机和电脑ping通(可上网)

linux虚拟机(Ubuntu)和电脑ping通。

观则明的博客 4117

PhysX3学习笔记2

英文原文请戳我

zhe13 2846

OpenCV安装配置教程VS2022(超级顺利)

博主最开始没打算写这篇博客,只是想简单的在网上找一下最新版的OpenCV的安装配置教程,适用于VS2022的,但是我搜了一早上,也没搜到一个能让我成功安装配置的,看了很多很多文章,根本就没有几篇有用的。所以没办法了,只能自己研究了,于是就整理了这篇博客,希望能帮到和我一样的人,这就是博主一直信奉的利他精神!

weixin_47367099的博客 5万+

泄露测试仪CTS的Sentinel I28使用

本文介绍:泄露测试仪CTS的Sentinel I28使用

qq_34047402的博客 2199

PhysX3.3.4 snippets—SnippetHelloWorld (2)

在上一篇中提到renderLoop函数实现了基于OpenGL和Glut的程序框架,其中涉及PhysX的最重要的两个函数是initPhysics()和renderCallback()。这一篇我们分析这两个函数,讨论其中涉及的PhysX核心对象和scene->actor->shape的场景结构。本文的内容大量参考官方Guide和API文档,同时它们也是很好的学习工具,文中一些细节的内容可以从这两份文档

fcauto2012的博客 870

总结所有的池化(Pooling)方法

为什么池化? 池化(Pooling)层和卷积层、全连接层一样,都是卷积神经网络的组成部分。 卷积神经网络中的卷积层会将卷积Filter应用于输入图像,以便创建特征映射来总结输入中这些特征的存在。 卷积层被证明是非常有效的,在深层模型中叠加卷积层可以让接近输入的层学习低层特征(如线条),在模型中更深(高)的层用于学习高阶或者更抽象的特征,如形状或特定对象。 卷积层特征映射输入的一个局限性是它们只能精确记录特征在输入层的位置。这意味着在输入图像中特征位置的小幅移动将导致不同的特征映射。这可以随着重新裁剪

大脸猫的博客 1万+

解决《武装突袭》系列游戏缺失physx3_x86.dll问题的全面指南

在尝试运行诸如《武装突袭》这样的高性能游戏时,玩家可能会遇到一个常见的问题:游戏启动时提示缺失physx3_x86.dll文件。这一问题通常源于游戏依赖的PhysX物理引擎组件未能正确安装或更新。PhysX是由NVIDIA开发的一款物理加速技术,用于在游戏中实现更加逼真的物理效果。本文旨在提供一系列步骤,帮助玩家解决这一问题,确保游戏能够顺利运行。

Xixix777的博客 1058

基于深度强化学习的柔性作业车间动态调度

在追求敏捷和灵活的生产调度方面,处理不可预测的动态事件的能力变得越来越重要。与此同时,生产系统中的网络-物理融合产生了大量需要实时挖掘和分析的工业数据。为了便于这种实时控制,本研究提出了一种分层分布式的体系结构来解决动态柔性作业车间调度问题。采用双深度Q网络算法(DDQN)训练调度智能体,捕捉生产信息与调度目标之间的关系,为具有恒定任务到达的柔性作业车间实时做出调度决策。为了处理动态调度中问题的可变规格说明,提出了专门的状态和动作表示法。此外,还提出了一种代理奖励整形技术(surrogate reward

太剧烈的快乐与太剧烈的悲哀是有相同之点的——同样地需要远离人群! 1万+

EC20模块实战:5步搞定MQTT连接阿里云IoT(附常见错误排查)

本文详细介绍了使用EC20 4G模块通过AT指令连接阿里云IoT平台的完整实战流程。文章以智能农业项目为背景,从硬件接线、网络注册、PDP激活,到MQTT连接配置、一型一密动态注册及数据收发,提供了清晰的5步操作指南,并重点附上了常见错误排查方法,帮助开发者快速实现稳定可靠的物联网设备上云。

weixin_29209801的博客 196

Nvidia PhysX 学习文档2: Snippets

夸耀贫穷比夸富裕更卑鄙——斋藤绿雨 Official document: https://gameworksdocs.nvidia.com/PhysX/4.1/documentation/physxguide/Manual/HelloWorld.html#snippets 红色代表需要吸...

Peace 1129

【AI大模型应用开发】【LangChain系列】实战案例6:利用大模型进行文本总结的方法探索,文本Token超限怎么办?

假设有一组文档(PDF、Notion页面、客户问题等),你想要总结内容。可以利用大模型来帮你。今天来系统看下利用大模型来对文本进行总结的方法,以LangChain的使用为例。

同学小张的博客 3749

3步掌握NVIDIA PhysX:从物理模拟新手到游戏开发高手

NVIDIA PhysX SDK是一款强大的实时物理模拟引擎,专为游戏开发、虚拟现实和增强现实应用设计。这款开源物理引擎支持刚体动力学、软体模拟和流体效果,让开发者能够创建逼真的物理交互体验。PhysX物理引擎以其卓越的性能和跨平台兼容性,已成为游戏物理模拟领域的行业标准。 ## 🎯 核心功能:物理模拟的全方位解决方案 PhysX SDK提供了完整的物理模拟工具集,让开发者能够轻松实现各种物

gitblog_00648的博客 712

【RTD】AD7793驱动程序

AD7793完整驱动程序,支持两线、三线、四线RTD。

只要思想不滑坡,想法总比问题多。 6173

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

揭秘PhysX源码核心原理:从一次simulate调用拆解NVIDIA物理引擎的内部实现

PhysX源码解析的第一步,往往卡在同一个问题:一个简单的 `gScene->simulate(dt)`,为什么能让成千上万个刚体在眨眼间完成碰撞检测、约束求解与位置更新?作为NVIDIA开源的业界主流物理引擎,PhysX 4.1把这些复杂计算藏在了深邃的调用链里。本文将带你以工程师的视角,从一行示例代码出发,沿着数据流动的主线逐层拆解PhysX源码,弄清它的架构设计与性能秘密——读完你不仅能看懂

gitblog_00767的博客 971

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

PhysX SDK源码深度解析:一次碰撞背后,物理引擎到底在做什么

你有没有想过:当游戏里一个箱子从高处落下、砸到地面弹了一下然后稳稳停住,这短短一秒里,CPU到底执行了多少行代码?如果你只调用过 `simulate()` 和 `fetchResults()` 这两个接口,那你看到的只是物理引擎的"冰山一角"。NVIDIA PhysX SDK 之所以能成为游戏和仿真领域的事实标准,靠的不是魔法,而是二十余年沉淀下来的一套精心设计的内部架构。本文直接从 PhysX

gitblog_01184的博客 360

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

别只盯着 simulate():跟一个木箱走完 PhysX 4.1 的一帧,看清物理引擎内部原理

很多开发者第一次接触 NVIDIA PhysX SDK,都是从这四行代码开始的:`createScene`、`simulate(dt)`、`fetchResults(true)`,然后循环。用起来无比顺滑,可一旦被问到"simulate 和 fetchResults 之间到底发生了什么",或者"为什么不能连续调两次 simulate",大多数人就卡壳了。 这篇文章不做枯燥的架构罗列。我们换一种讲

gitblog_00229的博客 444

一文读懂 PhysX SDK源码解析:追一颗弹球穿越物理引擎的全过程

想象一个画面:场景里掉下一颗半径为 0.5 米的球,砸在墙角的另一个球上,两个球轻轻弹开。就这么一个动作,背后藏着 NVIDIA 几十年物理引擎技术的沉淀。而你只要调用一句 `gScene->simulate(dt)`,剩下的交给引擎。可你有没有想过——**这一行代码之后,到底发生了什么?** 这就是我们今天的任务:**PhysX SDK源码解析**。我们不按"架构总览→模块分析"的老套路走,而

gitblog_01035的博客 491

Relay 分页实战:usePaginationFragment Hook 完整指南(@connection 与 @refetchable 深度解析)

usePaginationFragment 是 React Relay 中用于渲染带 `@connection` 连接字段的 fragment 并对其执行分页的核心 Hook。本文以 React Relay 官方 API 文档为主线,结合仓库中 `packages/react-relay/relay-hooks/` 与 `packages/relay-runtime/` 的源码实现与测试用例,系统

gitblog_00392的博客 314

PhysX3.4文档(15) -- Vehicles

Vehicles Introduction PhysX对车辆的支持在3.x中得到了显着的重新设计。为了取代 NxWheelShape 类 2.8.x,已经开发出核心 PhysX SDK 和车辆仿真代码的更优化集成。更具体地说,车辆组件现在以类似于PhysXExtensions的方式位于核心SDK之外。此更改允许在一次通过中更新车辆,并促进更直观的车辆数据建模方法。车辆支持已从2.8.x的悬架/车轮/轮胎建模扩展到更完整的模型,该模型结合了模块化车辆组件,包括发动机,离合器,齿轮,自动变速箱,差速器,车轮

weixin_45031413的博客 3333

PhysX3学习笔记 UserGuider——shapes&geometries简译

API原文请戳我

zhe13 2938

Linux下PhysX3.4编译和环境搭建

Linux下PhysX3.4编译和环境搭建

a505704290的博客 1469

PhysX3.4文档(14) -- Scene Queries

Scene Queries Introduction PhysX 在 PxScene 中提供了一些方法,用于对场景中的Actor和附加形状执行碰撞查询。有三种类型的查询:光线投射、扫描和重叠,每种查询都可以返回单个结果或多个结果。从广义上讲,每个查询遍历包含场景对象的剔除结构,使用 GeometryQuery 函数执行精确测试(请参见几何查询),并累积结果。在精确测试之前或之后可能会发生过滤。 该场景使用两种不同的查询结构,一种用于PxRigidStaticacter,另一种用于PxRigidBodya

weixin_45031413的博客 1084

PhysX3.4文档(8) -- Advanced Collision Detection

Advanced Collision Detection Tuning Shape Collision Behavior 用于产生接触的Shape会影响它们通过contacts(Contact point)附着(attached)着的dynamic rigid bodies。约束求解器在contacts处产生脉冲力,以保持Shape静止或移动而不相互传递。Shape有两个重要参数,用于控制碰撞检测如何生成它们之间的contacts,而这些contacts又是碰撞或堆叠(stacking)时它们行为的核心

weixin_45031413的博客 6590

《武装突袭3》闪退?physx3_x86.dll文件丢失修复秘籍

当遇到《武装突袭3》(Arma 3)游戏提示缺少physx3_x86.dll文件的问题时,这通常意味着游戏在运行物理引擎组件时遇到了缺失的动态链接库(DLL)文件。如果你有physx3_x86.dll文件的备份,或者能够从另一台安装了相同游戏版本的电脑上获取该文件,可以将其复制到游戏的安装目录下,或者复制到C:\Windows\System32目录下(对于64位系统,可能还需要C:\Windows\SysWOW64)。如果你是通过Steam平台购买的游戏,可以验证游戏文件的完整性。

Vernon_218的博客 854
上一篇: PhysX3.3.4 snippets—SnippetHelloWorld (2)
下一篇: Phinecos(洞庭散人) 专注于开源技术的研究与应用 基于MFC的OpenGL绘图
fcauto2012
博客等级 码龄11年 59粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值