Марширующие кубы для квадрик - Three.js - PullRequest
0 голосов
/ 12 мая 2018

Я попытался реализовать апплет, показывающий различные типы пробелов с библиотекой Marching Cubes из Three.js для визуализации неявных поверхностей. Хотя фигуры, которые появляются, не правильные, и я предполагаю, что я не реализую свойства THREE.MarchingCubes по мере необходимости. Ядро апплета имеет следующий код

        quadricData = {
            a11: 1,
            a22: 1,
            a33: 1,
            a12: 0,
            a13: 0,
            a23: 0,
            a1: 0,
            a2: 0,
            a3: 0,
            a: -1
        };

        quadValue = function (data, x, y, z) {
            return data.a11*x*x+
                   data.a22*y*y+
                   data.a33*z*z+
                   data.a12*2*x*y+
                   data.a13*2*x*z+
                   data.a23*2*y*z+
                   data.a1*x+
                   data.a2*y+
                   data.a3*z+
                   data.a;
        }

        var res = 50;
        var material = new THREE.MeshPhongMaterial( {
            color: '#1565C0', // blue 800
            transparent: true,
            opacity: 0.8,
            side: THREE.DoubleSide,
            flatShading: true
        } );

        quadric = new THREE.MarchingCubes( res, material );
        quadric.isolation = 0;

        for ( var k = 0 ; k < res ; k++ ) {
            for ( var j = 0 ; j < res ; j++ ) {
                for ( var i = 0 ; i < res ; i++ ) {

                var x = 8*(i-res/2)/res;
                var y = 8*(j-res/2)/res;
                var z = 8*(k-res/2)/res;

                quadric.field[ i + j*res + k*res*res ] = quadValue(quadricData,x,y,z);

                }
            }
        }

но полный код может быть проверен здесь . Я полагаю, что атрибут field должен быть заполнен значениями функции, но, возможно, это неправильный способ продолжения. Странные эффекты появляются, например, при увеличении a11, которое расширяет эллипсоид вместо его уменьшения; «сетка марширующих кубов», кажется, тоже расширяется, что довольно забавно.

enter image description here

Многие другие конфигурации не соответствуют ожидаемому результату. Как правильно использовать THREE.MarchingCubes?

1 Ответ

0 голосов
/ 14 мая 2018

Чтобы использовать THREE.MarchingCubes:

  • Включить MarchingCubes.js через <script src="https://threejs.org/examples/js/MarchingCubes.js"></script>

  • Выделите том с разрешением R, которое будетбыть воксельным кубом с разрешением R x R x R через V = new THREE.MarchingCubes( R, material )

  • Заполните значения вокселей, которые представляют собой линейный массив значений с плавающей запятой.Индекс для вокселя в местоположении [X, Y, Z] равен (X + (Y * R) + (Z * R * R)).Установите значения с помощью V.field[ i + j*R + k*R*R ] = f

  • Установите значение isolation.Отображаемая громкость будет на все вокселы меньше этого значения, поэтому все это можно назвать значением изоповерхности.Установите значение с помощью V.isolation = s.

Кажется, ваш код работает правильно.Увеличение a11 уменьшает громкость в измерении x, как и ожидалось.

enter image description here

Единственное, что я заметил, это умножение кода a12 и a13и a23 на 2. Если квадратное уравнение выражается как:

Ax ^ 2 + By ^ 2 + Cz ^ 2 + Dxy + Exz + Fyz + Gz + Hy + Iz + J = 0

И вычисление: data.a11*x*x + data.a22*y*y + data.a33*z*z + data.a12*2*x*y + data.a13*2*x*z + data.a23*2*y*z + data.a1*x + data.a2*y + data.a3*z + data.a, тогда кажется, что DE и F умножаются на два без причины?

В противном случае, была ли ошибка, которую вы разрешили после публикации вопроса?Или не могли бы вы более конкретно рассказать о проблеме?

Отчет об ошибке: Есть сообщение об ошибке 14060, зарегистрированное против three.js здесь .По состоянию на май 2018 года, с версии Three.js r92, кажется, что библиотека Marching Cubes работает в (1) Firefox в Windows и MacOS, (2) Safari в MacOS.В Firefox в Linux он появляется с ошибками и в любой системе в Chrome.Отключение плоского затенения может решить проблему.

...