2016-06-02 10 views
0

Ich habe versucht, die Array-Werte wie im folgenden Code aufrufen, aber wenn onclicked ich bin in der Lage, das erste Material im Array erfolgreich, aber nicht die anderen, aus irgendeinem Grund es hört auf zu loopen. Bitte lassen Sie mich wissen, wo ich falsch liege.für die Schleife nur den ersten Array-Wert

var White = new THREE.MeshPhongMaterial({ 
      color:0xf6daa5, 
     // specular: 0x000000, 
      roughness: 0.7, 
      shininess: 0, 
     // bumpMap: mapHeight, 
      bumpScale: 12, 
      emissive: null, 
      emissiveIntensity : null, 
      reflectivity: 0.1 
    }); 
var sink = new THREE.MeshPhongMaterial({ 
    color: 0x224466, 
    combine: THREE.MixOperation, 
    reflectivity: 0.8, 
    side: THREE.DoubleSide, 
    shininess: 40, 
    reflectivity:0 

    opacity:null 
    }) 
var gold = new THREE.MeshPhongMaterial({ 
    color: 0x529dc3,     
    specular: 0x508fbb,    
    shininess: 60, 
    emissive:0x070606, 
    reflectivity:0.7, 
    opacity:0.8, 
    shading: THREE.FlatShading, 
    combine: THREE.MultiplyOperation 
    }) // have declared these globally 

EventsControls.attachEvent('onclick', function() { 
    var colors = [White, sink, gold]; 
    for (var i = 0; i < colors.length; i++) { 
     console.log(colors.length); 
     object.traverse(function(child) { 
      if (child instanceof THREE.Mesh) { 

       if (child.material.name == "w__") { 

        child.material = colors[i]; 
       } 
      } 
     }) 
    } 
}); 
+1

Wo sind die Werte im Farbfeld definiert? – Pytth

+2

Sieht aus, als ob Sie die Farbnamen in Anführungszeichen setzen müssen. 'Weiß', 'Senke', 'Gold' (Senke?) Oder irgendwo diese Farbnamenvariablen definieren. – Rick

+1

Array-Indizes beginnen bei 0 und Sie beginnen bei 1. – IMTheNachoMan

Antwort

-1

Ihr Array besteht aus mehreren Strings, von denen jeder zwischen doppelte Anführungszeichen "

EventsControls.attachEvent('onclick', function() { 
    var colors = ["White", "sink", "gold"]; 
    for (var i = 1; i < colors.length; i++) { 
     console.log(colors.length); 
     object.traverse(function(child) { 
      if (child instanceof THREE.Mesh) { 

       if (child.material.name == "w__") { 

        child.material = colors[i]; 
       } 
      } 
     }) 
    } 
}); 

Siehe auch gestellt werden muss: http://www.w3schools.com/js/js_arrays.asp

+0

Tijmen, ich versuchte es mit den Anführungszeichen, aber das Onclick-Objekt verschwindet. danach. Es schafft es jedoch, das erste Array-Objekt Weiß aufzurufen, wenn ich das Array ohne Anführungszeichen initiiere. –

+0

@Tijmen - Ich glaube nicht, dass Sie gesehen haben, dass Weiß, Sink und Gold eigentlich Objekte sind. Das Einfügen in Strings funktioniert nicht. –

+0

Ich habe gerade die global definierten Variablen hier in der Frage aktualisiert, gibt es einen anderen Looping-Weg, den ich für diese Situation versuchen kann. Reicht eine While-Schleife aus? –

0

Array-Indizes beginnen bei 0 und Sie fangen an 1.

// filler to make the code work 
 
var THREE = { 
 
    "MeshPhongMaterial": function() {}, 
 
    "MixOperation": null, 
 
    "DoubleSide": null, 
 
    "FlatShading": null, 
 
    "MultiplyOperation": null 
 
}; 
 

 
var White = new THREE.MeshPhongMaterial({ 
 
    color: 0xf6daa5, 
 
    // specular: 0x000000, 
 
    roughness: 0.7, 
 
    shininess: 0, 
 
    // bumpMap: mapHeight, 
 
    bumpScale: 12, 
 
    emissive: null, 
 
    emissiveIntensity: null, 
 
    reflectivity: 0.1 
 
}); 
 

 

 
var sink = new THREE.MeshPhongMaterial({ 
 
    color: 0x224466, 
 
    combine: THREE.MixOperation, 
 
    reflectivity: 0.8, 
 
    side: THREE.DoubleSide, 
 
    shininess: 40, 
 
    reflectivity: 0, 
 
    opacity: null 
 
}); 
 

 
var gold = new THREE.MeshPhongMaterial({ 
 
    color: 0x529dc3, 
 
    specular: 0x508fbb, 
 
    shininess: 60, 
 
    emissive: 0x070606, 
 
    reflectivity: 0.7, 
 
    opacity: 0.8, 
 
    shading: THREE.FlatShading, 
 
    combine: THREE.MultiplyOperation 
 
}); // have declared these globally 
 

 

 
// commented out parts that aren't relevant to the issue 
 
//EventsControls.attachEvent('onclick', function() { 
 
var colors = [White, sink, gold]; 
 
for (var i = 0; i < colors.length; i++) { 
 
    console.log(i + " = " + colors.length); 
 
    // object.traverse(function(child) { 
 
    // if (child instanceof THREE.Mesh) { 
 
    // 
 
    //  if (child.material.name == "w__") { 
 
    // 
 
    //  child.material = colors[i]; 
 
    //  } 
 
    // } 
 
    // }) 
 
} 
 
//});

Und ist object überall definiert? Sonst wird es Fehler in der for Schleife.

+0

yep, ich habe das Objekt definiert und ich verwende Objekte Kind, um sein Material zu ändern. Ich frage mich, ob die Änderungen für ein Array-Element widerspiegeln können, warum nicht für andere zwei, ich glaube, ich habe einen Fehler gemacht, während es zu loopen. –

Verwandte Themen