3

这篇文章是翻译自 Autodesk Forge 博客的 Add Three.js Shape to Simulate Alertor,作者是 Autodesk ADN 梁老师,更多细节请参考博客原文。

有几个小友问了梁老师如何通过 Three.js 的构件来模拟设备告警或是设备故障的情境。而这在 Forge Viewer 里是非常容易的,小友们只要透过 Three.js 在 Viewer 里新增一个 Three.js 的自定形体,并且以时间为间隔来变更这个形体的材质即可达到。不过小友们必需注意在自定形体的状态变更时,调用 Viewer3DImpl.invalidate 函数来更新画面的小技巧,就像下方所示,而下面这个函数的参数表示的是我只要 Viewer 去更新形体的外观,而不是去更新整个场景。

_viewer3D.impl.invalidate(false,true,true); 

知道这个小技巧之后,我们来看看如何实作警报器。下面的示例只是部份代码,并且假设了一个情境:浏览器画面上有一个按钮叫做 btnAlertorShape,以及所有的模型都已经被 _viewer3D 载入了。

var _viewer3D  = null;
var _currentShape= null;

//for clear interval
var _interval_ID = null;

$(document).ready (function () {
   
        $('#btnAlertorShape').click (function (evt) {

            if(_viewer3D == null){
                alert('Viewer 3D not initialized!');
                }
                else {
                    $(_viewer3D.container).
                        bind("click", onMouseClick);
                }
                
        });
});

//when the mouse clicks
function onMouseClick (event) {

     var screenPoint = {
        x: event.clientX,
        y: event.clientY
    };

    var n = normalizeCoords(screenPoint);

    //get hit point
    var hitTest = _viewer3D.utilities.getHitPoint(
        n.x,
        n.y);

    if(hitTest)
    {
         //add a sphere.
         var sprad = 10;
         var material= new THREE.MeshBasicMaterial( {color: 0xff0000} );

         var geometry_sphere = new THREE.SphereGeometry( sprad, 60, 40 );
         geometry_sphere.applyMatrix( new THREE.Matrix4().makeTranslation( hitTest.x, hitTest.y, hitTest.z ) );
         _currentShape = new THREE.Mesh( geometry_sphere, material );
  
         _viewer3D.impl.scene.add(_currentShape);
        _viewer3D.impl.invalidate(true) ;

        //start an interval to change the color of the shape
         _interval_ID = setInterval(function(){

             var curColor = _currentShape.material.color;
             curColor = (curColor.getHex()==0xff0000?0x00ff00:0xff0000);
             _currentShape.material.color.setHex (curColor);
              _viewer3D.impl.invalidate(false,true,true); 

         },100);
         
        $(_viewer3D.container).
            unbind("click", onMouseClick);
    }
}

//normalize the screenpoint
function normalizeCoords (screenPoint) {

    var viewport =
        _viewer3D.navigation.getScreenViewport();

    var n = {
        x: (screenPoint.x - viewport.left) / viewport.width,
        y: (screenPoint.y - viewport.top) / viewport.height
    };

    return n;
}

上面代码的思路是在模型都被载入后,点击了 btnAlertorShape 按钮,并在画面上模型的任意位置点击鼠标左键。一个自订形体就这时候出现在画面上,它的颜色会根据时间在红色与绿色之间变动,他的效果就像这个样子:https://flint-prodcms-forge.s...


康益昇
748 声望103 粉丝

引用和评论

0 条评论