将javaScript对象转换为不同的对象类型

时间:2013-05-23 20:15:09

标签: javascript socket.io three.js cannon.js

这与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);

即使我得到了 复制方法它仍然无法正常工作。 :(

1 个答案:

答案 0 :(得分:1)

假设您只需要执行复制操作,您可以这样做:

CANNON.Vec3.prototype.copy.call(cannonBody.position,yawObject.position);

这行代码使用CANNON.Vec3中的复制方法。您可能需要查找Function.prototype.call以了解其工作原理。请注意,您需要在客户端上加载Cannon.js才能执行此操作。

根据代码的其余部分,您可以方便地在客户端上创建本地CANNON.RigidBody实例。每当从服务器获得更新时,您都可以使用新状态更新此正文。