Object loader parse from json missing elements

Hey everyone,

i implemented a loader that i use for loading a group with some child objects from a json file. The strange thing is when i parse the json with loader.parse() it returns only 10 of my 20 children in the test group. When logging the json i get all 20 children but when logging obj inside loader.parse i get only 10 of the children. Anyone has any idea what the problem could be?

var data = e.target.result;
var json = JSON.parse(data);
console.log(json);
const loader = new THREE.ObjectLoader();
loader.parse( json,
	function ( obj ) {
		console.log(obj);
		for(var i=0; i<obj.children.length; i++){
			geometry.add(obj.children[i]);
		}
	}
);

edit: it seems that the parser is skipping the array elements with even indices for some reason.

uids in my json:

  1. children: Array(20)

  2. 0: {uuid: β€œ416D303A-AD2F-47D5-959F-E445F3DCC0EA”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œF501CADA-2F8B-43C9-8127-619293A03212”, …}

  3. 1: {uuid: β€œ99940F9E-490F-471A-B887-2538A521B8F0”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œB9033872-2BEB-4C0D-A5E1-328CD482A8EB”, …}

  4. 2: {uuid: β€œ541D4AEE-6066-4AF6-ADE6-3129E3DD143B”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ50CB0660-77A6-47AC-8264-76CDB4FFA7BB”, …}

  5. 3: {uuid: β€œB8361E5A-73CA-4C9B-B8C7-A41D55DDDD2C”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ89D13FD7-85AF-4A2E-AE94-EF8EA446E7F2”, …}

  6. 4: {uuid: β€œ248926CA-F923-4047-97FA-5686FC42B4BF”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ6C271E87-E1A3-4D5A-842B-537FD0AF5FCD”, …}

  7. 5: {uuid: β€œ09512D18-36C4-42DB-A85E-70D715D81706”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œDC4C7657-BD35-4F36-823C-E5608A8B5B93”, …}

  8. 6: {uuid: β€œ69EF5373-3C42-4280-BFB3-AE0C27E0619F”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œBBD8778F-DD43-4267-8F56-95E0EA9D9D72”, …}

  9. 7: {uuid: β€œ0EB92247-A3D7-45F7-B641-524BBDC56963”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ7F109BD3-7992-4670-84C5-1461848E4153”, …}

  10. 8: {uuid: β€œC9D23A7F-FEB2-4099-9D71-E26885B001B3”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ3B411FB6-A69F-4A06-9CF8-419B0872A287”, …}

  11. 9: {uuid: β€œ214B09EC-0200-4390-94AF-9DB606E8DE25”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ91621293-73C5-4199-A63E-6E7950264FC8”, …}

  12. 10: {uuid: β€œD148F4A4-C12B-4E7A-BE57-6B61C6AD59F8”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ8A93DD56-41FF-4FD3-A468-A2D78FDEBD43”, …}

  13. 11: {uuid: β€œC0B9CEF2-1272-4733-96C5-FD4A4BC84D5C”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œFB830067-1A3B-4812-B47D-C18F80C6CDDD”, …}

  14. 12: {uuid: β€œBFC3C610-BB91-4104-A081-9184FD76F4FF”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ13964B1F-A269-4392-B614-BC96EC7761F2”, …}

  15. 13: {uuid: β€œ47DFBDF0-D3FC-4807-B638-49AC38075437”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ18AFC9F7-421A-4929-B053-FB26DAFE8C62”, …}

  16. 14: {uuid: β€œ07568C8C-C9D7-41EB-9F5A-8A772B4B1109”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œE3C73069-24E9-47CC-B376-2C9C69721564”, …}

  17. 15: {uuid: β€œ35E4567B-35CE-4C79-9D8E-DD2C76DD41EE”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ9CF6FC30-993C-4874-AC28-3D32330DEBDC”, …}

  18. 16: {uuid: β€œ676E1ACF-0C65-4FA4-8B03-BFEDA0EA8519”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ894CBB87-EE0D-499E-B448-55632A0045E8”, …}

  19. 17: {uuid: β€œ31751314-2708-44AF-9925-C63771833C20”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œEE164A83-AD9C-49CD-8F32-3D29474441C7”, …}

  20. 18: {uuid: β€œF78C06AD-A6B7-4518-BCE4-A63E5A6283ED”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œ3DBDDA88-9908-42E4-B6CE-BB575FC2B983”, …}

  21. 19: {uuid: β€œ165E06BC-CA74-4403-B2CB-5D4650D7D6ED”, type: β€œMesh”, layers: 1, matrix: Array(16), geometry: β€œA51CFA81-69BD-4BD9-BA18-E32574A7BB46”, …}

  22. length: 20

uids in loader.parse:

  1. children: Array(10)

  2. 0: Mesh {uuid: β€œ99940F9E-490F-471A-B887-2538A521B8F0”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  3. 1: Mesh {uuid: β€œB8361E5A-73CA-4C9B-B8C7-A41D55DDDD2C”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  4. 2: Mesh {uuid: β€œ09512D18-36C4-42DB-A85E-70D715D81706”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  5. 3: Mesh {uuid: β€œ0EB92247-A3D7-45F7-B641-524BBDC56963”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  6. 4: Mesh {uuid: β€œ214B09EC-0200-4390-94AF-9DB606E8DE25”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  7. 5: Mesh {uuid: β€œC0B9CEF2-1272-4733-96C5-FD4A4BC84D5C”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  8. 6: Mesh {uuid: β€œ47DFBDF0-D3FC-4807-B638-49AC38075437”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  9. 7: Mesh {uuid: β€œ35E4567B-35CE-4C79-9D8E-DD2C76DD41EE”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  10. 8: Mesh {uuid: β€œ31751314-2708-44AF-9925-C63771833C20”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  11. 9: Mesh {uuid: β€œ165E06BC-CA74-4403-B2CB-5D4650D7D6ED”, name: β€œβ€, type: β€œMesh”, parent: Group, children: Array(0), …}

  12. length:

Hi, your problem is that geometry.add in that loop, removes the child from the parent, and therefore out of the children array, which means the array is suddenly one shorter and obj.children[i] is now pointing to the next object already.

As you can see that causes you to skip one object every time, which is indeed what you are seeing. Easiest way out imho is:

var objectsToMove = [];
for(var i=0; i<obj.children.length; i++){
   objectsToMove.push(obj.children[i]);
}
objectsToMove.forEach(obj => geometry.add(obj));

That should fix your problem.

1 Like

Thanks a lot for the quick help and solution! This solved my problem. Good to know that geometry.add works that way!