これについての結論を得るためにしばらく探し回っていますが、これに対する解決策を見つけることができないようです。
THREE.JS と PHYSI.JS を使用して、簡単なプラットフォーム アクションを動作させる簡単なシーンを作成しようとしています。質量が 0 のフラット ボックスが 1 つあり、ワークとして機能し、ボックス メッシュがキャラクターとして機能します。Physijs のサイトは、__dirtyPosition
変数をに設定することを示唆しているようtrue
です。ここでの問題はこれです: __dirtyPosition は物理学を台無しにします。キャラクターをレベルの端から離しても、彼は落ちません。実際、衝突するとワールド キューブの途中で停止するように見えます。
を適用せずに位置を更新しようとする__dirtyPosition
と、立方体が元の位置に戻されます。まるで小さな発作を起こしているかのように少し震え、それだけです。物理と動きの両方が使えたらいいのですが、衝突だけにPhysiを使うのはやり過ぎ感があります。ここに私が今それを行う方法がありますが、明らかに間違った方法です:
level1.generateScene = function()
{
level1.camera = new THREE.PerspectiveCamera(75, this.cameraWidth / this.cameraHeight, 0.1, 1000);
level1.material = new AdapterEngine.createBasicMaterial({color: 0x00ff00}); //Threejs basic material
level1.ground = new AdapterEngine.createBoxMesh(5, 0.1, 5, level1.material, 0); //Physijs box mesh with a mass of 0
level1.playerMaterial = new AdapterEngine.createBasicMaterial({color:0x0000ff}, 0.6, 0.3); //Physijs basic material with a fruction of 0.6, and a restitution of 0.3
level1.player = new AdapterEngine.createBoxMesh(0.3, 0.3, 0.3, level1.playerMaterial, 0.1); //Physijs box mesh with a mass of 0.1
level1.player.y = 50; //yes, it should fall down for a bit.
level1.scene.add(level1.ground);
level1.scene.add(level1.player);
level1.camera.position.z = 5;
level1.camera.position.y = 1.4;
level1.activeCamera = level1.camera;
level1.controls.init();
}
これは、キャラクターと世界の両方を持つ「レベル」が作成される関数です。レベル オブジェクトにも含まれているのは、requestAnimationframe 関数が呼び出された後、レンダラーがレンダリングする直前に実行される更新関数です。
level1.update = function()
{
this.scene.simulate();
level1.player.__dirtyPosition = true;
if(level1.controls.isKeyDown('RIGHT')) level1.xvelocity = 0.1;
else if(level1.controls.isKeyDown('LEFT')) level1.xvelocity = -0.1;
else if(level1.controls.isKeyUp('RIGHT') || level1.controls.isKeyUp('LEFT')) level1.xvelocity = 0;
level1.player.rotation.x = 0;
level1.player.rotation.y = 0;
level1.player.rotation.z = 0;
level1.player.position.x = level1.player.position.x + 0.5*level1.xvelocity;
}
似たような質問が出てきたことは知っていますが、実際に満足のいく答えが得られたものはありません。どうすればいいのか、どの機能を使えばいいのか、本当に困っています。
編集 この部分を追加するのを忘れていました: ゲームとライブラリ間のブリッジとして機能する THREE.js オブジェクトまたは PHYSI.js オブジェクトを取得する必要があるかどうかを判断する小さなフレームワークを使用しています。これらは、THREE.js および PHYSI.js と同じパラメーターに従います。どの関数がどのタイプのオブジェクトを返すかをコメントでマークしました。