2

我在使用Three.js加载纹理和应用于网格立方体时遇到问题。在本地,我知道有一些问题,比如在带有 wamp (localhost) 的 apache 服务器上运行 html 文件。

但是当我使用Node.js和 socket.io 时,如何解决呢?首先,要加载three.js,我必须放置脚本src 的网址,而不是本地的“three.js”:

http://threejs.org/build/three.min.js

它有效,但质地如何?

纹理的本地或互联网地址都不起作用......

 //var mapUrl = "mercury.jpg"; 
    var mapUrl = "http://threejs.org/examples/textures/cube/skybox/px.jpg"; 
    var map = THREE.ImageUtils.loadTexture(mapUrl); // its not working with both

如果我将代码放在运行 Node.js(如 Cloud9)的 Web 服务器上,如何修复它?(与 Node.js 的本地问题相同)。

感谢您的关注。


这是我的完整代码。

服务器

var http    =   require('http');
var fs      =   require('fs');

// Creation du serveur
var app = http.createServer(function (req, res) {
    // On lit notre fichier app.html
    fs.readFile('gl.html', 'utf-8', function(error, content) {
        res.writeHead(200, {'Content-Type' : 'text/html'});
        res.end(content);
    });

  });

var io = require("socket.io");
io = io.listen(app);

io.sockets.on('connection', function (socket) {

  socket.on('send', function () {
    socket.broadcast.emit('rec');

  }); // send

});  // connection


app.listen(8080);

客户端 (gl.html)

<!DOCTYPE html>
<html>
<head>
<title>Welcome to WebGL</title>
</head>
<body onLoad="onLoad();" style="">
<h1>Webgl</h1>
<div id="container" style="width:95%; height:80%; position:absolute;"></div>


<script type="text/javascript" src="http://threejs.org/build/three.min.js"></script>
<!--<script type="text/javascript" src="Three.js"></script> not working-->
<script type="text/javascript" src="/socket.io/socket.io.js"></script>

<script>
    var socket = io.connect();

    var renderer = null, 
        scene = null, 
        camera = null,
        cube = null,
        animating = false;

    function onLoad()
    {
        // Grab our container div
        var container = document.getElementById("container");

        // Create the Three.js renderer, add it to our div
        renderer = new THREE.WebGLRenderer( { antialias: true } );
        renderer.setSize(container.offsetWidth, container.offsetHeight);
        container.appendChild( renderer.domElement );

        // Create a new Three.js scene
        scene = new THREE.Scene();

        // Put in a camera
        camera = new THREE.PerspectiveCamera( 45, container.offsetWidth / container.offsetHeight, 1, 4000 );
        camera.position.set( 0, 0, 3 );

        // Create a directional light to show off the object
        var light = new THREE.DirectionalLight( 0xffffff, 1.5);
        light.position.set(0, 0, 1);
        scene.add( light );






        // Create a shaded, texture-mapped cube and add it to the scene
        // First, create the texture map

   //   var mapUrl = "mercury.jpg";
  var mapUrl = "http://threejs.org/examples/textures/cube/skybox/px.jpg";
        var map = THREE.ImageUtils.loadTexture(mapUrl); // not working with both !!!






        // Now, create a Phong material to show shading; pass in the map
        var material = new THREE.MeshPhongMaterial({ map: map });

        // Create the cube geometry
        var geometry = new THREE.CubeGeometry(1, 1, 1);

        // And put the geometry and material together into a mesh
        cube = new THREE.Mesh(geometry, material);

        // Turn it toward the scene, or we won't see the cube shape!

       // cube.rotation.x = Math.PI / 5;
        cube.rotation.x = 0.5;
        //cube.rotation.y = Math.PI / 5;

        // Add the cube to our scene
        scene.add( cube );

        // Add a mouse up handler to toggle the animation
        addMouseHandler();

        // Run our render loop
        run();


    }

    function run()
    {
        // Render the scene
        renderer.render( scene, camera );

        // Spin the cube for next frame
        if (animating)
        {
            cube.rotation.y -= 0.01;
            //cube.rotation.x += 0.05;
        }

        // Ask for another frame
        //requestAnimationFrame(run);
    setTimeout(run, 1000/60);

    }

    function addMouseHandler()
    {
        var dom = renderer.domElement;

        dom.addEventListener( 'mouseup', onMouseUp, false);
    }

    function onMouseUp  (event)
    {
        event.preventDefault();

        animating = !animating;

        socket.emit('send'); 

    }

    socket.on('rec', function () {

      animating = !animating;

  });

    </script>
    </body>
</html>
4

2 回答 2

3

事实上,我只需要使用express,将所有文件放在public文件夹中并命名 client index.html

现在它起作用了!如何关闭我的问题?

这是服务器的简单代码:

var express = require('express');
var app = express();

app.use(express.static(__dirname + '/public'));

app.listen(8080);
于 2013-08-12T15:59:18.847 回答
0

您在使用 CORS 时遇到了麻烦。CORS 声明纹理需要来自相同的基本 url,或者需要在服务器端进行特殊处理。这很容易通过代理解决。如果您已经在使用服务器,那么配置它来处理代理请求应该不会太难。

于 2013-08-12T09:46:10.287 回答