2014-03-04 2 views
0

내가 가진 것은 다음과 같습니다. 입자는 입자 개체로 가득 찬 배열입니다. 현재 배열에 객체 참조를 추가하기 때문에 루프가 끝난 후 모든 객체가 동일한 속도 값을 갖습니다. 그러나 나는 서로 다른 것을 원한다. 배열에 실제 객체가 있고 객체에 대한 참조가 아니라 무엇을해야합니까? this.model : 순간배열의 객체 복사 참조 없음

for (i = 0; count > i; i++){ 
    var particle = this.model; //object i want to have multiple clonse from 
    particle.velocity = vec3.create(); //vec3.create from glmatrix library 
    var x = Math.random() * (0.1 - (-0.1)) + (-0.1); //value -0.1-->0.1 
    var y = Math.random() * 0.1; //value 0-->0.1 
    var z = Math.random() * (0.1 - (-0.1)) + (-0.1); //value -0.1-->0.1 
    vec3.set(particle.velocity, x, y, z); 
    this.particles.push(particle); 
} 
+2

'this.model'은 무엇입니까 다음

function Model() { // Set up basic properties and such on 'this', e.g. this.foo = "bar"; } 

은? – zerkms

+0

vec3 코드를 표시 할 수 있습니까? – BenM

+0

개체를 복사해야합니다. "딥 복제"를 찾거나 단순히 특정 복제를 구현할 수 있습니다. –

답변

2

, 당신은 당신이 반복적으로 배열에두고있는 단 하나의 목적을 가지고있다. 이 라인 :

var particle = this.model; 

this.model을 복사하지 않는, 그냥 그것을 참조하는 새로운 변수를 사용합니다. 그런 때마다 당신은 particle === this.model 때문에 또한 this.model.velocity입니다 particle.velocity 이전 루프의 값을 덮어 ...

particle.velocity = vec3.create(); 

을한다.

복사본this.model처럼 재사용하는 것처럼 들립니다. 어떻게하면 this.model에 많이 의존 할 것입니다. 여기에 순진 방법이있다 :

function shallowCopy(source) { 
    var key, dest = {}; 
    for (key in source) { 
     dest[key] = source[key]; 
    } 
    return dest; 
} 

var particle = shallowCopy(this.model); 

는 ... 그러나 다시, 그것은 this.model이 무엇인지에 많이 의존한다. this.model에 다른 개체를 참조하는 속성이있는 경우 위의 개체는 해당 개체를 다시 사용합니다. 그것들을 복제 할 수있는 "깊은"복제 기능이 필요합니다.

그것은 당신이 정말이 아니라 복제보다는 생성자 함수이며, 원하는 가능성이 높습니다 :

var particle = new Model(); 
+1

생성자가 확실히 요구 사항처럼 들립니다. – Xotic750