有没有办法在Bullet Physics中设置Broadphase Filter Callback如下:
复合动力体由两个形状构成,比如一个圆柱体和一个盒子,其中圆柱体只能与其他动态体内的圆柱碰撞,而盒子只能与第三种体碰撞,这是一个静态的球体
不允许任何其他碰撞:带球体的圆柱体,不得碰撞; 带盒子的盒子,也不要碰撞
下图显示了我上面所描述的内容

在Bullet Physics库中,当构造刚体时,惯性张量的默认参数是零向量.
我对惯性的理解是相当基本的,但从方程式来看
扭矩=惯性*angular_velocity
我希望惯性为零的物体上的角速度不确定.
对于动态对象,可以使用碰撞形状来近似局部惯性张量,否则使用零向量(默认参数)
那么零惯性会发生什么?我误解了这个等式吗?或者在子弹中具有零惯性,类似于在定义物体相对于方向时具有零质量?
最初,两个非接触的半径R1和R2的球体在静止的空间中.
然后在时间= 0时分别给它们两个加速度a1和a2.
找出他们是否会联系.它们的初始位置分别表示为(x1,y1,z1)
和(x2,y2,z2).加速度具有3D中的各个组件.它们分别
表示为(a1i,a1j,a1k)和(a2i,a2j,a2k).
成功碰撞球体的数学条件是什么?或者解决这类问题的编程思路应该是什么.
注意:如果你可以根据问题中提到的变量给出我满意的条件,即r1,r2,x1,y1,z1,x2,y2,z2,a1i,a2i,a1j,a2j,a1k和A2K
physics collision-detection collision game-physics bulletphysics
我正在为Android创建一个Dice Roller应用程序.使用Kotlin,OpenGL-ES和jBullet.我已经实现了骰子.现在我需要创建墙,因为否则骰子将从屏幕滚出.
因为屏幕可以有不同的宽高比,我试图确定墙的位置glUnProject,但我无法弄明白.我收到的坐标不正确.
gl.glViewport(0,0,width,height) //Reset The Current Viewport
gl.glMatrixMode(GL10.GL_PROJECTION) //Select The Projection Matrix
gl.glLoadIdentity() //Reset The Projection Matrix
//Calculate The Aspect Ratio Of The Window
GLU.gluPerspective(gl, 35.0f, width.toFloat() / height.toFloat(), 0.1f, 100.0f)
GLU.gluLookAt(gl,
0.0f, 30.0f, 0.0f, //Pos
0.0f, 0.0f, 0.0f, //Look at
0.0f, 0.0f, 1.0f //Up
);
gl.glMatrixMode(GL10.GL_MODELVIEW) //Select The Modelview Matrix
gl.glLoadIdentity() //Reset The Modelview Matrix
// Get matrices
gl.glGetFloatv(GL11.GL_PROJECTION_MATRIX, glProjectionMatrix,0)
gl.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, glModelMatrix,0)
gl.glGetIntegerv(GL11.GL_VIEWPORT, glViewPort,0)
// Allocate matrices
var modelMatrix = glModelMatrix
var projMatrix = glProjectionMatrix
var …Run Code Online (Sandbox Code Playgroud) 我正在查看最近开放源代码的NVidia PhysX 3.4,发现的全部都是C ++类-头版本或包装API是否仅是C?
有一天,我决定开始用普通的旧 C 编写一个视频游戏。
这很有趣,三个月后(我有时离开工作的时间很少)我发现自己需要一些物理引擎。
我决定使用 Bullet 物理引擎,因为它似乎是我需要的更好的引擎之一。
然后,我发现 Bullet 并没有真正的 C API,而只有完整的 C++ API。它的 C API 没有得到维护。
经过一天的诅咒,我将我的项目“转换”为 C++,这是一个大胆的声明,表示我对所有堆分配进行了类型转换,并使用 new 和 delete 而不是 malloc 和 free,并在“extern“C”中包含了一些定义{ ... }'。
有些人可能会因为我这样做而向我开枪,但我看不出有其他选择可以使用性能任务处理的东西,例如这个物理引擎,它只有一个 C++ API,在 C 中。
所以现在,我正在使用 g++ 进行编译,同时仍然主要编写“C”代码。我发现自己不那么高兴了,因为代码感觉不再那么纯粹了。
C++ 给了我一些奇怪的错误消息,而我并不反对我经常不喜欢 g++ 解析器的语言。除了我现在可以愉快地将物体相互弹射这一事实之外,我的宠物项目的一些小而纯洁现在已经被遗弃了。
我想知道我是否做对了。我可以寻求一些建议吗,我应该继续而不用担心为我的“主要”C 代码使用 C++ 编译器吗?是否有其他方法可以在 C 中使用此 API 而不会影响性能或过度维护工作?
我正在尝试在bulletphysicals中实现一个简单的幽灵对象,这就是我创建幽灵对象的方式:
btGhostPairCallback* ghostCall = new btGhostPairCallback();
world->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(ghostCall);
btGhostObject* ghostObj = new btGhostObject();
btCollisionShape* shape = new btBoxShape(btVector3(ofGetWidth()+1000, ofGetHeight()+1000, 50));
ghostObj->setCollisionShape(shape);
btTransform trans;
trans.setIdentity();
trans.setOrigin(btVector3(0,0,-500));
ghostObj->setWorldTransform(trans);
ghostObj->setCollisionFlags( btCollisionObject::CF_NO_CONTACT_RESPONSE);
world->addCollisionObject(ghostObj,btBroadphaseProxy::SensorTrigger,btBroadphaseProxy::AllFilter & ~btBroadphaseProxy::SensorTrigger);
Run Code Online (Sandbox Code Playgroud)
这是尝试找到碰撞的方法:
btCollisionObject* obj = world->getCollisionObjectArray()[j];
btRigidBody* body = btRigidBody::upcast(obj);
btAlignedObjectArray < btCollisionObject* > objsInsidePairCachingGhostObject;
btAlignedObjectArray < btCollisionObject* >* pObjsInsideGhostObject = NULL;
btGhostObject* ghost = btGhostObject::upcast(obj);
if(ghost){
objsInsidePairCachingGhostObject.resize(0);
pObjsInsideGhostObject = &ghost->getOverlappingPairs();
cout << ghost->getNumOverlappingObjects() << endl;
Run Code Online (Sandbox Code Playgroud)
但我总是得到这样的回应:我的所有世界对象都与幽灵对象发生碰撞。
任何人都可以帮助我获得一个功能简单的幽灵对象吗?
谢谢
我已经使用NDK将Bullet Physics引擎实现到我的android程序中(我使用的是Vuforia的 imagetarget示例,用于android),它已经设置并正常工作,但是我想渲染/绘制我的碰撞盒/飞机来查看我的刚体(btRigidBody)/碰撞形状(btCollisionShape),我很肯定这是可能的,但我找不到任何关于如何做的教程!
我已经在他们的wiki页面上接受了hello world Bullet物理教程并修改它以应用从坠落物理体到我在opengl es 2.0中查看碰撞体的3d对象的转换,这里是我用来渲染的代码反对:
void drawRigidBody(btRigidBody* body,QCAR::Matrix44F modelViewMatrix, unsigned int textureID)
{
btTransform trans;
body->getMotionState()->getWorldTransform(trans);
LOG("sphere pos: (x %f , y %f, z %f)",trans.getOrigin().getX(),trans.getOrigin().getY(),trans.getOrigin().getZ());
float physicsMatrix[16];
trans.getOpenGLMatrix(physicsMatrix);
SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale,
&modelViewMatrix.data[0]);
QCAR::Matrix44F modelViewProjection, objectMatrix;
SampleUtils::multiplyMatrix(&modelViewMatrix.data[0], physicsMatrix, &objectMatrix.data[0]);
SampleUtils::multiplyMatrix(&projectionMatrix.data[0], &objectMatrix.data[0], &modelViewProjection.data[0]);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,
(const GLvoid*) &signVerts[0]);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0,
(const GLvoid*) &signNormals[0]);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0,
(const GLvoid*) &signTexCoords[0]);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
glUniformMatrix4fv(mvpMatrixHandle, …Run Code Online (Sandbox Code Playgroud) 截至目前,我正在使用以下代码从子弹中的刚体获取变换矩阵并将其应用于我的实例。现在似乎没有更新我渲染的立方体的变换,我的第一个不过是相信我在创建 glm mat4 时丢失了数据。所以我的问题是我是否正确转换数据以转换我的矩阵?
for (int i = 0; i < WoodenCrateInstances.size(); i++)
{
btTransform t;
WoodenCrateInstances.at(i).asset->body->getMotionState()->getWorldTransform(t);
float mat[16];
t.getOpenGLMatrix(mat);
glm::vec3 vec = glm::make_vec3(mat);
WoodenCrateInstances.at(i).transform = glm::translate(glm::mat4(), vec);
}
Run Code Online (Sandbox Code Playgroud) bulletphysics ×10
bullet ×3
android ×2
c++ ×2
collision ×2
game-physics ×2
physics ×2
android-ndk ×1
c ×1
filter ×1
game-engine ×1
glm-math ×1
jbullet ×1
opengl-3 ×1
opengl-es ×1
physx ×1