🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Box2D

Box2Dは、C++で記述された2D物理演算エンジン。C++以外にも多くの言語に移植されています。円形・多角形の物体の運動をシミュレーションすることが可能で、GUIで動作を確認できるテストベッドが付属されています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1227閲覧

box2dにおいて三角形のbodyを作ることについて

justmeet0924

総合スコア44

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Box2D

Box2Dは、C++で記述された2D物理演算エンジン。C++以外にも多くの言語に移植されています。円形・多角形の物体の運動をシミュレーションすることが可能で、GUIで動作を確認できるテストベッドが付属されています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/11/22 06:16

編集2021/11/22 09:07

box2dにおいて三角形のbodyを作りたいと考えています。
大まかな流れとしては、まずbodyDef、fixtureDefを作り、fixtureDefに形状の情報を持たせ(shapeプロパティのm_verticesプロパティで頂点を設定します)、bodyDef、fixtureDefから、CreateBody、CreateFixtureを使って、triangleを定義するという方針です。
最後から二番目の行まではエラーは出ないのですが、それ以降でエラーが出ます。

//三角形の生成 let vertices = [new b2Vec2(0,-10),new b2Vec2(-10,0),new b2Vec2(10,0)]; var bodyDef = new b2BodyDef; bodyDef.type = b2Body.b2_dynamicBody; bodyDef.position.Set(200 / PTM_RATIO, 10 / PTM_RATIO); bodyDef.userData = 'obj'; console.log(bodyDef) var fixDef = new b2FixtureDef; fixDef.density = 10.0; fixDef.friction = 0; fixDef.restitution = 0; fixDef.shape = new b2PolygonShape(); console.log(fixDef.shape) fixDef.shape.vertexCount = 3; console.log(fixDef.shape.vertexCount) console.log(fixDef.shape.m_vertices); for(i=0;i<3;i++){ fixDef.shape.m_vertices[i] = vertices[i]; } console.log(fixDef.shape.m_vertices); console.log(fixDef); var triangle = world.CreateBody(bodyDef); console.log(triangle); console.log(triangle.b2Body) triangle.CreateFixture(fixDef); console.log(triangle);

どなたかご教授くださると幸いです。

*追記いたします。
例えば下記のようなコードでpolygonShapeを作るとします。その際に、最終行のVertexCountの値がundefinedになるので、vertexCountを設定しなくてはならないはずですが、console.log(polygonShape)をコンソールにて調べても、メソッドとして、vertexCount()が見当たらないのです。
vertexCountを設定するためには、vertexCount()というメソッドがあらかじめpolygonShapeに登録されている必要があると思うのですが・・・・。

let polygonShape = new b2PolygonShape() console.log(polygonShape); console.log(polygonShape.GetVertexCount()); for(i=0;i<3;i++){ polygonShape.m_vertices[i] = vertices[i]; } console.log(polygonShape); console.log(polygonShape.GetVertexCount());

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cx20

2021/11/22 14:07 編集

Box2D は派生バージョンが多いライブラリです。どのライブラリを使っているかを記載下さい。 (前回の質問からすると Box2DWeb だとは思いますが・・) <参考> ■ Box2DWeb(Box2DFlash の JavaScript 移植版) https://github.com/hecht-software/box2dweb ■ Box2DJS(Box2DFlashAS3 の JavaScript 移植版) http://box2d-js.sourceforge.net/ ■ box2d.js (Emscripten による JavaScript 移植版) https://github.com/kripken/box2d.js ■ LiquidFun(Box2D を拡張したライブラリ) https://github.com/google/liquidfun
justmeet0924

2021/11/23 10:50

回答ありがとうございます。 今回の回答の件ですが、私の使っているライブラリにも、b2polygonshapeクラスにSetAsArray()というメソッドがあり、また、形状を作る際には、b2bodyクラスのCreateFixture2(shape, density)というメソッドを使うようでした。なので、おそらく、cx20様の指摘してくださったBox2DWebバージョンなのだと思います。 ダウンロードした時にどれを選んだか忘れてしまったので、確認できないのですが・・・・。 今回も丁寧な回答ありがとうございます。もしよろしければ、box2d関係の質問にて、またご教授いただきたいです。お時間許すようであれば、よろしくお願いします。 物体がすり抜ける問題については解決しました。
cx20

2021/11/23 11:07

> Box2DWebバージョンなのだと思います。 SetAsArray() があるのは、Box2DWeb のようですね。 > どれを選んだか忘れてしまったので、確認できない もう一度ダウンロードして、比較してみたらわかるかと思います。 https://github.com/hecht-software/box2dweb/blob/master/Box2D.js https://github.com/hecht-software/box2dweb/blob/master/Box2d.min.js > 物体がすり抜ける問題については解決しました。 自己解決されたようで何よりです。 自分も特段、物理演算ライブラリに詳しいわけでは無いですが、分かる範囲で回答させて頂きます。 以下は手前味噌ですが、昔作ったサンプルになります(公式サンプルを少し改造しただけですが・・) https://github.com/cx20/jsdo.it-archives/tree/master/tag/physics2d
guest

回答1

0

ベストアンサー

■ Box2DWeb(Box2DFlash の JavaScript 移植版)
https://github.com/hecht-software/box2dweb

を使っている前提で回答します。
b2PolygonShapeSetAsArray() というメソッドがあるようです。

javascript

1fixDef.shape.vertexCount = 3; 2for(i=0;i<3;i++){ 3 fixDef.shape.m_vertices[i] = vertices[i]; 4}

の代わりに

javascript

1fixDef.shape.SetAsArray(vertices, vertices.length);

を試してみて下さい。

<参考>
■ b2PolygonShape - Box2DFlash Documentation
http://www.tud.ttu.ee/im/Jaak.Henno/FlashDevelop/Box2D/Docs/Box2D/Collision/Shapes/b2PolygonShape.html

投稿2021/11/22 15:46

cx20

総合スコア4648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問