最後に 1 つ質問があります。ノード サーバーで .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); ...