Dat.guiメニューを新しい値で更新したいと思います。モデルをロードし、GUIフォルダー内のオブジェクトの名前をフォルダーに表示しました。
他のモデルをリロードするときに新しいオブジェクト名を表示するにはどうすればよいですか?
または、GUIをリセット/クリアすることが可能です。
基本的に、コントローラーを追加するときは、入力を「リッスン」するようにコントローラーを設定する必要があります。たとえば、
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
Three.jsでのこの例については、以下を参照してください。
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();
}
}
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});
LeeStemkoskiおよびEchtEinfachのソリューションは、GUIで選択したコントローラーで.listen()メソッドを使用します。
.updateDisplay()を使用するjmmutのソリューションは、GUIのすべてのコントローラーをループします
特定の時間に単一のコントローラーの値を手動で更新するだけの場合は、これらのソリューションタイプの両方が高価であることに気付きます。
これを回避するには、SINGLEコントローラーのメソッド.updateDisplay()を使用します。
これを行う1つの方法は、単一のコントローラーのindex [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()
注:フォルダー内のコントローラーでこれを機能させるために必要な追加のコードは含まれていません。あなたは他の答えからこれを得ることができます。
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;
ドロップダウンメニューを使用する場合、listenにはバグが関連付けられています。ここを参照してください: 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]);
}
}
私の答えはnotあなたの質問を反映していますが、3Dシーン内の値をプログラムで変更し、GUIコントロールを更新する必要がある他の人にとっては役立つになります。
あなたが宣言するとき:
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
}
}