我已经使用scenejs框架创建了一个webgl动画。因为它将包含许多相同的元素,所以我希望最小化使用的代码量,并尽可能多地重用这些元素。
首先,我将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功能方面的预期工作?
发布于 2011-05-29 05:42:34
嘿,SceneJS,你在SceneJS解析JSON的方式中发现了一个bug --当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
https://stackoverflow.com/questions/6163982
复制相似问题