5

これについての結論を得るためにしばらく探し回っていますが、これに対する解決策を見つけることができないようです。

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 と同じパラメーターに従います。どの関数がどのタイプのオブジェクトを返すかをコメントでマークしました。

4

2 に答える 2

1

Ok。まず第一に、高速で作業するために使用しないでください。__dirtyPositionと を使用することをお勧めしsetLinearVelocityますgetLinearVelocity

level1.update = function(){
    this.scene.simulate();

    // Conditions...

    var oldVector = this.player.getLinearVelocity(); // Vector of velocity the player already has
    var playerVec3 = new THREE.Vector3(oldVector.x + .5 * this.xvelocity, oldVector.y, oldVector.z);
    this.player.setLinearVelocity(playerVec3); // We use an updated vector to redefine its velocity
}

第二に、この問題が発生する理由は、おそらく__dirtyRotationフラグを に設定していないためですtrue。回転をリセットしたい小さな領域がありました。それ以外は、あなたが投稿したものから何も間違っているとは思いません。

于 2015-11-04T01:31:16.323 に答える
0

1 つのキューブ キャラクターの動きだけobject.setLinearVelocity(vector)を使用するには、 を使用する代わりにobject.__dirtyPosition

私は__dirtyPosition一般的に物理効果のほとんどを無効にすると思います

于 2014-11-24T03:16:36.967 に答える