- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
即使提升 block 根本不动,上点棱柱关节 (b2PrismaticJointDef) 上的提升 block 也会对位于提升 block 表面的动态物体产生插入力。
可能是 javascript 端口的错误。但我想修复它,因为我的游戏中需要电梯。
我使用了 Box2DFlash 2.1a 的 box2dweb javascript 端口 https://code.google.com/p/box2dweb/ .
这是关于 Flash 的类似演示 http://hyzhak.github.com/darlingjs/performance/box2dweb/它有同样的问题,所以这个问题可能在闪存或原始 Box2D 引擎上。
http://jsfiddle.net/hyzhak/2kjDZ/
var b2Vec2 = Box2D.Common.Math.b2Vec2,
b2BodyDef = Box2D.Dynamics.b2BodyDef,
b2Body = Box2D.Dynamics.b2Body,
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
b2World = Box2D.Dynamics.b2World,
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef;
(function() {
var world = buildWorld();
var leftBlock = buildBlock({world: world, x: 2, y: 8, width: 2, height: 12, static: true});
var rightBlock = buildBlock({world: world, x: 12, y: 8, width: 2, height: 12, static: true});
var bottomBlock = buildBlock({world: world, x: 7, y: 13, width: 8, height: 2, static: false});
var box = buildBlock({world: world, x: 7, y: 10, width: 2, height: 2, static: false});
var joint = buildPrismaticJoint({world: world,
anchorA: new b2Vec2(7, 13),
axis: new b2Vec2(0, 1),
bodyA: bottomBlock,
bodyB: world.GetGroundBody()});
var debugDraw = buildDebugDraw(world);
setInterval(function(){
world.Step(1 / 60, 10, 10);
world.DrawDebugData();
world.ClearForces();
},1000/60);
})();
function buildWorld() {
return new b2World(
new b2Vec2(0, 10), //gravity vector
true
);
}
function buildBlock(state) {
var fixDef = new b2FixtureDef;
fixDef.shape = new b2PolygonShape;
fixDef.density = 1.0;
fixDef.friction = 0.5;
fixDef.restitution = .5;
fixDef.shape.SetAsBox(state.width / 2, state.height / 2);
var bodyDef = new b2BodyDef;
bodyDef.type = state.static?b2Body.b2_staticBody:b2Body.b2_dynamicBody;
bodyDef.position.Set(state.x, state.y);
var body = state.world.CreateBody(bodyDef);
body.CreateFixture(fixDef);
return body;
}
//buildPrismaticJoint(world, 9, 15, 0, 1, bottomBlock, world.GetGroundBody());
function buildPrismaticJoint(state) {
var jointDef = new b2PrismaticJointDef();
jointDef.Initialize(state.bodyA, state.bodyB, state.anchorA, state.axis);
jointDef.collideConnected = false;
jointDef.lowerTranslation = 0.0;
jointDef.upperTranslation = 5.0;
jointDef.enableLimit = true;
jointDef.maxMotorForce = 400.0;
jointDef.motorSpeed = 3.0;
jointDef.enableMotor = true;
return state.world.CreateJoint(jointDef);
}
function buildDebugDraw(world) {
var debugDraw = new b2DebugDraw();
debugDraw.SetSprite(document.getElementById("playground").getContext("2d"));
debugDraw.SetDrawScale(20.0);
debugDraw.SetFillAlpha(0.5);
debugDraw.SetLineThickness(1.0);
debugDraw.SetFlags(
b2DebugDraw.e_shapeBit |
b2DebugDraw.e_jointBit |
b2DebugDraw.e_aabbBit |
b2DebugDraw.e_pairBit |
b2DebugDraw.e_centerOfMassBit |
b2DebugDraw.e_controllerBit
);
world.SetDebugDraw(debugDraw);
return debugDraw;
}
最佳答案
我在使用 Box2D v2.2.1 C++ 代码时遇到了同样的问题。我在静态主体和移动(动态)主体之间使用 b2PrismaticJoint 来模拟“电梯”(或电梯)。
当升降机到达沿棱柱关节平移的上端时,它似乎停止了。然而,当另一个物体坐在升降机顶部并到达平移的上端时,升降机顶部的 body 开始“弹跳”,就好像升降机仍在施加力一样。 (我相信这正是正在发生的事情,即升降机的主体没有沿着棱柱关节进一步平移,但棱柱关节的电机仍在转动并向 body 施加向上的力)。
我最初通过在达到平移上限时手动将棱柱关节的电机速度设置为 0.0 来解决此问题。在我的主游戏循环中,即以帧速率调用的函数(Box2D 中的“tick:”或 Cocos2D 中的“update:”),我插入了以下内容(我在这里使用 Objective-C,kLiftJointValue 是一个任意整数常量):
// Iterate over all joints (used to prevent upper end oscillations from psimaticJoints on lifts)
for (b2Joint* j = world->GetJointList(); j; j = j->GetNext())
{
if ((int)(j->GetUserData()) == kLiftJointValue) // check to see if lift is at upper end of translation
{
CGFloat currentTranslation = ((b2PrismaticJoint*)j)->GetJointTranslation();
CGFloat lowerLimit = ((b2PrismaticJoint*)j)->GetLowerLimit();
CGFloat upperLimit = ((b2PrismaticJoint*)j)->GetUpperLimit();
b2Body *bodyA = j->GetBodyA();
b2Body *bodyB = j->GetBodyB();
BOOL notStopped = (bodyA->GetType() == b2_dynamicBody || bodyB->GetType() == b2_dynamicBody);
if (fabsf(currentTranslation - lowerLimit) <= 0.01*(upperLimit - lowerLimit) && notStopped )
{
CCLOG(@"Stopping platform");
(j->GetBodyA())->SetType(b2_staticBody);
(j->GetBodyB())->SetType(b2_staticBody);
((b2PrismaticJoint*)j)->SetMotorSpeed(0.0);
}
}
}
上面的代码简单地遍历了世界上的所有关节并寻找那些被适当标记的关节,如果 body 已经平移到允许的最大平移的 1% 以内,那么移动的 body 就会变成静止的,并且电机被禁用将电机速度设置为 0。您还可以使用 Box2D 碰撞检测并将关节的电机速度设置为 0 ...
然后我意识到实现此升降机的最佳方法(不干扰升降机顶部的任何东西)是逐渐降低棱柱关节的电机速度。我是这样做的:
// Iterate over all joints (used to prevent upper end oscillations from psimaticJoints on lifts)
for (b2Joint* j = world->GetJointList(); j; j = j->GetNext())
{
if ((int)(j->GetUserData()) == kLiftJointValue) // check to see if lift is at upper end of translation
{
CGFloat currentTranslation = ((b2PrismaticJoint*)j)->GetJointTranslation();
CGFloat lowerLimit = ((b2PrismaticJoint*)j)->GetLowerLimit();
CGFloat upperLimit = ((b2PrismaticJoint*)j)->GetUpperLimit();
b2Body *bodyA = j->GetBodyA();
b2Body *bodyB = j->GetBodyB();
BOOL notStopped = (bodyA->GetType() == b2_dynamicBody || bodyB->GetType() == b2_dynamicBody);
if (fabsf(currentTranslation - lowerLimit) <= 0.25*(upperLimit - lowerLimit) && notStopped)
{
// Get current motor speed and update
CGFloat currentSpeed = ((b2PrismaticJoint*)j)->GetMotorSpeed();
CGFloat newSpeed;
if (currentSpeed < 0.0)
{
if (fabsf(currentTranslation - lowerLimit) <= 0.01*(upperLimit - lowerLimit) && notStopped )
{
CCLOG(@"Stopping platform");
(j->GetBodyA())->SetType(b2_staticBody);
(j->GetBodyB())->SetType(b2_staticBody);
((b2PrismaticJoint*)j)->SetMotorSpeed(0.0);
}
else
{
CCLOG(@"Decelerating: speed=%f", currentSpeed);
newSpeed = 0.95*currentSpeed;
}
}
else if (currentSpeed > 0.0)
{
CCLOG(@"Accelerating: speed=%f", currentSpeed);
newSpeed = 1.05*currentSpeed;
if (newSpeed > 20.0)
newSpeed = 20.0;
}
// update motor speed
((b2PrismaticJoint*)j)->SetMotorSpeed(newSpeed);
}
}
}
您需要使用各种常数(尤其是常数 0.95 和 1.05),因为它们针对特定的电机属性进行了微调(在我的例子中为 maxMotorForce = 1000 和 motorSpeed = 20)。
当然,在我的项目的其他地方,我有定时器运行,它根据需要重置升降体和关节电机属性(使其向上移动,然后通过将关节的电机速度反转为正值来返回)。
当电梯在另一个(底部)限制附近平移时,我没有实现加速/减速技术,因为我不关心电梯停止时乘坐电梯的东西在这个方向上被施加力。然而,当电梯离开或返回底部时,可以使用与上述相同的方法平稳地加速或减速......
关于javascript - Box2D 引擎 javascript 端口 Prismatic Joint 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15760919/
我正在使用MySQL。在我的数据库中,我有以下表格: A student table 。该表的主键是sid . A high_school table 。主键是 hid . A university
我正在使用MySQL。在我的数据库中,我有以下表格: A student table 。该表的主键是sid . A high_school table 。主键是 hid . A university
我通过 Python 3.7 使用 OpenCV。我有一组看起来像这样的单色图像: 我想在这些图像上找到所有“关节点”,其中“关节点” - 是两个木板的每个交叉点的中心(1 像素)。这些“关节”大致由
如何在关节js中的克隆关节元素上触发pointerdown/dragstart?当工具箱纸上触发 pointerdown 事件时,会触发 toolBoxPointerDown。当 _this.pape
我正在两篇论文之间实现拖放操作。但是由于我的 html 正文中有两篇论文,所以我坚持拖动元素的偏移量与光标位置的同步。我对 css 的经验非常少,这可能会导致问题元素的定位。 用例:- 用户单击纸 2
我是 Joint JS 的新手,无法动态设置以下元素的宽度和高度属性: var rect = new joint.shapes.basic.Rect({ position: { x: 100,
我有这样的数据库结构: TBL_A | TBL_B | TBL_C | TBL_D | TBL_E -------+---------+---------+---------+-----
我才刚刚开始学习组合,所以对我来说还是有点模糊。我想创建一个自定义的 Publisher,它将使用 CLLocationManager 来公开当前用户位置。我希望它以这样的方式工作,即 locatio
我正在开发一款让玩家围绕行星运行的游戏。我正在使用 PrismaticJoint 让玩家靠近和远离行星,我通过旋转玩家 (bodyB) 所连接的中心点主体(关节的 bodyA)来围绕玩家运行。我通过启
我有一个需要 SKPhysicsJointFixed.joint 的小游戏,它一切正常,除了一个事实,即关节处于事件状态时,即 10 秒,会使 Sprite 速度减慢,速度似乎是 Sprite 速度的
这是我的设置: SKScene 有一个名为 world 的节点 在这个世界上,我附加了另一个节点:车辆 我将三个节点附加到这辆车上;一个 body 和两个轮子 轮子通过指定 anchor 的 SKPh
以下代码出现错误 - 物理关节数组似乎具有 PKPhysicsJoint 类。有人知道如何在 Swift 中迭代关节吗? documentation确实说 physicsBody.joints 应该返
我想做的是为端口和路径创建一个带有自定义类的元素,这样我就可以添加一个带有自定义路径的元素和我自己的端口标记。这样当我创建一个元素时,我将传递动态路径它的形状就像路径类的元素一样,而且我也从 Port
我正在研究 JointJS API。但是我想防止元素从它们的原始位置移动。你能建议我一些 JointJS 的特性或 CSS 的任何一般特性,我可以用它来使我的对象不可移动。 我不能在论文或 paper
因此,当我继续构建 Autowiring 脚本时,我遇到了我预计难以解决的三个问题中的第二个。这可能是一个非常简单的答案:但脚本本身非常容易使用,首先点击“生成代理定位器”,然后点击“构建脊柱关节”:
我在两个物体(一个球体和一个盒子)之间有一个铰接点。我想知道当球体用旋转电机围绕盒子旋转时如何避免球体进入盒子内部。 这是沿 x 轴旋转时球体进入盒子内部的快照: 两个物体都有物理特性,并且都在机器人
我正在尝试用一堆尸体制作一个布娃娃。我想用什么样的关节来连接它们?距离关节? 最佳答案 C# API 应该与 AS3.0 非常相似,看看 AS3.0 Flash Implementation Samp
我在 joint.js 中有一个 FSA,我需要使状态(圆圈)从圆圈底部开始按特定比例半填充,例如 1/2 或 1/6。棘手的部分是它需要完成两次 - 一个更大的半填充和一个更小的半填充。 这就是我想
在我的 SQL 数据库中有以下表(简化): 表格博客: +----+----------------------+----------+ | ID | Date | T
我正处于 MS3D 解析器的规划阶段,正在查看 specs我看到顶点结构有一个 boneId 变量。 “骨头”是关节的同义词吗?那么,那个 boneId 变量是关节数组的索引吗?如果不是,那么什么是骨
我是一名优秀的程序员,十分优秀!