我将COLLADA文件中的网格加载到SceneKit中。假设我有一个具有特定纹理的材质的立方体。然后在代码中,我想制作这个SCNNode的新副本 - 到目前为止我使用过clone
- 然后我需要设置一个新的纹理。这就是问题所在,因为如果我获得其中一个克隆立方体的命名材料并更新其纹理(thematerialofmycube.diffuse.contents = @"somefile.png"
),则会将相同的纹理设置为多维数据集的所有实例。 clone
显然不会深刻复制几何,材质和纹理等内容。所以我尝试过制作几何体本身的副本,并尝试制作新材质,为新材质设置新纹理,并将该材质添加到新几何体的材质数组中,同时还删除旧材质。似乎没有直接的方式这样做(材料被命名,但存在于一个数组中,因此理论上几个材料可能具有相同的名称 - 这导致一些庞大的添加/从数组中删除对象),以及我这样做,新的纹理出现了,但它们显示颠倒,并且材料的顺序似乎不正确,因为我得到“背面”纹理代替正面纹理,反之亦然。我希望我不必在我的3D编辑器中绘制所有这些内容,必须有一种很好的方法在代码中使用任意指定的纹理创建新实例。
我特意做的是在3D编辑器中画了一张王牌,并将其导出到COLLADA。现在我有52张特朗普卡面 - 我显然需要更换新王牌的面孔。
答案 0 :(得分:1)
似乎该阵列中材料的顺序非常重要。如果我将新材质与更新的纹理插入到与我删除的相同的数组索引中,基本上进行替换,那么纹理会显示在正确的面上并且不会颠倒 - 即它们显示在同一个与源SCNNode一样的方式。我还没有运行这个问题很长时间,看看这是否能够保持一致。
答案 1 :(得分:1)
[SCNNode clone]出于效率原因这样做。试试这段代码(如果你想制作一个SCNNode类别:
//********************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// SCNNode duplicate
//********************************************************
//<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- (SCNNode *)duplicateNode:(SCNNode *)node
{
SCNNode *newNode = [node clone];
newNode.geometry = [node.geometry copy];
newNode.geometry.firstMaterial = [node.geometry.firstMaterial copy];
return newNode;
}
答案 2 :(得分:1)
快速回答:
condition_for_X = conditionX(output_A) # e.g. tf.less(tf.reduce_sum(output_A), -1.)
condition_for_Y = conditionX(output_A) # e.g. tf.greater_equal(tf.reduce_sum(output_A), 1.)
def use_X(): return model_X(output_A)
def use_Y(): return model_Y(output_A)
def use_Z(): return model_Z(output_A)
result = tf.case({condition_for_X: use_X, condition_for_Y : use_Y},
default=use_Z, exclusive=True)
答案 3 :(得分:0)
问这个问题已经很久了。但我想我会提供一个辅助功能:
func deepCopyNode(_ node: SCNNode) -> SCNNode {
// internal function for recurrsive calls
func deepCopyInternals(_ node: SCNNode) {
node.geometry = node.geometry?.copy() as? SCNGeometry
if let g = node.geometry {
node.geometry?.materials = g.materials.map { $0.copy() as! SCNMaterial }
}
for child in node.childNodes {
deepCopyInternals(child)
}
}
// CLONE main node (and all kids)
// issue here is that both geometry and materials are linked
// still. In our deepCopyNode we want new copies of everything
let clone = node.clone()
// we use this internal function to update both
// geometry and materials, as well as process all children
// this is the *deep* part of "deepCopy"
deepCopyInternals(clone)
return clone
}