Изменение параметров
1+
Сделал изменение объекта при изменении значений в меню параметров. Для этого переделал механизм создания геометрии.
this.createGeometry = function ( geometryType, params ) { let geometry = null; let paramsArray; if ( !(params instanceof Object) ) { console.error( 'params must be an object. Now params are ' + typeof params ); return; } switch ( geometryType ) { case 'BoxGeometry': geometry = new THREE.BoxGeometry(); this.checkParams( params, geometry.parameters ); paramsArray = Object.values( params ); //применяем оператор расширения, очень удобная штука, код получается очень лаконичным geometry = new THREE.BoxGeometry( ...paramsArray ); break;
Переданные параметры проверяю, если параметра нет или ему не задано значение, пишу предупреждение в консоль.
this.checkParams = function( paramsToCheck, paramsTemplate ) { if ( !(paramsToCheck instanceof Object) ) { console.error( 'paramsToCheck must be an object. Now params are ' + typeof params ); return; } if ( !(paramsTemplate instanceof Object) ) { console.error( 'paramsTamplate must be an object. Now params are ' + typeof params ); return; } let data = {}; Object.assign( data, paramsTemplate ); for (const key in data) { if ( !paramsToCheck.hasOwnProperty(key) ) { console.warn( 'Parameter "' + key + '" is missing ' ); } else { if ( paramsToCheck[ key ] === undefined && paramsToCheck[ key ] === '' ) { console.warn ( '"' + key + '" not set'); } } } }
Функция изменения параметров, на событии поля ввода «onInput». Здесь также применяется функция createGeometry ( entity.geometry.type, params );
this.updateSelectedObject = function( parameterName, parameterValue, entity ) { let geom = entity.geometry; let params = {}; // берем параметры выделенного объекта Object.assign( params, geom.parameters ); // присваиваем параметр из поля ввода одноименному параметру params[ parameterName ] = parameterValue; // создаем новую геометрию let newGeom = this.createGeometry ( entity.geometry.type, params ); entity.geometry.dispose(); // присваиваем новую геометрию выделенному объекту entity.geometry = newGeom; // обновляем отображение сетки let wireframe = entity.getObjectByName( 'wireframe' ); let newWireframeGeometry = new THREE.WireframeGeometry( newGeom ); wireframe.geometry = newWireframeGeometry; // Обновляем отображение BoundingBox. Если в случае с объектом Object 3D нужно заменить geomtry, то тут нужно заменить box новым let boundingBox = entity.getObjectByName( 'BoundingBox' ); entity.geometry.computeBoundingBox(); let box = new THREE.Box3Helper( entity.geometry.boundingBox ); boundingBox.box = box.box; }
Теперь можно добавить создание остальных примитивов, изменение параметров можно привязать к любому объекту.
1+