我正在编写一个使用Bullet Physics作为物理模拟引擎的角色动画渲染引擎。
序列将在屏幕上没有模型的情况下开始,然后将动画分配给该模型,模型将移至动画的第0帧,引擎将开始使用动画渲染模型。
在第0帧初始化刚体时,在刚体模型上重新放置刚体的正确方法是什么?
当前,我正在使用此代码,在将动画分配给模型并将骨骼移动到第0帧位置后立即调用该代码:
_world->removeRigidBody(_body);
bool k = (_type == Kinematics);
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans()));
tr *= _trans;
_body->setCenterOfMassTransform(tr);
_body->clearForces();
_body->setLinearVelocity(btVector3(0,0,0));
_body->setAngularVelocity(btVector3(0,0,0));
_world->addRigidBody(_body, _groupID, _groupMask);
Run Code Online (Sandbox Code Playgroud)
问题是有时候这行得通,有时则行不通。例如,以模特的裙子为例。有时它会以自然位置显示,其他时候略微偏离并落入到位,而其他时候它会完全夹在整个身体中,就像碰撞被关闭并且有些力将其推向那个方向一样。在大多数情况下,这确实很有意义,因为在测试动画中,我使用的模型的初始位置位于屏幕的中央,但是动画从屏幕的左侧开始。有谁知道如何解决这个问题?
我知道裙子上的骨骼不是问题,因为我关闭了物理功能,并强迫它在每个帧中手动更新骨骼位置,并且整个动画中的所有位置都正确。
编辑:我也有约束,可能是什么原因造成的?
在Bullet Physics库中,当构造刚体时,惯性张量的默认参数是零向量.
我对惯性的理解是相当基本的,但从方程式来看
扭矩=惯性*angular_velocity
我希望惯性为零的物体上的角速度不确定.
对于动态对象,可以使用碰撞形状来近似局部惯性张量,否则使用零向量(默认参数)
那么零惯性会发生什么?我误解了这个等式吗?或者在子弹中具有零惯性,类似于在定义物体相对于方向时具有零质量?
有一天,我决定开始用普通的旧 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)
但我总是得到这样的回应:我的所有世界对象都与幽灵对象发生碰撞。
任何人都可以帮助我获得一个功能简单的幽灵对象吗?
谢谢
我在 python 类中使用 pybullet。我将其导入为import pybullet as p. 当我使用 pybullet 有多个类p的实例时,每个实例的类是否相同,还是每个实例的“变量”p 都是唯一的?
文件
import pybullet as p
class Foo:
def __init__(self, counter):
physicsClient = p.connect(p.DIRECT)
def setGravity(self):
p.setGravity(0, 0, -9.81)
(more code)
Run Code Online (Sandbox Code Playgroud)
和 main.py
from foo import Foo
foo1 = Foo(1)
foo2 = Foo(2)
foo1.setGravity()
Run Code Online (Sandbox Code Playgroud)
会setGravity()影响pfoo1 和 foo2 还是只影响 foo1?
我试图做以下事情

当我尝试检查Bullet或FreeType或Both时,会弹出以下内容

我不明白为什么?
我想测试子弹物理的春季约束。因此,我创建了一个悬停在地面上方的静态框,并将第二个动态框悬于其下。但是激活弹簧行为无济于事!盒子确实可以自由悬挂。我知道是因为它可以自由旋转。但它不会振荡或发生任何变化。
btCollisionShape *boxShape = createBoxShape(0.2f, 0.2f, 0.2f);
btRigidBody *box1 = createStatic(boxShape);
btRigidBody *box2 = createDynamic(1.0f /*mass*/, boxShape);
box1->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 2.0f, 1.0f }));
box2->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 1.0f, 1.0f }));
btGeneric6DofSpring2Constraint *spring = new btGeneric6DofSpring2Constraint(
*box1, *box2,
btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }),
btTransform(btQuaternion::getIdentity(), { 0.0f, 0.0f, 0.0f })
);
// I thought maybe the linear movement is locked, but even using these lines do not help.
// spring->setLinearUpperLimit(btVector3(0.0f, 0.1, 0.0f));
// spring->setLinearLowerLimit(btVector3(0.0f, -0.1, 0.0f));
// Enabling the spring …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能用我自己的模式覆盖现有的(随CMake一起提供)查找模块?这样我可以在我的项目中提供稍微更新的模块,而不必强迫任何人更换CMake附带的模块.
我尝试过以下操作:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "cmake/Modules/FindBullet.cmake")
Run Code Online (Sandbox Code Playgroud)
其中"cmake/Modules/FindBullet.cmake"在我的项目目录中,但它似乎不起作用.
澄清一下 -ammo.js是使用 mscripten 的 Bullet 物理端口
我有一个角色(本质上是一个方块)需要用力推动。我已经尝试了(我认为)所有的力方法,但我仍然无法移动方块。
setVelocity(1,0,0)甚至不会移动方块——它只是阻止重力作用在它上面!
applyImpulse([0,0,200000],[0,0,0])绝对什么也不做。
applyForce([0,0,200000],[0,0,0])绝对什么也不做。
当我在 blogdown 中为我的网站提供服务时,项目符号不会呈现。我的网站在我的 Windows 10 机器上本地托管。当我添加 html 标签时,该列表实际上有效。当我在另一个项目中打开一个空白的 rmd 文件时,项目符号可以正确呈现。
我在 blogdown .rmd 帖子中的列表代码示例:
* text
* text
* text
Run Code Online (Sandbox Code Playgroud)
以及使用 html 标签的工作版本:
<ul>
<li>text</li>
<li>text</li>
<li>text</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
>sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] Rcpp_1.0.0 bookdown_0.9 …Run Code Online (Sandbox Code Playgroud) bullet ×10
c++ ×2
physics ×2
blogdown ×1
c ×1
cmake ×1
freetype ×1
html ×1
javascript ×1
libgdx ×1
position ×1
python ×1
python-3.7 ×1
python-class ×1
r ×1
rigid-bodies ×1
set ×1