Это должно быть просто, но объединение частей кажется сложной задачей. У меня очень простой локальный сервер node.js, а в клиенте index.html
я использую три. js для загрузки и рендеринга файла 3D-модели (AMF в этом примере, почти точно следуя руководству).
Однако я не могу получить файл для отправки клиенту по запросу в моем app.js
. Соответствующий код ниже:
index. html:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>Index.html title</title>
</head>
<body>
<script src="/socket.io/socket.io.js"></script>
<script src="//threejs.org/build/three.js"></script>
<script src="//threejs.org/examples/js/loaders/AMFLoader.js"></script>
<script src="//threejs.org/examples/js/controls/OrbitControls.js"></script>
<script>
alert("asdf");
var socket = io();
var camera, scene, renderer;
init();
function init() {
scene = new THREE.Scene();
scene.add( new THREE.AmbientLight( 0x999999 ) );
camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 500 );
// Z is up for objects intended to be 3D printed.
camera.up.set( 0, 0, 1 );
camera.position.set( 0, -9, 6 );
camera.add( new THREE.PointLight( 0xffffff, 0.8 ) );
scene.add( camera );
var grid = new THREE.GridHelper( 25, 1.0, 0xffffff, 0x555555 );
grid.rotateOnAxis( new THREE.Vector3( 1, 0, 0 ), 90 * ( Math.PI/180 ) );
scene.add( grid );
renderer = new THREE.WebGLRenderer( { antialias: true } );
renderer.setClearColor( 0x999999 );
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
/* PROBLEM AREA BELOW: */
var loader = new THREE.AMFLoader();
loader.load('/rook.amf', function ( amfobject ) {
scene.add( amfobject );
render();
} );
/* When I use res.sendFile, I get an error 'file not found' on client side */
/* When I use res.write(), I get no result and don't see anything, but no error. */
var controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.addEventListener( 'change', render );
controls.target.set( 0, 1.2, 2 );
controls.update();
window.addEventListener( 'resize', onWindowResize, false );
alert("end of init")
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
render();
}
function render() {
renderer.render( scene, camera );
}
</script>
</body>
</html>
Вот мой app.js
:
var express = require('express');
var app = express();
var http = require('http').createServer(app);
var io = require('socket.io')(http);
var THREE = require('three');
var fs = require('fs');
var path = require('path');
var publicPath = path.resolve(__dirname);
console.log("publicPath: "+String(publicPath))
console.log("__dirname: "+String(__dirname))
app.use(express.static('/'));
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
app.get('/rook.amf', function(req, res) {
console.log('test1 :: '+String(__dirname + '\\rook.amf'))
res.write(__dirname + '\\rook.amf'); // I've tried both res.sendFile (error), and res.write (no 3D model loaded, but no error)
});
io.on('connection', (socket) => {
console.log('a user connected');
});
http.listen(3000, () => {
console.log('listening on *:3000');
});
И да, я трипнул-чекнул эту ладью. amf там, где он есть. Для справки, когда я пытаюсь вызвать res.sendFile
с теми же аргументами, я получаю:
THREE.AMFLoader: Error loading AMF - no AMF document found.
В основном мне нужен способ отправить файлы 3D-модели этому клиенту, чтобы они могли его отобразить. в браузере на стороне клиента код, который я напишу позже.