JSONLoader在node.js上有三个

我需要在我的node.js服务器上使用three.js来控制玩家的位置和碰撞(我试图制作一个video游戏)。

要在nodejs上使用三个,我已经安装了“npm install three”,这是可行的。

但是当我想调用JSONLoader时,我不能。

我的课,我补充说:

var THREE =require('three'); //or require('three/three.js'); var JSON=require('three/src/loaders/JSONLoader.js'); 

要么

 require('three'); //or require('three/three.js'); var JSON=require('three/src/loaders/JSONLoader.js'); 

同样,我有一个错误,“三不明确”,我不明白为什么?

为了解决这个错误,我把JSON代码放在three.js文件中,但是当我加载json的时候,我发现了另一个问题:

 var loader = new THREE.JSONLoader(); loader.load(__dirname + '/public/js/essai/test.dae',function ( collada ){ ... }); Error : XMLHttpRequest is not defined. 

我想,我没有正确使用,但我不明白我的错在哪里?

你能帮我吗?

非常感谢你。

你不需要社交线,即

 var JSON = require('three/src/loaders/JSONLoader.js'); 

如果你正确加载three.js ,例如

 var THREE = require('three/three.js') 

JSONLoader已经在那里,所以THREE.JSONLoader应该工作得很好。

顺便说一句 ,你得到这个错误的原因是因为JSONLoader.js的代码依赖于全局范围内的THREE对象的存在。 但是,这不是因为你的THREE对象是本地的。

谢谢你的帮助。

我replace我的代码,确实是更好的工作,我不知道为什么我有JSONLoader.js到variables。

不过,我有第二个问题。 这个代码在node.js的接收处运行到一个套接字。

 Room.prototype.create = function(data, socket, emit) { var loader = new THREE.JSONLoader(); loader.load(__dirname + '/public/js/essai/test.js',function ( collada ){ console.log(collada); }); } 

但是我的错误是:

 ReferenceError: XMLHttpRequest is not defined at THREE.JSONLoader.loadAjaxJSON (C:\wamp\www\SiteThreeOnNode\kart\node_modu les\three\three.js:9974:16) at THREE.JSONLoader.load (C:\wamp\www\SiteThreeOnNode\kart\node_modules\thre e\three.js:9968:7) at C:\wamp\www\SiteThreeOnNode\kart\routes\room.js:37:12 

search后,我已经尝试通过http://localhost:2999/js/essai/test.js来replaceurl json,如下所示: https : //github.com/mrdoob/three.js/wiki/How-to-run -things-locally我有这个URL访问我的JSON。

但XMLHttpRequest没有定义,所以它没有任何改变,我认为这是因为我试图用套接字函数做到这一点,但我不知道。

我有最后一个问题。 在节点服务器中,我加载.json文件并放入场景中以检测冲突。

节点:

  var loader = new THREE.JSONLoader(); fs.readFile(__dirname+'/public/js/essai/lobby.js', 'utf8', function (err, data) { if (err) { console.log('Error: ' + err); return; } data = JSON.parse(data); var model = loader.parse( data ); var mesh = new THREE.Mesh( model.geometry, new THREE.MeshBasicMaterial() ); mesh.scale.set(40,40,40); scene.add( mesh ); collisable.push( mesh ); }); 

为了检测碰撞:

 var collisions, i, // Maximum distance from the origin before we consider collision distance = 32, // Get the obstacles array from our world obstacles = GameEngine.getInstance().collidableMeshList;//basicScene.world.getObstacles(); // For each ray for (i = 0; i < this.rays.length; i += 1) { // We reset the raycaster to this direction this.caster.set(this.design.position, this.rays[i]); // Test if we intersect with any obstacle mesh collisions = this.caster.intersectObjects(obstacles); // And disable that direction if we do if (collisions.length > 0 && collisions[0].distance <= distance) { // Yep, this.rays[i] gives us : 0 => up, 1 => up-left, 2 => left, ... if ((i === 0 || i === 1 || i === 7) && this.direction.z === 1) { console.log("collisions"); // } else if ((i === 3 || i === 4 || i === 5) && this.direction.z === -1) { console.log("collisions"); } if ((i === 1 || i === 2 || i === 3) && this.direction.x === 1) { console.log("collisions"); } else if ((i === 5 || i === 6 || i === 7) && this.direction.x === -1) { console.log("collisions"); } } } 

当我在客户端尝试碰撞时,它工作正常,但在服务器上,他没有检测到冲突。 所以,我已经尝试在我的客户端加载json文件来查看加载是否正确。

当我在客户端加载这样的情况时,场景是可以的:

 loader.load( "essai/lobby.js", function( geometry ) { mesh = new THREE.Mesh( geometry, new THREE.MeshNormalMaterial() ); mesh.scale.set( 40, 40, 40 ); scene.add(mesh); animate(); }); 

而当我在客户端载入这样的内容时,这是不正确的:

 $.getJSON("essai/lobby.js", function(data) { var model = loader.parse( data ); var mesh = new THREE.Mesh( model.geometry, new THREE.MeshBasicMaterial() ); mesh.scale.set(40,40,40); scene.add(mesh); animate(); }); 

没有错误,但没有出现。

所以我认为对于服务器端来说是一样的,为什么碰撞永远不会被检测到。

在服务器端,我不使用animate(),因为我认为没有必要。 而计算器取代我的车没关系。

所以我想可能是加载程序不能正确加载网格,或者我不能在客户端上进行检测冲突。 你怎么看?

谢谢。

为了检测客户端上的冲突我使用:

 this.rays = [ new THREE.Vector3(0, 0, 1), //up new THREE.Vector3(1, 0, 1), //up left new THREE.Vector3(1, 0, 0), //left new THREE.Vector3(1, 0, -1), // down left new THREE.Vector3(0, 0, -1), //down new THREE.Vector3(-1, 0, -1), // down right new THREE.Vector3(-1, 0, 0), //rigth new THREE.Vector3(-1, 0, 1) //up right ]; this.caster = new THREE.Raycaster(); this.direction = new THREE.Vector3(0, 0, 0); 

当我起来,我设置的方向:this.direction.set(0,0,1); 当我倒下,我设置方向:this.direction.set(0,0,-1); …