Изменение параметров
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+
