タグ付けされた質問 「bullet-physics」

4
2Dタワーディフェンス-敵への弾丸
敵に弾丸を打つための良い解決策を見つけようとしています。ゲームは2Dタワーディフェンスです。タワーは弾丸を撃ち、保証された敵を攻撃することになっています。 私はこの解決策を試しました-http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/ 弾丸の起源と敵を同様に差し引くために言及されたリンク(ベクトル減算)。私はそれを試してみましたが、敵の周りに弾丸がついてきます。 float diffX = enemy.position.x - position.x; float diffY = enemy.position.y - position.y; velocity.x = diffX; velocity.y = diffY; position.add(velocity.x * deltaTime, velocity.y * deltaTime); 私はベクトルに精通していますが、このソリューションを機能させるためにどのステップ(ベクトル演算)を行うべきかはわかりません。

1
弾丸の物理演算をゲームに統合するにはどうすればよいですか?
ここにあるリリースファイルをダウンロードしましたが、どこから始めればよいかわかりません。私のゲームでは、長方形と球体がいくつかあるので、これらすべてを互いに衝突させたい。(それらにはすべてメッシュと関連する境界ボリュームがあります) 編集-直方体には実際にAABBが関連付けられていることに気づきました。少なくともそれを変える必要があると思います。 どのような手順に従う必要がありますか?

3
Bulletを使用すると、物理がネットワーク上で正しく同期しない
Bulletを使用してクライアント/サーバーの物理システムを実装しようとしていますが、同期をとるのに問題があります。 ゲームオブジェクトから変換を読み書きするカスタムモーション状態を実装しましたが、ローカルで動作しますが、ネットワーク化されたゲームに対して2つの異なるアプローチを試しました。 サーバー上にも存在するクライアント上の動的オブジェクト(たとえば、ランダムな破片やその他の重要ではないもの)は運動学的に作成されます。これは正しく動作しますが、オブジェクトは非常にスムーズに移動しません オブジェクトは両方で動的ですが、オブジェクトが移動したというサーバーからの各メッセージの後に、線形速度と角速度をサーバーからの値に設定し、サーバーのトランスフォームでbtRigidBody :: proceedToTransformを呼び出します。また、btCollisionObject :: activate(true);を呼び出します。オブジェクトを強制的に更新します。 方法2の私の意図は基本的に方法1を行うことでしたが、方法1をスムーズにするために自分で行う代わりにBulletを乗っ取って貧者の予測を行いましたが、これはうまくいかないようです(理由が100%明確ではないため)私は弾丸を踏んでさえいます)そしてオブジェクトは時々異なる場所に行き着きます。 私は正しい方向に向かっていますか?Bulletには独自の補間コードが組み込まれているようです。それは私が方法1をうまく機能させるのに役立ちますか?または、誤って踏みつけているため、方法2のコードが機能していませんか? 編集:私が気付いた方法1のもう1つの問題は、同期されていないオブジェクトに対する衝突の衝突応答が大幅にずれることです。キネティックボディは、ノックバックできないため、時々無限にシュートするものです。

2
Bullet物理エンジンでY軸の動きを無効にする方法
X軸とZ軸に沿って移動するだけでなく、Y軸を無効にしたままオブジェクトを作成したいと思います(2Dでの移動と同じで、オブジェクトが落ちることはありません)。 現在、Y軸の動きを制限するために6自由度の制約を使用していますが、機能しません。 btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to btRigidBody* robot = mCarChassis->getBulletRigidBody(); btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false); constrict->setLinearLowerLimit( btVector3( 1, 1, 1)); constrict->setLinearUpperLimit( btVector3(-1, 1,-1)); constrict->setAngularLowerLimit( btVector3( 1, 1, 1) ); constrict->setAngularUpperLimit( btVector3(-1, -1, -1) ); …

