我正在使用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);
}
答案 0 :(得分:0)
在Physijs中,所有原始形状(例如Physijs.BoxMesh
)都继承自Physijs.Mesh
,THREE.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网格时,始终分别设置对象中的.__dirtyRotation
或TIniFile
属性以直接修改位置或旋转。请查看上面的代码段和here。