这与Three.js + Socket IO + CANNON.js有关。我的SERVER上有一个CANNON.RigidBody对象,我无法按原样发送。所以我改变它:
// Create a sphere
var mass = 5,
radius = 1.8;
var sphereShape = new CANNON.Sphere(radius);
var physicsMaterial = new CANNON.Material("slipperyMaterial");
var sphereBody = new CANNON.RigidBody(mass, sphereShape, physicsMaterial);
sphereBody.position.set(0, 10, 0);
sphereBody.linearDamping = 0.9;
cannonWorld.add(sphereBody);
cannonEntities[(numBodies++).toString()] = sphereBody;
player = {
type: "player",
data: {
id:((numBodies++).toString()),
position: sphereBody.position,
quaternion: sphereBody.quaternion,
velocity: sphereBody.velocity,
radius:radius,
mass:mass
} }
并将其发送给我的客户......
broadcastJsonEvent(JSON.stringify(player))
在我的CLIENT中,我将这个“播放器”对象传递给我的控件,通常不是播放器,而是传递CANNON.RigidBody对象。
controls = new PointerLockControls(camera, player);
scene.add(controls.getObject());
因为我无法发送一个完整的对象,即一个CANNON.RigidBody,我将它作为该播放器对象发送,而在PointerLockControls中,最后一行看起来像这样......这就是全部失败的地方。
cannonBody.position.copy(yawObject.position);
现在我的播放器对象没有复制方法。我能做什么? 请帮忙。这是我试过的。记得cannonBody =玩家!!即使我得到了 复制方法它仍然无效。
var copyBody = new CANNON.Vec3(cannonBody.position.x,cannonBody.position.y,cannonBody.position.z);
cannonBody = $.extend(cannonBody,new CANNON.RigidBody(cannonBody.mass,new CANNON.Sphere(1.8),new CANNON.Material("slipperyMaterial")));
cannonBody.position = $.extend(copyBody);
cannonBody.position.copy(yawObject.position);
即使我得到了 复制方法它仍然无法正常工作。 :(
答案 0 :(得分:1)
假设您只需要执行复制操作,您可以这样做:
CANNON.Vec3.prototype.copy.call(cannonBody.position,yawObject.position);
这行代码使用CANNON.Vec3
中的复制方法。您可能需要查找Function.prototype.call以了解其工作原理。请注意,您需要在客户端上加载Cannon.js才能执行此操作。
根据代码的其余部分,您可以方便地在客户端上创建本地CANNON.RigidBody
实例。每当从服务器获得更新时,您都可以使用新状态更新此正文。