1

我正在将 Physijs 脚本用于引力等物理学。我想使用脚本中的 Raycaster 移动场景中的对象THREE.js。我的问题是 Raycaster 只移动声明如下的对象(简单框):

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

但是在这里物理学不起作用。仅当我将其声明为:

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

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

这两者之间的区别在于,第一个它只是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);
        }
4

1 回答 1

0

解释

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

现在,当您尝试Physijs.BoxMesh使用其位置和旋转场直接移动时,它会立即被物理更新覆盖,该更新从.simulate场景对象中的方法开始。调用时,它会委托工作人员计算与场景中的物理配置相对应的新位置和旋转。完成后,新值将传输回主线程并自动更新,因此您无需执行任何操作。在某些情况下,这可能是一个问题(比如这个!)。幸运的是,开发人员在Physijs.Mesh:.__dirtyPosition.__dirtyRotation标志中包含了 2 个特殊字段。以下是您如何使用它们:

// 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.MeshPhysijs 的一个包装器,在它的一个子代正确修改之前没有物理属性。

此外,在使用 Physijs 网格时,始终在对象中设置.__dirtyPosition.__dirtyRotation属性以分别直接修改位置或旋转。看看上面的代码片段和这里

于 2016-09-23T21:31:44.063 回答