Javascript 嵌入三维模型查看器

Javascript 嵌入三维模型查看器,javascript,html,three.js,embed,Javascript,Html,Three.js,Embed,我正在尝试实现3D模型查看器,但是我希望将其嵌入到已设置的div中,而不是像这样创建一个新的div。因此,我像这样编辑了代码,但它不起作用。任何帮助都将不胜感激 <script> // This is where our model viewer code goes. var container; var camera, scene, renderer; var mouseX = 0, mouseY = 0; var windowHalfX

我正在尝试实现3D模型查看器,但是我希望将其嵌入到已设置的div中,而不是像这样创建一个新的div。因此,我像这样编辑了代码,但它不起作用。任何帮助都将不胜感激

<script>
    // This is where our model viewer code goes.
    var container;
    var camera, scene, renderer;
    var mouseX = 0, mouseY = 0;

    var windowHalfX = document.getElementById('viewer').clientHeight / 2;
    var windowHalfY = document.getElementById('viewer').clientHeight / 2;

    init();
    animate();

    // Initialize
    function init() {
      // This <div> will host the canvas for our scene.
      container = document.getElementById( 'viewer' );
      //document.body.appendChild( container );

      // You can adjust the cameras distance and set the FOV to something
      // different than 45°. The last two values set the clippling plane.
      camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
      camera.position.z = 100;

      // These variables set the camera behaviour and sensitivity.
      controls = new THREE.TrackballControls( camera );
      controls.rotateSpeed = 5.0;
      controls.zoomSpeed = 5;
      controls.panSpeed = 2;
      controls.noZoom = false;
      controls.noPan = false;
      controls.staticMoving = true;
      controls.dynamicDampingFactor = 0.3;

      // This is the scene we will add all objects to.
      scene = new THREE.Scene();

      // You can set the color of the ambient light to any value.
      // I have chose a completely white light because I want to paint
      // all the shading into my texture. You propably want something darker.
      var ambient = new THREE.AmbientLight( 0xffffff );
      scene.add( ambient );

      // Uncomment these lines to create a simple directional light.
      // var directionalLight = new THREE.DirectionalLight( 0xffeedd );
      // directionalLight.position.set( 0, 0, 1 ).normalize();
      // scene.add( directionalLight );

      // Texture Loading
      var manager = new THREE.LoadingManager();
      manager.onProgress = function ( item, loaded, total ) {
        console.log( item, loaded, total );
      };
      var texture = new THREE.Texture();
      var loader = new THREE.ImageLoader( manager );

      // You can set the texture properties in this function. 
      // The string has to be the path to your texture file.

      loader.load( 'img/sickletexture.png', function ( image ) {
        texture.image = image;
        texture.needsUpdate = true;
        // I wanted a nearest neighbour filtering for my low-poly character,
        // so that every pixel is crips and sharp. You can delete this lines
        // if have a larger texture and want a smooth linear filter.
        texture.magFilter = THREE.NearestFilter;
        texture.minFilter = THREE.NearestMipMapLinearFilter;
      } );

      // OBJ Loading
      var loader = new THREE.OBJLoader( manager );

      // As soon as the OBJ has been loaded this function looks for a mesh
      // inside the data and applies the texture to it.
      loader.load( 'obj/sickle.obj', function ( event ) {
        var object = event;
        object.traverse( function ( child ) {
          if ( child instanceof THREE.Mesh ) {
            child.material.map = texture;
          }
        } );

        // My initial model was too small, so I scaled it upwards.
        object.scale = new THREE.Vector3( 2, 2, 2 );

        // You can change the position of the object, so that it is not
        // centered in the view and leaves some space for overlay text.
        object.position.y -= 2.5;
        scene.add( object );
      });

      // We set the renderer to the size of the window and
      // append a canvas to our HTML page.
      renderer = new THREE.WebGLRenderer();
      renderer.setSize( document.getElementById('viewer').innerWidth, document.getElementById('viewer').innerHeight );
      container.appendChild( renderer.domElement );
    }

    // The Loop 
    function animate() {
      // This function calls itself on every frame. You can for example change
      // the objects rotation on every call to create a turntable animation.
      requestAnimationFrame( animate );

      // On every frame we need to calculate the new camera position
      // and have it look exactly at the center of our scene.
      controls.update();
      camera.lookAt(scene.position);
      renderer.render(scene, camera);
    }

  </script>

