当切片X法线改变时,体积消失

时间:2014-02-01 23:43:54

标签: xtk volume-rendering

我希望融合第10课和第17课来观察音量,规范切片(如第10课)和sliceX(第17课)的重新组合。为此,我修改了第10课的代码。

检测到的问题是:

  1. 启用体积渲染时会出现切片X.
  2. 卷DISAPPEARs !!!!
  3. 启用卷渲染时,仅在屏幕上显示X Slice。
  4. 问题出现在:

    卷可视化中出现问题。当我们在体积可视化和切片可视化之间切换时,当我们进行体积可视化时,我们需要移动体积,然后出现错误。

    特定错误在volume.js的第1385行(昨天下载的主分支,提交318986e6b1d4a195a78b87f81a082ca249cbd866)...屏幕截图: https://mega.co.nz/#!d8hVCIhY!TWegqY2pRPcvl09CyMocJYeZu55sDOc_xRCiAed2Jhg

    错误:未捕获TypeError:无法设置未定义volume.js的属性'_visible':1385

        for (i = 0; i < _numberOfSlices; i++) {
           //THE ERROR IS IN THE NEXT LINE
            _child._children[i]._visible = true;
    
        }
    

    我做了什么.... 我在下一个方面修改了第10课:

    1。添加X Slice法线控件。要修改xNormX,xNormY和xNormZ,我们使用第17课中的代码:

    var slicegui = gui.addFolder('Slice X Orientation');
    var sliceXNXController = slicegui.add(volume, 'xNormX', -1.00,1.00).name('Normal X Dir.').listen();
    var sliceXNYController = slicegui.add(volume, 'xNormY', -1.00,1.00).name('Normal Y Dir.').listen();
    var sliceXNZController = slicegui.add(volume, 'xNormZ', -1.00,1.00).name('Normal Z Dir.').listen();
    normalChange = function(value){
        volume.sliceInfoChanged(0);
        sliceXController.max(volume.range[0] - 1);
    }
    sliceXNXController.onChange(normalChange);
    sliceXNYController.onChange(normalChange);
    sliceXNZController.onChange(normalChange);
    slicegui.open();
    

    2。将Listen()添加到sliceXController以允许在修改法线时自动更新:

    var sliceXController = volumegui.add(volume, 'indexX', 0.00, volume.range[0] - 1).listen();
    

    第3。添加存储代码并恢复法线和sliceX索引当用户更改volumeRendering时。

    //Store the initial normals
    var _xNormX_initial = volume.xNormX; 
    var _xNormY_initial = volume.yNormX;
    var _xNormZ_initial = volume.zNormX;
    //Store the user defined normals
    var _xNormX_current = null; 
    var _xNormY_current = null;
    var _xNormZ_current = null;
    
    //store the initial indexX slice
    var _indexX_initial = volume.indexX;
    //store the user defined indexX slice
    var _indexX_current = null;
    
    //IF volumeRendering  change we catch the event
    vrController.onChange(function(value) {
      if (value == true) {
        //Store the user defined normals
        _xNormX_current = volume.xNormX;
        _xNormY_current = volume.xNormY;
        _xNormZ_current = volume.xNormZ;
        //store  user defined indexX slice
        _indexX_current = volume.indexX;
    
        //set the initials normals
        volume.xNormX = _xNormX_initial;
        volume.xNormY = _xNormY_initial;
        volume.xNormZ = _xNormZ_initial;  
        //Set the initial indexX slice
        volume.indexX = _indexX_initial;                
      }else{
        //Go back to the  user defined normals
        volume.xNormX = _xNormX_current;
        volume.xNormY = _xNormY_current;
        volume.xNormZ = _xNormZ_current;
        //Go back to the  user defined indexX slice
        volume.indexX = _indexX_current;
      }
      volume.sliceInfoChanged(0);
    });
    

    我希望你能帮助我。提前致谢!!!


    当我显示错误(mp4和webm)时,我分享了一个视频,修改了第10课的完整源代码(它需要存储在“X-master \ testing \ visualization”中)和屏幕截图错误

    https://mega.co.nz/#F!I8pxgBqa!M0ZCBUTWXlcIDtYqvboo3w


    编辑1,解决了问题:对于未编译的XTK,我使用此代码:

    //Modify Normals
    volume.xNormX = _xNormX_current;
    volume.xNormY = _xNormY_current;
    volume.xNormZ = _xNormZ_current;
    //Rebuild the sliceX data
    volume.sliceInfoChanged(0);
    //reset the "volume._volumeRenderingCache", thanks Nicolas :)
    //this is the trick
    volume._volumeRenderingCache = [];
    //Modify the indexX slice
    volume.indexX = _indexX_current;
    

    功能代码在这里(demo_ok.js): mega.co.nz /#!R1p0lKAC!C806T7tLTpQTdBN7mJBRS0_ANWa4fqv3wvJtZR_kMg4

1 个答案:

答案 0 :(得分:0)

修改切片法线后,您是否尝试重置“volume._volumeRenderingCache”?

类似的东西:

...
volume.sliceInfoChanged(0);
volume._volumeRenderingCache = [];
...

如果它与未编译的XTK一起使用,我们可以添加getter / setter来从编译的XTK访问这个变量。

有意义吗?

由于