在Box2D Web中定位实体内的圆形
Positioning Circle Shapes within a Body in Box2D Web
我不得不彻底修改这个问题,因为我认为我对自己的问题不够明确。
我正在尝试学习Box2DWeb的诀窍。当我想学习如何在一个刚体中放置多个形状(以形成反应灵敏的凹体)时,我开始遇到问题。我做的一个假设是,只有当我可以改变形状的位置时,这种功能才会真正有用(这样我就可以控制整个刚体的样子)。一个例子是创建一个有两个矩形的"L"体,其中一个位于第一个形状的下方和右侧。
到目前为止,我已经找到了SetAsOrientedBox方法,在该方法中,您可以将框的位置传递给第三个参数(中心)。
一切都很好。但当我试图在一个刚体中创建两个圆形时,我发现了不可取的行为。我的直觉是使用SetLocalPosition方法(在b2CircleShape类中找到)。这似乎在一定程度上起了作用。在调试绘制中,身体会像它应该做的那样做出物理响应,但在视觉上(在调试中)它似乎并没有在它们的位置绘制形状。它只是在中心位置绘制圆形。我知道这可能是Box2D的调试绘制逻辑的问题,但我觉得奇怪的是,没有关于这个问题的在线模式。有人会认为,在身体坐标空间的不同位置创建两个圆形将是一种流行且有充分记录的现象。显然不是。
下面是我用来创建实体的代码。假设世界已经有效地转移到这个范围:
// first circle shape and def
var fix_def1 = new b2FixtureDef;
fix_def1.density = 1.0;
fix_def1.friction = 0.5;
fix_def1.restitution = .65;
fix_def1.bullet = false;
var shape1 = new b2CircleShape();
fix_def1.shape = shape1;
fix_def1.shape.SetLocalPosition(new b2Vec2(-.5, -.5));
fix_def1.shape.SetRadius(.3);
// second circle def and shape
var fix_def2 = new b2FixtureDef;
fix_def2.density = 1.0;
fix_def2.friction = 0.5;
fix_def2.restitution = .65;
fix_def2.bullet = false;
var shape2 = new b2CircleShape();
fix_def2.shape = shape2;
fix_def2.shape.SetLocalPosition(new b2Vec2(.5, .5));
fix_def2.shape.SetRadius(.3);
// creating the body
var body_def = new b2BodyDef();
body_def.type = b2Body.b2_dynamicBody;
body_def.position.Set(5, 1);
var b = world.CreateBody( body_def );
b.CreateFixture(fix_def1);
b.CreateFixture(fix_def2);
请注意,我使用的是Box2DWeb(http://code.google.com/p/box2dweb/)与HTML5画布。
看起来你实际上根本没有使用标准的调试绘图,而是使用了一个你自己编写的函数——这解释了它缺乏在线模式的原因(为子孙后代使用pastebin)。
查看box2dweb源代码,并查看这些函数以获得工作参考: nbsp b2World.protype.DrawDebugData nbsp;b2World.protype.DrawShape
nbsp b2调试Draw.prototype.DrawSolidCircle
您可以使用画布上下文"arc"函数来避免使用sin/cos计算点,然后绘制单独的线来形成圆。它还允许浏览器使用它所知道的最有效的方式来渲染曲线,例如某些浏览器上的硬件支持。
由于您似乎想要进行自定义渲染,另一个需要注意的陷阱是DrawCircle和DrawSolidCircle的不同调用签名。第二个参数是轴方向的参数,因此,如果您错误地使用三参数版本的Javascript,则会默默地使用轴的颜色参数,留下一个未定义的颜色参数。几个小时的乐趣!
DrawCircle(center, radius, color)
DrawSolidCircle(center, radius, axis, color)
- 使用指针重新分析实体
- 如何使用tinyxml2从XML加载父实体和子实体
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 重新定位图像时如何前进到下一个内存块
- 流填充字符的默认定位
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 如何在 ECS 模型中组织实体?
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 为什么我们不在下面给出的代码中使用指针来实例化C++的实体对象?
- 有关纯 ECS(实体组件系统)和更新系统的问题
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- NS3 - python.h 文件无法定位编译错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- 返回模板化实体的函数的概念
- 在 C++ 中编写解析器来解析给定的 HTML 实体
- 无法将错误分配给成员函数中"类型的实体"
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 在Box2D Web中定位实体内的圆形