//这就是我们的模型查看器代码所在。
var容器;
摄像机、场景、渲染器;
var mouseX=0,mouseY=0;
var windowHalfX=document.getElementById('viewer').clientHeight/2;
var windowHalfY=document.getElementById('viewer').clientHeight/2;
init();
制作动画();
//初始化
函数init(){
//这将为我们的场景主持画布。
container=document.getElementById('viewer');
//文件.正文.附件(容器);
//您可以调整摄影机距离并将FOV设置为某个值
//不同于45°。最后两个值设置剪辑平面。
摄像头=新的三个透视摄像头(45,window.innerWidth/window.innerHeight,12000);
摄像机位置z=100;
//这些变量设置相机行为和灵敏度。
控件=新的三个轨迹球控件(摄像头);
controls.rotateSpeed=5.0;
controls.zoomSpeed=5;
控制。速度=2;
controls.noZoom=false;
controls.noPan=false;
controls.staticMoving=true;
controls.dynamicDampingFactor=0.3;
//这是我们将向其中添加所有对象的场景。
场景=新的三个。场景();
//可以将环境光的颜色设置为任何值。
//我选择了一个完全白色的灯光,因为我想画画
//我的纹理中的所有阴影。你可能想要更暗的东西。
var环境光=新的三个环境光(0xffffff);
场景。添加(环境光);
//取消注释这些线以创建简单的平行光。
//var方向灯=新的三个方向灯(0xffeedd);
//directionalLight.position.set(0,0,1).normalize();
//场景。添加(方向光);
//纹理加载
var-manager=new-THREE.LoadingManager();
manager.onProgress=功能(项目、已加载、总计){
控制台日志(项目、已加载、总计);
};
var texture=new THREE.texture();
var loader=new THREE.ImageLoader(管理器);
//可以在此函数中设置纹理特性。
//字符串必须是纹理文件的路径。
load('img/sickletexture.png',函数(图像){
纹理.图像=图像;
texture.needsUpdate=true;
//我想为我的低多边形角色设置一个最近邻过滤,
//所以每个像素都是尖锐的。你可以删除这些线
//如果有较大的纹理,并且需要平滑的线性过滤器。
texture.magFilter=3.NearestFilter;
texture.minFilter=3.NearestMipMapLinearFilter;
} );
//OBJ加载
var装入器=新的三个。对象装入器(管理器);
//加载OBJ后,此函数将查找网格
//在数据内部,并对其应用纹理。
loader.load('obj/镰刀.obj',函数(事件){
var对象=事件;
遍历(函数(子对象){
if(三个.Mesh的子实例){
child.material.map=纹理;
}
} );
//我最初的模型太小了,所以我把它放大了。
object.scale=新的三个向量3(2,2,2);
//可以更改对象的位置,使其不受影响
//在视图中居中,并为覆盖文本留出一些空间。
对象位置y-=2.5;
场景。添加(对象);
});
//我们将渲染器设置为窗口的大小,然后
//将画布附加到我们的HTML页面。
renderer=new THREE.WebGLRenderer();
renderer.setSize(document.getElementById('viewer').innerWidth,document.getElementById('viewer').innerHeight);
container.appendChild(renderer.doElement);
}
//环路
函数animate(){
//此函数在每一帧上调用自身。例如,您可以更改
//对象在每次调用时旋转以创建转盘动画。
请求动画帧(动画);
//在每一帧上,我们需要计算新的摄像机位置
//让它准确地看到我们场景的中心。
控件更新();
摄像机。注视(场景。位置);
渲染器。渲染(场景、摄影机);
}

我找到了一个相当简单的解决方案,我很惊讶我之前没有找到它


在一个单独的html文档中创建3D(使用原始脚本,而不是OP中编辑的脚本),然后在div中

