在其边缘旋转刚体
Rotate rigidBody on its edge?
我正在创建一个简单的游戏,涉及使用c++中的子弹库挥动俱乐部。然而,我有麻烦旋转俱乐部(刚体)我想要的方式。
作为参考,下面是俱乐部的结构:
struct Club {
btRigidBody *btPhys;
btScalar rotateAmount;
btVector3 axis;
}
我是这样旋转球杆的:
//Create a rotation matrix from the club's world transform
btMatrix3x3 orn = club.btPhys->getWorldTransform().getBasis();
//Apply a rotation to the matrix
orn *= btMatrix3x3(btQuaternion( btVector3(0, 0, 1), btScalar(degreesToRads(club.rotationAmount))));
//Set the rotation of the club
club.btPhys->getWorldTransform().setBasis(orn);
然而,这只是旋转刚体在中心的俱乐部。我希望刚体在它的边缘(球杆的柄)附近旋转。
所以我添加了一个变换,将俱乐部向上移动到枢轴点之上:(这段代码紧跟着前面的代码)
btTransform trans;
//Get the club's trasnform
club.btPhys->getMotionState()->getWorldTransform(trans);
float x, y, z;
x = trans.getOrigin().getX();
y = trans.getOrigin().getY();
z = trans.getOrigin().getZ();
//Set the transform to be 2 units above the club's origin (the club is 4 units long)
trans.setOrigin(btVector3(btScalar(x), btScalar(y + 2.0f), btScalar(z)));
//Apply the transform to the club
club.btPhys->getMotionState()->setWorldTransform(trans);
然而,这不会改变枢轴点,它只是将球杆移动到枢轴点上方(创建一个不必要的空间)。
简而言之,旋转矩阵只是围绕它的中心旋转刚体。我只想把枢轴点从刚体的中心移动到刚体的边缘SetWorldTransform of MotionState总是围绕它的质心变换物体。
有两种方法可以解决你的问题。如果你使用btDefaultMotionState作为运动状态,你可以在构造函数中指定质心的偏移量。这样物体就会绕另一点旋转。然而,这种方法有一个严重的副作用。所有与这个物体的物理相互作用都将把新的枢轴点作为质心。如果你的身体是运动的,它是完美的,但如果它是动态的,效果可能与期望的效果不同。
另一种可能更安全的方法是将3个变换堆叠在一起以实现您正在寻找的旋转。首先,将身体平移到所需枢轴的位置。接下来,旋转它。最后,把它平移回质心的位置
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何获取边缘窗口句柄 (HWND)?
- 提升如何在图形可视化中写入边缘的权重?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 在 c++ 中使用 Tensorflow Lite 在边缘 TPU 上运行"mobilenet_ssd_v2_coco_quant_postprocess_edgetpu.tflite"时出现问题
- 子轴围绕父轴而不是他自己的轴旋转
- 将使用太多的纹理插值器 - 带旋转的着色器
- 分数背包边缘箱
- 应用程序无法找到铬边缘浏览器
- SFML 向下移动时如何围绕屏幕中心旋转?
- 如何在OpenGL中正确旋转和缩放对象?
- 在其边缘旋转刚体