Javascript 3D在其他对象中旋转独立对象

时间:2015-05-10 01:49:20

标签: javascript three.js

在我的程序中,我有四个Physijs.BoxMesh(...),它们都被添加到一个独立的对象中。我想旋转四个物理盒,但是一旦它们都被添加到第五个物体,它们就不会旋转。有没有办法旋转包含的对象?

编辑:这是我的所有代码:

<body></body>
<script src="http://gamingJS.com/Three.js"></script>
<script src="http://gamingJS.com/physi.js"></script>
<script src="http://gamingJS.com/ChromeFixes.js"></script>

<script>
  // Physics settings
  Physijs.scripts.ammo = 'http://gamingJS.com/ammo.js';
  Physijs.scripts.worker = 'http://gamingJS.com/physijs_worker.js';

  // This is where stuff in our game will happen:
  var scene = new Physijs.Scene({ fixedTimeStep: 2 / 60 });
  scene.setGravity(new THREE.Vector3( 0, -100, 0 ));

  // This is what sees the stuff:
  var width = window.innerWidth,
      height = window.innerHeight,
      aspect_ratio = width / height;
  var camera = new THREE.PerspectiveCamera(75, aspect_ratio, 1, 10000);
  // var camera = new THREE.OrthographicCamera(
  //   -width/2, width/2, height/2, -height/2, 1, 10000
  // );

  camera.position.z = 500;
  scene.add(camera);

  // This will draw what the camera sees onto the screen:
  var renderer = new THREE.CanvasRenderer();
  renderer.setSize(window.innerWidth, window.innerHeight);
  document.body.appendChild(renderer.domElement);
  document.body.style.backgroundColor = '#ffffff';

  // ******** START CODING ON THE NEXT LINE ********

  var m1 = new Physijs.BoxMesh(new THREE.CubeGeometry(20, 150, 20), new THREE.MeshBasicMaterial({color:0x000000}));
  var m2 = new Physijs.BoxMesh(new THREE.CubeGeometry(20, 150, 20), new THREE.MeshBasicMaterial({color:0x000000}));
  var m3 = new Physijs.BoxMesh(new THREE.CubeGeometry(20, 150, 20), new THREE.MeshBasicMaterial({color:0x000000}));
  var m4 = new Physijs.BoxMesh(new THREE.CubeGeometry(20, 150, 20), new THREE.MeshBasicMaterial({color:0x000000}));
  var ground = new Physijs.BoxMesh(new THREE.CubeGeometry(5e2, 10, 5e2), new THREE.MeshBasicMaterial({color:0x0000ff}), 0);  

  var tars = new Physijs.BoxMesh(new THREE.CubeGeometry(1, 1, 1), new THREE.MeshBasicMaterial());

  m1.__dirtyPosition = true;
  m1.position.x = -30;
  m2.__dirtyPosition = true;
  m2.position.x = -10;
  m3.__dirtyPosition = true;
  m3.position.x = 10;
  m4.__dirtyPosition = true;
  m4.position.x = 30;
  ground.__dirtyPosition = true;
  ground.position.y = -300;

  tars.add(m1);
  tars.add(m2);
  tars.add(m3);
  tars.add(m4);

  scene.add(tars); // If I add Tars the Avatar, below at the document add listener, m1.setAngularVelocity(...) will not actually rotate the m1 block

  scene.add(ground);

  document.addEventListener('keydown', function(event) {
    switch(event.keyCode) {
      case 13:
        m1.setAngularVelocity(new THREE.Vector3(1, 0, 0));
        break;

      case 100:
        m2.setAngularVelocity(new THREE.Vector3(1, 0, 0));
        break;

      case 101:
        m3.setAngularVelocity(new THREE.Vector3(1, 0, 0));
        break;

      case 102:
        m4.setAngularVelocity(new THREE.Vector3(1, 0, 0));
        break;
    }
  });

  // Animate motion in the game
  function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
  }
  animate();

  // Run physics
  function gameStep() {
    scene.simulate();
    // Update physics 60 times a second so that motion is smooth
    setTimeout(gameStep, 1000/60);
  }
  gameStep();
</script>

1 个答案:

答案 0 :(得分:0)

这不起作用,因为Physijs网格具有无法从父Object3D继承的属性。例如,Object3D不能有角动量。

获得所需行为的正确方法是使用Physijs constraints