1
Bullet Physics-リジッドボディから直接光線を投射する(一人称カメラ)
Bulletを使用して一人称カメラを実装しました。これはカプセル形状の剛体です。Bulletを使用して数日しか経っていませんが、物理エンジンは初めてです。私はそれbtRigidBody::setLinearVelocity()を移動するために使用し、それは世界と完全に衝突します。唯一の問題は、Y値が自由に移動することです。これは、ボディを移動する前に、並進ベクトルのY値をゼロに設定することで一時的に解決しました。これは、高所から落下する場合を除いて、すべての場合に機能します。 体が背の高いオブジェクトから落ちた場合でも、移動ベクトルのY値がゼロに設定されているため、移動を停止して地面に落ちるまで速度は設定されます。これを解決するには、ボディからレイをダウンキャストしてワールドのY値を決定し、その値とカメラボディのY値の差を確認して、次の場合は動きを無効にするか、速度を遅くします違いは十分に大きいです。 光線を投射し、光線が当たった世界のY値を特定するだけで、少し行き詰まりました。私はこのコールバックを実装しました: struct AllRayResultCallback : public btCollisionWorld::RayResultCallback{ AllRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld) : m_rayFromWorld(rayFromWorld), m_rayToWorld(rayToWorld), m_closestHitFraction(1.0){} btVector3 m_rayFromWorld; btVector3 m_rayToWorld; btVector3 m_hitNormalWorld; btVector3 m_hitPointWorld; float m_closestHitFraction; virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) { if(rayResult.m_hitFraction < m_closestHitFraction) m_closestHitFraction = rayResult.m_hitFraction; m_collisionObject = rayResult.m_collisionObject; if(normalInWorldSpace){ m_hitNormalWorld = rayResult.m_hitNormalLocal; } else{ …

2
Bulletを学ぶために、Box2Dの代わりにBulletを2D物理学に使用する価値はありますか?
質問にはこれ以上ありません。どちらも私の目的には問題ないので、オーバーヘッドについては気にしていません。基本的に、Farseer Physics EngineのおかげでBox2Dの概念に精通していますが、3DにジャンプするときにBulletを使用したいと思います。おそらく、Bulletは2Dの領域でも私にいくつかの教育的価値を持っていますか? 質問の一般化されたバージョンは次のとおりです。将来3D物理エンジンを利用する予定がある場合、2Dゲームに3D物理エンジンを使用する必要がありますか?または、これは教育的価値を提供しない時間の無駄ですか?

3
Bullet Physics / Ogre3Dを使用したRPGでキャラクターをどのように移動しますか?
最近、Ogre3Dゲームでのキャラクターの移動に問題があります。基本的には弾丸のRigidBody->translate()機能でキャラクターを動かしていますが、そうすると壁にぶつかると少し通り抜けて跳ね返ります。壁のある単純な平面タイプの世界で、自分のキャラクター(球の衝突形状を持つ)を移動する別の良い方法があるかどうか疑問に思っていますか? これに関連する私が使用しているライブラリは、「Ogre3D」と「Bullet Physics」です。

6
Box2dとBulletの物理シミュレーションは内部でどのように機能しますか?
box2dとbulletがJavaScriptに移植されたのを見ましたが、ソースコードを除いて、どちらも私を惹きつけませんでした。中を見ると、それはすべてとてもシンプルに見えました。 すばらしい物理シミュレーションを得るために、各ライブラリ内で何をしていますか?説明が見つからない。

1
ボクセル地形との衝突を有効にするためにbtCollisionAlgorithmを拡張するにはどうすればよいですか?
私はBulletを使用しており、適切な衝突応答とともに、キューブベースの地形から接触点を生成する衝突アルゴリズムを作成しようとしています。また、ボックス以外の形状も含めるように拡張する予定ですが、現時点では重要ではありません。三角形のメッシュを使用することは、大きなマップにとってはRAMを独占しすぎることを発見しました。 ここでByte56 で概説されている手順を試しましたが、Bulletを使用してこれを実装することについて、いくつか質問があります。 どのようにして世界の衝突形状を生成しますか?カスタム形状を使用していますか?あなたはそれに何を設定m_shapeTypeしますか? それとも、あなたはまだ世界のサイズの箱形を使用していますか? 連絡先を確実に解放するにはどうすればよいですか? どのように正確に変更しprocessCollisionますか? 私がやったこと: この形状のみを持つオブジェクトのディスパッチャーに新しい衝突アルゴリズムを登録できるようにするために、terrainShape that extendsbtBoxShape , the only difference being thatm_shapeType = CUSTOM_CONVEX_SHAPE_TYPE` を作成しました。 私は拡張しましたbtRigidBodyが、(2番目の段落内のリンクを参照してください)彼の質問でByte56と同様にクラスがcheckCollisionWith(CollisionObject * co)あればtrueを返す任意ののAABBにおけるボクセルがco空気ではありません。 次のようにして、とbtCollisionAlgorithm同様の方法でクラスを拡張しました。btCompoundCollisionAlgorithmprocessCollision 引数として渡された衝突オブジェクトをチェックし、どちらが地形で、どちらがエンティティであるかを判別します。 多様体の子アルゴリズムをクリアします。 コール resultOut->setPersistantManifold(resultOut) 衝突するエンティティが占めるAABBで新しいボックス形状と変換を生成し、を呼び出しますm_dispatcher->findAlgorithm。AABB内のボクセルごとに、形状、変換、および検出されたアルゴリズムをChild Algorithm構造体に保存します。 すべての子アルゴリズムを繰り返し、を呼び出しproccessCollisionます。 すべての子アルゴリズムを反復処理し、衝突しているエンティティのAABBの外側にあるものをすべて削除します。(~btCollisionAlgorithm()次に呼び出すm_dispatcher->freeCollisionAlgorithm()) を呼び出しresultOut->refreshContactPoints()ます。 機能するもの:processCollisionプレーヤーのAABBが非空気ボクセルと交差するときに呼び出されます。 できないこと:衝突応答は単なる奇妙なものです...プレイヤーエンティティは上方に浮上し始めます。何かに入ると、激しく跳ね返ります。何かに足を踏み入れた後、1つの軸上で動き続けることができない場合があります。おそらく、プレイヤーエンティティが常にワールドオブジェクトのAABBにあるため、衝突応答後に接点が解放されていないのではないかと思います。に関して正しい木を吠えているprocessCollisionかどうか知りたいです。

3
地形のような立方体を表すBullet Physics CollisionObjectを実装するにはどうすればよいですか?
Bullet Physicsライブラリをエンティティ/コンポーネントシステムに正常に統合しました。エンティティは互いに衝突する可能性があります。次に、有限で立方体のような地形と衝突できるようにする必要があります(InfiniMinerまたはそれのクローンMinecraftと考えてください)。昨日、Bullet Physicsライブラリを使い始めたばかりなので、何か明らかなことが足りないのかもしれません。 これまでのところRigidBody、checkCollisionWith(CollisionObject co)関数をオーバーライドするようにクラスを拡張しました。現時点では、他の形状を使用せずに、単なる原点のチェックです。後で繰り返します。現時点では、次のようになっています。 @Override public boolean checkCollideWith(CollisionObject co) { Transform t = new Transform(); co.getWorldTransform(t); if(COLONY.SolidAtPoint(t.origin.x, t.origin.y,t.origin.z)){ return true; } return false; } これは、衝突がいつ発生したかを検出する限り、うまく機能します。ただし、これは衝突応答を処理しません。デフォルトの衝突応答は、衝突しているオブジェクトを他のシェイプ(おそらくAABB)の外側に移動するようです。 現時点では、地形の形状は世界と同じ大きさの箱にすぎません。つまり、地形と衝突するエンティティは、そのワールドサイズのボックスの外側に向かって発射されます。そのため、衝突応答を変更する必要があるか、地形の形状に直接適合する形状を作成する必要があることは明らかです。では、どのオプションが最適で、どのように実装するのですか?おそらく、私が考えていないオプションがあるのでしょうか? 地形は動的で、プレイヤーによって頻繁に変更されることに注意してください。

3
Bullet Physicsとの壁の衝突時のジッター:接触/貫通許容度?
私はPanda3dを通じて弾丸物理エンジンを使用しています。 私のシーンはまだ非常にシンプルです。「Wolfenstein3d」を考えてください。タイルベースで、壁は立方体です。 壁がプレイヤーをブロックすることを期待し、通常の発生率でない場合、プレイヤーは壁に沿ってスライドすることを期待します。 私が得るものは、私が期待するものですが、1つの違いがあります。壁に無理に入れようとすると、2つの位置の間でフレームがすばやく点滅します。これらは約0.04単位の距離で異なります。これは私のゲームでは4 cmに相当します。 私は他の場所で4 cmに気づきました。休憩しているとき、私のプレイヤーカプセルの底は地面の下4 cmです。 接触と衝突を区別するために、Bulletエンジンのどこかにデフォルトの0.04単位長の許容誤差があるということですか?もしそうなら、私は何をすべきですか?これらの0.04単位が0.4 cmに対応するようにゲームのスケールを変更して、ジッターを10倍小さくする必要がありますか?または、弾丸の許容値をより小さい値に変更するように要求できますか? 編集する これは私が得るジッタです:6.155-6.118 = 0.036 LPoint3f(0, 6.11694, 0.835) LPoint3f(0, 6.15499, 0.835) LPoint3f(0, 6.11802, 0.835) LPoint3f(0, 6.15545, 0.835) LPoint3f(0, 6.11817, 0.835) LPoint3f(0, 6.15726, 0.835) LPoint3f(0, 6.11876, 0.835) LPoint3f(0, 6.15911, 0.835) LPoint3f(0, 6.11937, 0.835) setMarginメソッドを見つけました。壁のBoxShapeとプレーヤーのCapsuleシェイプの両方で5 mmに設定しました。このログ(11.117-11.082 = 0.035)が示すように、それでも約35 mmジッターします。 LPoint3f(0, 11.0821, 0.905) LPoint3f(0, …

2
弾丸物理学を使用して2つの特定のオブジェクトの衝突コールバックを取得するにはどうすればよいですか?
プロジェクトに衝突コールバックを実装する際に問題が発生しました。2つの特定のオブジェクト間を検出したいのですが。通常の衝突が発生しましたが、別のオブジェクトと衝突したときに、1つのオブジェクトを停止したり、色を変更したりします。私は弾丸ウィキからコードを書きました: int numManifolds = dynamicsWorld->getDispatcher()->getNumManifolds(); for (int i=0;i<numManifolds;i++) { btPersistentManifold* contactManifold = dynamicsWorld->getDispatcher()->getManifoldByIndexInternal(i); btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0()); btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1()); int numContacts = contactManifold->getNumContacts(); for (int j=0;j<numContacts;j++) { btManifoldPoint& pt = contactManifold->getContactPoint(j); if (pt.getDistance()<0.f) { const btVector3& ptA = pt.getPositionWorldOnA(); const btVector3& ptB = pt.getPositionWorldOnB(); const btVector3& normalOnB = …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.