初始加载时,在Three.JS Canvas中适合3D对象(Collada文件)

代码

我有一个可在three.js画布中加载的框(collada文件)。我可以按预期与之互动。但是,由于用户可以更改尺寸,包装盒的尺寸会有所不同

当我将其加载到500px x 500px的画布中时,如果该框很大,则用户必须先放大才能看到它;如果它很小,则用户需要放大。该框的大小取决于变量通过了。

如何在加载时使对象(collada文件)适合画布,然后让用户缩放?这是单击加载的代码,以在three.js画布中显示3D对象:

$scope.generate3D = function () {

        // 3D OBJECT - Variables
        var texture0 = baseBlobURL + 'Texture_0.png';
        var boxDAE = baseBlobURL + 'Box.dae';
        var scene;
        var camera;
        var renderer;
        var box;
        var controls;
        var newtexture;

        // Update texture
        newtexture = THREE.ImageUtils.loadTexture(texture0);

        // Initial call to render scene, from this point, Orbit Controls render the scene per the event listener
        THREE.DefaultLoadingManager.onProgress = function (item, loaded, total) {
            // console.log( item, loaded, total ); // debug
            if (loaded === total) render();
        };

        //Instantiate a Collada loader
        var loader = new THREE.ColladaLoader();
        loader.options.convertUpAxis = true;
        loader.load(boxDAE, function (collada) {
            box = collada.scene;
            box.traverse(function (child) {
                if (child instanceof THREE.SkinnedMesh) {
                    var animation = new THREE.Animation(child, child.geometry.animation);
                    animation.play();
                }
            });
            box.scale.x = box.scale.y = box.scale.z = .2;
            box.updateMatrix();
            init();
        });

        function init() {
            scene = new THREE.Scene();
            camera = new THREE.PerspectiveCamera(100, window.innerWidth / window.innerHeight, 0.1, 1000);
            renderer = new THREE.WebGLRenderer();
            renderer.setClearColor(0xdddddd);

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

            // Load the box file
            scene.add(box);

            // Lighting
            var light = new THREE.AmbientLight();
            scene.add(light);

            // Camera
            camera.position.x = 40;
            camera.position.y = 40;
            camera.position.z = 40;

            camera.lookAt(scene.position);

            // Rotation Controls
            controls = new THREE.OrbitControls(camera, renderer.domElement);
            controls.addEventListener('change', render);
            controls.rotateSpeed = 5.0;
            controls.zoomSpeed = 5;
            controls.noZoom = false;
            controls.noPan = false;

            // Add 3D rendering to HTML5 DOM element
            var myEl = angular.element(document.querySelector('#webGL-container'));
            myEl.append(renderer.domElement);

        }

        // Render scene
        function render() {
            renderer.render(scene, camera);
            console.log('loaded');
        }
    }

    // Initial 3D Preview Load
    $scope.generate3D();

更新:我已经评估了此处介绍的解决方案:如何使相机适合对象,但是不确定如何为我的collada文件定义距离,因为它可以根据用户输入的尺寸而有所不同。collada文件是由用户发送变量给第三方供应商生成的,该第三方供应商返回一个collada文件,该文件随后被加载到three.js中。

更新2:感谢@ Blindman67,我将更进一步了解这种相互作用。当我手动设置camera.position的x,y,z值时,该对象在屏幕上。我面临的挑战是如何随着每个框的动态变化确定正确的x,y,z值,而字面上的变化超过2.8亿。我知道@ Blindman67已经在逻辑上给了我答案,但是我只需要最后推动一下,以发现如何为每次变化的对象获得正确的位置,以便我可以设置正确的x,y,z。

比阿特丽斯·塔洛

此代码将使相机围绕给定对象“自动居中”。

对于用户“缩放”,还请看一下Three.js的示例/js/controls/.js,这些示例可简化TrackballControls相机的位置(并改变外观和向上)。如果选择使用该选项,我记得您需要先初始化控件,然后再使用来移动相机位置centerCam在这种情况下,centerCam可以考虑整个对象以准备进行用户交互,然后TrackballControls听众接管。

<body onload="initPage()">
  <canvas id="cadCanvas" width="400" height="300"></canvas>
  <button onclick="loadFile()">Load Collada File</button>
</body>

function initPage(){
  var domCanvas = document.getElementById('cadCanvas');
  scene = new THREE.Scene();
  var fovy = 75;
  camera = new THREE.PerspectiveCamera( fovy, domCanvas.width/domCanvas.height, 0.1, 1000 );
  renderer = new THREE.WebGLRenderer({canvas:domCanvas});
  renderer.setSize( domCanvas.width, domCanvas.height );
}

function loadFile(){
  new THREE.ColladaLoader().load( url, function(obj3D) {
    scene.add(obj3D);
    centerCam(obj3D);
    renderer.render(scene, camera);
  });
}

function centerCam(aroundObject3D){

  //calc cam pos from Bounding Box
  var BB = new THREE.Box3().setFromObject(aroundObject3D);
  var centerpoint = BB.center();
  var size = BB.size();
  var backup = (size.y / 2) / Math.sin( (camera.fov/2)*(Math.PI/180) );
  var camZpos = BB.max.z + backup + camera.near ;

  //move cam
  camera.position.set(centerpoint.x, centerpoint.y, camZpos);
  camera.far = camera.near + 10*size.z;
  camera.updateProjectionMatrix();

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用 Three.js 加载 STL 文件时出错

来自分类Dev

在Three.js中链接3d对象

来自分类Dev

Three.js Collada-在三个js中加载多个Collada对象

来自分类Dev

尝试加载json对象时,Three.js r71显示黑屏

来自分类Dev

获取悬停时通过OBJLoader加载的对象模型的名称-Three.js

来自分类Dev

如何在Three.js编辑器中加载启动时的CTM文件?

来自分类Dev

在Three.js r69中加载json模型时,材质无法正确显示

来自分类Dev

在 Three.js 中为 TextGeometry 加载字体时出现 CORS 策略错误

来自分类Dev

Three.js中的初始Sprite大小

来自分类Dev

three.js以相同的视角显示3d对象

来自分类Dev

在three.js中概述一个3d对象

来自分类Dev

如何在three.js中的3D对象上放置透明的颜色蒙版?

来自分类Dev

逐步“显示” Three.js中的3d对象-我这样做对吗?

来自分类Dev

拖动以更改Three.js场景中3D模型对象的位置

来自分类Dev

加载文件的THREE.js旋转

来自分类Dev

THREE.JS 无法加载 mtl 文件

来自分类Dev

Three.js-拖动Collada文件

来自分类Dev

Three.js跨源错误加载相关的Collada文件纹理

来自分类Dev

Three.js中的多种3D声音

来自分类Dev

在THREE.js中绘制3d边界框

来自分类Dev

从Blender加载Three.js中的多个对象

来自分类Dev

使用Three.js无法在Mapbox上加载3D模型

来自分类Dev

Popper.js 未在文档加载时初始化

来自分类Dev

Three js 3D rotation

来自分类Dev

如何从three.js中的OBJ + MTL文件加载纹理?

来自分类Dev

three.js初始化,对象靠近相机

来自分类Dev

在初始页面加载时加载目标ajax php文件

来自分类Dev

在Vue JS中初始加载后切换类

来自分类Dev

加载js文件时出现404错误