2013-04-23 2 views
13

Я хотел бы обновить меню dat.gui новыми значениями. Я загрузил модель и отобразил в папке имя объектов внутри папки gui.
Как я могу отобразить новое имя объекта при перезагрузке другой модели?
Или можно сбросить/очистить gui. enter image description hereобновить dat.gui новыми значениями

ответ

14

В принципе, вы должны установить контроллеры "слушать" для ввода, когда вы добавляете их, к примеру,

gui = new dat.GUI(); 
var guiX = gui.add(parameters, 'x').min(0).max(200).listen(); 

Для документации см:

http://workshop.chromeexperiments.com/examples/gui/#9--Updating-the-Display-Automatically

Для пример этого в разделе «Три». см.:

http://stemkoski.github.io/Three.js/GUI-Controller.html

+0

Это не вок, потому что первый раз, когда я загружаю модель, у меня есть папка с некоторыми именами, такими как: folder.add (name1, true); folder.add (name2, true); ... И когда я загружаю новую модель, имя изменяется. Поэтому я хотел бы изменить имя в папке или сбросить gui. – user2244365

+0

Наконец-то я нашел решение с gui добавить прототип Андреаса Кёберле, который удаляет папки – user2244365

+0

Кажется, что прослушивание больше не работает. Я пытаюсь слушать SelectController, и я получаю предупреждение при загрузке моей страницы '' webkitRequestAnimationFrame 'зависит от поставщика. Вместо этого используйте стандартную «requestAnimationFrame». dat.gui.js: 2841 Я использую версию Chrome 40.0.2214.115 –

1

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

При объявлении:

var cubeX = folder1.add(parameters, 'x').min(-100).max(100).step(1).listen(); 

вы заранее объявлены параметры, например,

parameters = { 
    x: 0, y: 0, z: 0 
} 

Теперь вы можете слушать ключевых событий или соответствующего события и изменять значения в GUI так:

window.addEventListener('keydown', function(event) { 
    if(event.keyCode == 88) { // x pressed 
     parameters.x++; // GUI value changed 
     cube.scale.x = parameters.x; // 3d object changed 
    } 
} 
8

решение ECHT Einfach не работал для меня, и один Stemkoski является немного шире. Я наконец-то сделал это с updateDisplay функции:

for (var i in gui.__controllers) { 
    gui.__controllers[i].updateDisplay(); 
} 

http://workshop.chromeexperiments.com/examples/gui/#10--Updating-the-Display-Manually

Заметим, что если у вас есть значения в какую-нибудь папку folder1 вызов выглядит так:

for (var i = 0; i < this.gui.__folders.folder1.__controllers.length; i++) { 
    this.gui.__folders.folder1.controllers[i].updateDisplay(); 
} 

Если вы не хотите к жесткому коду folder1 или просто хотите обновить все папки, вы можете действовать следующим образом:

for (var i = 0; i < Object.keys(gui.__folders).length; i++) { 
    var key = Object.keys(gui.__folders)[i]; 
    for (var j = 0; j < gui.__folders[key].__controllers.length; j++) 
    { 
     gui.__folders[key].__controllers[j].updateDisplay(); 
    } 
} 
2

Решения Lee Stemkoski и Echt Einfach используют метод .listen() на выбранном контроллере в графическом интерфейсе. Решение

jmmut, используя .updateDisplay(), перебирает все контроллеры в GUI

Это меня поражает, что оба эти типа решения являются ДОРОГО, если вы хотите вручную изменить значение одного контроллера на конкретное время.

Вы можете избежать этого, используя метод .updateDisplay() для контроллера SINGLE.

Один из способов сделать это, если вы заранее знаете индекс [i] одного контроллера.Но это довольно сложно реализовать.

Лучший способ ссылаться на конкретный контроллер по имени

// AT INITIALISATION TIME 
gui1 = new dat.GUI(); 
Gparameters = { x: 0, y: 0, z: 0} 
var gui1_X = gui1.add(Gparameters, 'x').min(0).max(200); // note no need to use the method .listen() 

// AT RUN TIME 
Gparameters.x++; 
gui1_X.updateDisplay() 

Примечание: Я не включил дополнительный код, необходимый, чтобы сделать эту работу с контроллерами внутри папки. Вы можете получить это от других ответов.

0

У прослушивания есть связанная с этим ошибка, если вы используете раскрывающиеся меню. См. Здесь: https://code.google.com/p/dat-gui/issues/detail?id=59

Вот короткая функция для обновления всех контроллеров путем итерации по всем папкам.

function updateDisplay(gui) { 
    for (var i in gui.__controllers) { 
     gui.__controllers[i].updateDisplay(); 
    } 
    for (var f in gui.__folders) { 
     updateDisplay(gui.__folders[f]); 
    } 
} 
1

Это легко, когда я прочитал исходный код dat.gui:

https://github.com/dataarts/dat.gui/blob/master/src/dat/controllers/Controller.js#L36

Как вы видите, this.object = object, this является контроллером вы добавляете, и object является то, что вам нужно изменение. Вот пример кода:

var gui = new dat.GUI(); 

// init a controller 
var controller = gui.add(object, 'property'); 

// update a controller 
controller.object = newObject; 
0

Написал функцию для обновления dat.gui выпадающие с новым набором значений:

function updateDatDropdown(target, list){ 
    innerHTMLStr = ""; 
    if(list.constructor.name == 'Array'){ 
     for(var i=0; i<list.length; i++){ 
      var str = "<option value='" + list[i] + "'>" + list[i] + "</option>"; 
      innerHTMLStr += str;   
     } 
    } 

    if(list.constructor.name == 'Object'){ 
     for(var key in list){ 
      var str = "<option value='" + list[key] + "'>" + key + "</option>"; 
      innerHTMLStr += str; 
     } 
    } 
    if (innerHTMLStr != "") target.domElement.children[0].innerHTML = innerHTMLStr; 
} 

Использование:

myDropdown = gui.add(MyObject, 'myVariable', ['one','two','three']); 
updateDatDropdown(myDropdown , ['A','B','C']); 

// Also accepts named values 

updateDatDropdown(myDropdown , {'A':1,'B':2,'C':3});