Громкость исчезает при изменении нормалей среза X

Я хочу соединить уроки 10 и 17, чтобы визуализировать объем, канонические фрагменты (как в уроке 10) и перерезку фрагмента X (урок 17). Для этого я изменил код урока 10.

Обнаруженные проблемы:

  1. Срез X появляется, когда включена визуализация громкости.
  2. Объем исчезает!!!!
  3. Отображается только X Slice на экране, когда включена визуализация громкости.

Проблемы появляются, когда:

Проблемы появляются на визуализации объема. когда мы переключаемся между визуализацией объема и визуализацией среза, тогда, когда мы находимся на визуализации объема, нам нужно переместить объем, и тогда появятся ошибки.

Конкретная ошибка находится в строке 1385 тома.js (загруженной вчера ветки master, зафиксируйте 318986e6b1d4a195a78b87f81a082ca249cbd866)... снимок экрана: https://mega.co.nz/#!d8hVCIhY!TWegqY2pRPcvjj2xjjx2

Ошибка: Uncaught TypeError: Невозможно установить свойство '_visible' для неопределенного тома. Js:1385

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

    }

Что я делаю.... Я изменил урок 10 следующим образом:

1. Добавление элементов управления X Slice normals. Чтобы изменить 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 ответ

Решение

Вы пытались сбросить "volume._volumeRenderingCache" после изменения нормального среза?

что-то вроде:

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

если он работает с не скомпилированным XTK, мы можем добавить методы получения / установки для доступа к этой переменной из скомпилированного XTK.

Имеет ли это смысл?

Спасибо

Другие вопросы по тегам