Повторное использование узлов объектов JSON с SceneJS
Я создал анимацию webgl с использованием фреймворка scenejs. Поскольку он будет содержать много идентичных элементов, я хочу минимизировать объем используемого кода и максимально использовать элементы повторно.
Во-первых, у меня есть diskJSON, определенный следующим образом:
var diskJSON = [{
type: "disk",
radius: 3,
inner_radius: 2}];
Когда я запускаю следующий код с sceneJS, он работает нормально.
{
type: "material",
emit: 0,
baseColor: {
r: 0.3,
g: 0.3,
b: 0.9
},
specularColor: {
r: 0.9,
g: 0.9,
b: 0.9
},
specular: 0.9,
shine: 100.0,
nodes: [ {
type: "translate",
x:10,
y:1,
nodes: [
{
type: "translate",
z:speedMultiplier*0.8,
nodes:[{
type: "disk",
radius: 3,
inner_radius: 2
}]
},
{
type: "translate",
z:speedMultiplier*9.8,
nodes:[{
type: "disk",
radius: 3,
inner_radius: 2
}]
},
{
type: "translate",
z:speedMultiplier*11.64,
nodes:[{
type: "disk",
radius: 3,
inner_radius: 2
}]
},
{
type: "translate",
z:speedMultiplier*13.32,
nodes:[{
type: "disk",
radius: 3,
inner_radius: 2
}]
}
]
}
]
}
Однако, когда я пытаюсь повторно использовать тот же diskJSON, как определено ранее, он создает только один узел вместо 4:
{
type: "material",
emit: 0,
baseColor: {
r: 0.3,
g: 0.3,
b: 0.9
},
specularColor: {
r: 0.9,
g: 0.9,
b: 0.9
},
specular: 0.9,
shine: 100.0,
nodes: [ {
type: "translate",
x:10,
y:1,
nodes: [
{
type: "translate",
z:speedMultiplier*0.8,
nodes:diskJSON
},
{
type: "translate",
z:speedMultiplier*9.8,
nodes:diskJSON
},
{
type: "translate",
z:speedMultiplier*11.64,
nodes:diskJSON
},
{
type: "translate",
z:speedMultiplier*13.32,
nodes:diskJSON
}
]
}
]
}
Приложение будет иметь тысячи таких узлов, поэтому необходимость переопределять его каждый раз кажется довольно бесполезной. Это проблема с scenejs или это работает так, как задумано в отношении функциональности Javascript/JSON?
1 ответ
Привет, Никлас, ты нашел ошибку в том, как SceneJS анализирует JSON - SceneJS отмечает объекты узлов как посещенные на карте, пока DFS их обходит. Таким образом, в этом случае он помечает ваш "дисковый" узел один раз, когда он анализирует его, а затем никогда не анализирует его снова.
Возникли проблемы здесь: https://github.com/xeolabs/scenejs/issues/99
Исправление этого в качестве приоритета.
А пока вы можете использовать фабричную функцию:
function newDiskJSON () {return [{type: "disk", radius: 3, inner_radius: 2}]; };
//...
nodes: [
{
type: "translate",
z:speedMultiplier*0.8,
nodes: newDiskJSON()
// ...
Или используйте узел "instance":
http://scenejs.wikispaces.com/instance
ура, LK