0

こんにちは、お時間をいただきありがとうございます。オブジェクトを動かしながら同時に回転させようとしています。両方のアクションを実行している間、オブジェクトは不規則に動きます。回転が何らかの方法で軸を変更することを読みました。本当?これがコードです。ワールド軸とオブジェクト軸の両方を使用して回転しようとしましたが、同じ問題が発生しました。

   var rotObjectMatrix;
   function rotateAroundObjectAxis(object, axis, radians) {
      rotObjectMatrix = new THREE.Matrix4();
      rotObjectMatrix.makeRotationAxis(axis.normalize(), radians);

      object.matrix.multiply(rotObjectMatrix);

      object.rotation.setFromRotationMatrix(object.matrix);
  }


var rotWorldMatrix;
     // Rotate an object around an arbitrary axis in world space       
    function rotateAroundWorldAxis(object, axis, radians) {
       rotWorldMatrix = new THREE.Matrix4();
       rotWorldMatrix.makeRotationAxis(axis.normalize(), radians);
       rotWorldMatrix.multiply(object.matrix);               

       object.matrix = rotWorldMatrix;

       object.rotation.setFromRotationMatrix(object.matrix);
  }

          function spriteAI2() {
            //var ranTen = Math.floor((Math.random()*7)+2);
            var xAxis = new THREE.Vector3(1,0,0);
            var yAxis = new THREE.Vector3(0,1,0);
            var zAxis = new THREE.Vector3(0,0,1);
            rotateAroundObjectAxis(meshSprite, zAxis, Math.PI / 180);
            if (meshSprite.position.x > 30 && meshSprite.position.x <= 450) { 
            meshSprite.translateX( -6 );
            } else if (meshSprite.position.y > 30 && meshSprite.position.y <= 250) {
            meshSprite.translateY( -6);
            } else if (meshSprite.position.z > 30 && meshSprite.position.z <= 350) {
            meshSprite.translateZ( -6 );
            } else if (meshSprite.position.x < -30 && meshSprite.position.x >= -450) {
            meshSprite.translateX( 6 );
            } else if (meshSprite.position.y < -30 && meshSprite.position.y >= -250) {
            meshSprite.translateY( 6 );
            } else if (meshSprite.position.z < -30 && meshSprite.position.z >= -350) {
            meshSprite.translateZ( 6 );
            } else if (meshSprite.position.x < 31 && meshSprite.position.y < 31 && meshSprite.position.z < 31 && meshSprite.position.x > -31 && meshSprite.position.y > -31 && meshSprite.position.z > -31) { 
            var locX = Math.floor((Math.random()*450)+1);
            locX *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
            var locY = Math.floor((Math.random()*250)+1);
            locY *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
            var locZ = Math.floor((Math.random()*350)+1);
            locZ *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
            scene.remove(meshSprite);
            //texture.dispose();
            c2ImgMaterial.dispose();
            meshSprite.position.set( locX, locY, locZ );
            scene.add( meshSprite );
            //c2Sprite.clone;
            }
        }   
4

1 に答える 1

0

問題の原因を突き止めました。three.js では、オブジェクトをローカルまたはグローバルに移動できるようです。私の場合、ローカルバージョンを使用していました。

            meshSprite.translateX(-6); // Local

            var delta = clock.getDelta(); // Global
            var moveDistance = 125 * delta; // 200 pixels per second
            meshSprite.position.x += moveDistance;

グローバル形式の動きに切り替えた後、回転時に競合はありません。より詳しい説明は、次の URL にあります。 http://stemkoski.github.io/Three.js/Mesh-Movement.html

于 2013-09-28T04:52:55.790 に答える