首页 > 其他分享 >bullet3-collision例子

bullet3-collision例子

时间:2024-03-03 09:03:46浏览次数:27  
标签:pointCapacity int contactCache collision 例子 bullet3 world colB colA

bullet3的碰撞检测例子在examples/collision,CollisionTutorialBullet2类中,先是plCreateCollisionWorld,然后plCreateSphereShape,创建一些几何shape,然后调plCollide执行两个shape之间的碰撞检测,返回contact 点个数及坐标,调plWorldCollide执行world中所有shape的碰撞检测。
plXXX(...)这些函数是在CollisionSdkC_Api.h包装中的,都是间接调CollisionSdkInterface接口中的方法,sdk具体实现在internal目录中,实现了bullet2版本和bullet3版本,例如collide方法,bullet2中是,类和api前缀一般都是bt

int Bullet2CollisionSdk::collide(plCollisionWorldHandle worldHandle, plCollisionObjectHandle colA, plCollisionObjectHandle colB,
								 lwContactPoint* pointsOut, int pointCapacity)
{
	btCollisionWorld* world = (btCollisionWorld*)worldHandle;
	btCollisionObject* colObjA = (btCollisionObject*)colA;
	btCollisionObject* colObjB = (btCollisionObject*)colB;
	btAssert(world && colObjA && colObjB);
	if (world == m_internalData->m_collisionWorld && colObjA && colObjB)
	{
		Bullet2ContactResultCallback cb(pointsOut, pointCapacity);
		world->contactPairTest(colObjA, colObjB, cb);
		return cb.m_numContacts;
	}
	return 0;
}

bullet3中的实现,类前缀为b3

int RealTimeBullet3CollisionSdk::collide(plCollisionWorldHandle worldHandle, plCollisionObjectHandle colAHandle, plCollisionObjectHandle colBHandle,
										 lwContactPoint* pointsOutOrg, int pointCapacity)
{
	RTB3CollisionWorld* world = (RTB3CollisionWorld*)worldHandle;
	RTB3_ColliderOpaque2Int caster;
	caster.m_ptrValue = colAHandle;
	int colAIndex = caster.m_intValue;
	caster.m_ptrValue = colBHandle;
	int colBIndex = caster.m_intValue;
	const b3Collidable& colA = world->m_collidables[colAIndex];
	const b3Collidable& colB = world->m_collidables[colBIndex];

	plContactCache contactCache;
	contactCache.pointCapacity = pointCapacity;
	contactCache.pointsOut = pointsOutOrg;
	contactCache.numAddedPoints = 0;

	for (int i = 0; i < colA.m_numChildShapes; i++)
	{
		for (int j = 0; j < colB.m_numChildShapes; j++)
		{
			if (contactCache.numAddedPoints < pointCapacity)
			{
				//funcTbl_detectCollision[world->m_childShapes[colA.m_shapeIndex+i].m_shapeType]
				//					   [world->m_childShapes[colB.m_shapeIndex+j].m_shapeType](world,colAIndex,colA.m_shapeIndex+i,colBIndex,colB.m_shapeIndex+j,&contactCache);
			}
		}
		return contactCache.numAddedPoints;
	}

	return 0;
}

标签:pointCapacity,int,contactCache,collision,例子,bullet3,world,colB,colA
From: https://www.cnblogs.com/abcstar/p/18049577

相关文章

  • Transformer 例子2
    一个多维数据输入的例子:importtorchimporttorch.nnasnnimportnumpyasnpimportmatplotlib.pyplotasplt#构造简单的多维时间序列数据集defgenerate_multivariate_time_series(num_samples,seq_length,input_dim):data=np.random.randn(num_samples,se......
  • Transformer 例子
    据说很好用,先写一个例子看看:importtorchimporttorch.nnasnnimportnumpyasnpimportmatplotlib.pyplotasplt#构造简单的时间序列数据集defgenerate_time_series():time=np.arange(0,100,0.1)amplitude=np.sin(time)returnamplitude#将......
  • StampedLock 使用例子
    StampedLock是Java8引入的一种新的锁机制,它是ReadWriteLock的改进版,提供了更高的并发性和更好的性能。下面是一个使用StampedLock的示例:importjava.util.concurrent.locks.StampedLock;publicclassStampedLockDemo{privatedoublex,y;privatefinalSt......
  • Qt的拖拽操作例子
    本文是一个拖拽文本的例子。演示了如何把按钮的标题拖拽到文本编辑框里。Qt对拖拽的封装很好,QDrag对象简单易用。本文程序测试环境是VS2017和Qt5.9。下面是程序拖拽时的效果图,可以看出来拖拽的时候光标下方也显示了文本内容:头文件。本功能是在主窗口中实现的。下面代码里QtTest......
  • OpenCL切换显卡的例子
    在一些有多个显卡,比如一个核芯显卡和一个独立显卡的系统中使用显卡加速,OpenCL默认的设备可能不是性能更好的独立显卡。这时候可以用下述方法更换显卡,代码如下。本例在VS2015和OpenCL3.0下测试通过:conststringkernel=u8R"(kernelvoidreduceSum(globalint*num,globa......
  • OpenCL规约算法例子
    本文给出一个规约算法求数组的和的例子。本例子求20000000(两千万)个整数的和。运算过程分成了两步,第一步是GPU对每一个工作组内规约求和,然后将每个工作组的求和结果放到数组中输出。第二步是对输出的数组用CPU求和。实际运行对比发现GPU的效率不如用CPU直接求和。下述算法运行环境......
  • QT5气象例子
    天气预报:'''项目实战:天气信息查询'''importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindowfromWeatherWinimportUi_FormimportrequestsclassMainWindow(QMainWindow):def__init__(self,parent=None):......
  • GCC使用具体教程以及例子
    编译第一个C程序#include<stdio.h>intmain(void){printf("helloworld!\n");return0;}使用gcc命令将hello.c编译成可执行程序a.out,并运行: 将源文件hello.c编译为一个指定名称的可执行文件:hello,可以通过gcc-o参数来完成GCC编译过程分析 以demo.c为......
  • 在C#中,你可以在两个嵌套的`for`循环中同时使用变量`i`,但是你需要确保每个循环中的`i`
    在C#中,你可以在两个嵌套的for循环中同时使用变量i,但是你需要确保每个循环中的i都被正确地初始化和更新。这是一个例子:for(inti=0;i<5;i++){for(inti=0;i<5;i++){//在这里执行你的代码}}在这个例子中,外部循环和内部循环都有自己的i变量,......
  • UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子
    UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子(自己学习记录一下,不一定合理,仅供参考)本例子是使用ADO等组件连接一个云服务器的一个数据库,调用GetOrg存储过程,把机构信息展现把结果导出的一个EXECL表里,并下载把显示的HSate的值进行替换1表示正常,其他表示暂停......