2013-05-23 4 views
4

Это связано с Three.js + Socket IO + CANNON.js. У меня есть объект CANNON.RigidBody на моем сервере SERVER, который я не могу отправить, как есть. Таким образом, я преобразовать его так:Преобразование объекта javaScript в другой тип объекта

// 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)) 

В моем КЛИЕНТА я пройти этот «игрок» объект в мой контроль, Обычно вместо одного игрока, будет передавать объект 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

Что вы продлеваете? 'cannonBody.position = $ .extend (copyBody);' –

+0

Я расширяю Vector3 ... x, y, z. Таким образом, в основном на моем сервере у меня есть объект CANNON.RigidBody, который я беру некоторые свойства и помещаю его в объект «player» и отправляю его клиенту. Но теперь на клиенте мне нужен тип CANNON.RigidBody origianl, а объект «player» имеет объект типа, а не CANNON.RigidBody. поэтому я пытаюсь преобразовать его. – Thor88

ответ

0

Предполагая, что вы только нужно сделать операцию копирования, вы можете сделать это:

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

Эта строка кода использует метод копирования из CANNON.Vec3 Вы можете посмотреть Function.prototype.call, чтобы понять, как это. Обратите внимание, что для этого вам нужно загрузить Cannon.js на клиенте.

В зависимости от того, что делает остальная часть вашего кода, вам может быть удобно сделать локальный экземпляр CANNON.RigidBody на клиенте. обновляйте это тело новыми состояниями, когда вы получаете обновления с сервера.

+0

Спасибо, schteppe, который работал (я новичок в js). Оба решения. Любите свою работу, держите ее в руках. – Thor88