Raycaster不会移动BoxMesh对象

时间:2016-01-02 19:15:04

标签: javascript three.js physijs

我正在使用Physijs脚本进行像万有引力这样的物理学。 我想用THREE.js脚本中的Raycaster在场景中移动对象。 我的问题是Raycaster只移动声明的对象(简单框):

var box = new Physijs.Mesh(cubeGeomtery.clone(), createMaterial);

但这里的物理不起作用。它只有在我声明它时才有效:

var create = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);

但是Raycaster / moving在这里不起作用。

这两者之间的区别在于,第一个是Mesh,第二个是BoxMesh

有谁知道为什么这不起作用?我需要BoxMesh来使用重力和其他物理。

添加多维数据集的代码

function addCube()
        {
            controls.enable = false;
            var cubeGeomtery = new THREE.CubeGeometry(85, 85, 85);
            var createTexture = new THREE.ImageUtils.loadTexture("images/rocks.jpg");
            var createMaterial = new THREE.MeshBasicMaterial({ map: createTexture });
            var box = new Physijs.BoxMesh(cubeGeomtery.clone(), createMaterial);
            box.castShadow = true;
            box.receiveShadow = true;
            box.position.set(0, 300, 0);
            objects.push(box);
            scene.add(box);
        }

1 个答案:

答案 0 :(得分:0)

解释

在Physijs中,所有原始形状(例如Physijs.BoxMesh)都继承自Physijs.MeshTHREE.Mesh继承自Physijs.Mesh。在._physijs构造函数中,有一个小的内部对象:null字段。并且,在该对象中,有一个shape type声明,默认情况下设置为Physijs.Scene。该字段必须由其中一个孩子重新分配。如果没有,当形状传递到场景时,Physijs工作者脚本不知道要生成什么样的形状并简单地中止。由于THREE.Scene继承自Physijs.BoxMesh,因此场景在内部保留了网格的引用,这意味着来自THREE.js的所有方法都可以工作(例如,光线投射)。但是,它从未注册为物理对象,因为它没有类型

现在,当您尝试使用其位置和旋转字段直接移动.simulate时,它会立即被物理更新覆盖,该更新以场景对象中的Physijs.Mesh方法开头。调用时,它会委托工作人员计算与场景中物理配置相对应的新位置和旋转。完成后,新值将传输回主线程并自动更新,这样您就不必做任何事情。在某些情况下这可能是个问题(比如这个!)。幸运的是,开发人员在.__dirtyPosition中包含了2个特殊字段:.__dirtyRotation// Place box already in scene somewhere else box.position.set(10, 10, 10); // Set .__dirtyPosition to true to override physics update box.__dirtyPosition = true; // Rotate box ourselves box.rotation.set(0, Math.PI, 0); box.__dirtyRotation = true; 标记。以下是您如何使用它们:

false

通过.simulate方法再次更新场景后,标记会重置为Physijs.Mesh

结论

自己创建THREE.Mesh基本没用,改为使用其中一个原语。它只是Physijs .__dirtyPosition的包装器,在其子节点正确修改之前没有物理属性。

此外,使用Physijs网格时,始终分别设置对象中的.__dirtyRotationTIniFile属性以直接修改位置或旋转。请查看上面的代码段和here