我找到了一个相当简单的解决方案,我很惊讶我之前没有找到它


在一个单独的html文档中创建3D(使用原始脚本,而不是OP中编辑的脚本),然后在div

中,我试图让自己的工作正常进行,这段代码适用于我的最新版本(66)。这与你的例子有点不同,因为我使用的是vrml模型,而不是obj,我处理材料的方式也不同。但它确实运行良好

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - loaders - vrml loader</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            threewindow {
                border: 1px solid black;
                }
        </style>

        <script src="../three.js/build/three.min.js"></script>
        <script src="../three.js/examples/js/controls/TrackballControls.js"></script>
        <script src="../three.js/examples/js/loaders/VRMLLoader.js"></script>
        <script src="../three.js/examples/js/Detector.js"></script>
        <script src="../three.js/examples/js/libs/stats.min.js"></script>

        <script>

            if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
            var container, stats;
            var camera, controls, scene, renderer;
            var cross;

            function init() {
                alert("init");
                camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.01, 1e10 );
                camera.position.z = 6;

                controls = new THREE.TrackballControls( camera );
                controls.rotateSpeed = 5.0;
                controls.zoomSpeed = 5;
                controls.panSpeed = 2;
                controls.noZoom = false;
                controls.noPan = false;
                controls.staticMoving = true;
                controls.dynamicDampingFactor = 0.3;

                scene = new THREE.Scene();
                scene.add( camera );

                var sphereMaterial =
                      new THREE.MeshLambertMaterial(
                        {
                          color: 0xCC0000
                        });

                // light

                var dirLight = new THREE.DirectionalLight( 0xffffff );
                dirLight.position.set( 200, 200, 1000 ).normalize();

                camera.add( dirLight );
                camera.add( dirLight.target );

                var loader = new THREE.VRMLLoader();
                loader.addEventListener( 'load', function ( event ) {
                    var object = event.content; 
                    object.traverse( function ( child ) {
                          if ( child instanceof THREE.Mesh ) {
                            //child.material.map = texture;
                            //child.material = sphereMaterial;
                            child.material.side = THREE.DoubleSide;
                          }
                       } );

                    scene.add(object);

                } );
//              loader.load( "models/vrml/house.wrl" );
                loader.load( "cayley.wrl" );

                // renderer

                renderer = new THREE.WebGLRenderer( { antialias: false } );
                renderer.setSize( window.innerWidth, window.innerHeight );

                renderer.setSize(200, 200);
                document.getElementById("threewindow").appendChild(renderer.domElement);
//              container = document.createElement( 'div' );
//              document.body.appendChild( container );
//              container.appendChild( renderer.domElement );

//              stats = new Stats();
//              stats.domElement.style.position = 'absolute';
//              stats.domElement.style.top = '0px';
//              container.appendChild( stats.domElement );

                window.addEventListener( 'resize', onWindowResize, false );

                animate();
            }

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

                controls.handleResize();

            }

            function animate() {
                requestAnimationFrame( animate );
                controls.update();
                renderer.render( scene, camera );
                //stats.update();
            }

        </script>

    </head>

    <body onload="init()">

    <h1>Cubic surfaces</h1>
    <p>All the surfaces defined by cubics equations.</p>
    <ul><li><a href="parade/Cubics.php">Singularities of cubic surfaces</a>.</li>
    <li>A <a href="parade/index.html">pictorial introduction</a> to singularity theory.</li>
    </ul>
    <div id="threewindow"></div>


    </body>
</html>

three.js webgl-加载程序-vrml加载程序
三窗{
边框:1px纯黑;
}
如果(!Detector.webgl)Detector.addGetWebGLMessage();
var容器,stats;
摄像机、控件、场景、渲染器;
变量交叉;
函数init(){
警报(“初始”);
摄像头=新的三个透视摄像头(60,窗内宽度/窗内高度,0.01,1e10);
摄像机位置z=6;
控件=新的三个轨迹球控件(摄像头);
controls.rotateSpeed=5.0;
controls.zoomSpeed=5;
controls.panSpeed=2