我需要在node.js服务器上使用three.js来控制玩家的位置和碰撞(我尝试制作视频游戏)。
要在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.
我想,我没有正确使用,但我不知道我的错在哪里?
你能帮帮我吗?
非常感谢。
答案 0 :(得分:1)
你不需要社交线,即
var JSON = require('three/src/loaders/JSONLoader.js');
如果您正确加载three.js
,例如
var THREE = require('three/three.js')
JSONLoader
已经存在,因此THREE.JSONLoader
应该可以正常工作。
BTW ,您收到此错误的原因是JSONLoader.js
的代码取决于全局范围内THREE
对象的存在。但是,它并不存在,因为您的THREE
对象是本地的。
答案 1 :(得分:0)
谢谢你的帮助。
我替换了我的代码,确实它的效果更好,我不知道为什么我把JSONLoader.js变成了变量。
然而,我有第二个问题。此代码在接收时运行到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
搜索完成后,我尝试按http://localhost:2999/js/essai/test.js
替换url json,如下所示:https://github.com/mrdoob/three.js/wiki/How-to-run-things-locally
我可以通过这个网址访问我的json。
但XMLHttpRequest没有定义,所以它什么都没改变,我认为这是因为我尝试使用套接字函数来做这件事,但我不确定。
答案 2 :(得分:0)
我有最后一个问题。 在节点服务器中,我加载.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(),因为我认为没有必要。 并且取消我的车的计算是可以的。
所以我认为加载器可能没有正确加载网格,或者我不能像客户端那样进行检测冲突。 你觉得怎么样?
THX。
要检测客户端上的冲突,请使用:
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); ......