我有一个在
SCNPlane
编辑器中创建的 SceneKit
,我希望飞机的一侧有某个图像,而飞机的另一侧有另一个图像。我如何在 Scenekit
编辑器中做到这一点
到目前为止,我尝试做的是向飞机添加 2 种材质。我尝试添加 2 种材质并取消选中
double-sided
,但这不起作用。
如有任何帮助,我们将不胜感激!
SCNPlane
文档:
表面是单面的。其表面法向量指向其局部坐标空间的 z 轴正方向,因此默认情况下仅从该方向可见。要渲染平面的两侧,请将其材质的
属性设置为 true 或创建两个平面几何图形并将它们背对背定向。isDoubleSided
这意味着平面只有一种材质 -
isDoubleSided
是材质的一种属性,可以让一种材质在表面的两侧渲染,但是您无法对一种材质将其变成两种材质。
如果您想要具有两种材料的平坦表面,您可以按照文档的建议将两个平面背靠背排列。让它们成为包含节点的子节点,然后您可以使用它来将它们移动到一起。或者你可以制作一个在一维上非常薄的
SCNBox
。
这样做非常简单且常见,你只需将后部作为孩子添加即可。
要明确的是,节点(以及您添加的后部)都应该使用单面着色器。
很明显,后面你在另一个方向加点!
请注意,它们确实位于“完全相同的位置”。有时,刚接触 3D 网格的人认为两个网格需要“稍微分开”,但事实并非如此。
public var rear = SCNNode()
private var theRearPlane = SCNPlane()
private func addRear() {
addChildNode(rear)
rear.eulerAngles = SCNVector3(0, CGFloat.pi, 0)
theRearPlane. //... set width, height etc
theRearPlane.firstMaterial?.isDoubleSided = false
rear.geometry = theRearPlane
rear.geometry?.firstMaterial!.diffuse.contents = //.. your rear image/etc
}
所以...
///Double-sided sprite
class SCNTwoSidedNode: SCNNode {
public var rear = SCNNode()
private var thePlane = SCNPlane()
override init() {
super.init()
thePlane. //.. set size, etc
thePlane.firstMaterial?.isDoubleSided = false
thePlane.firstMaterial?.transparencyMode = .aOne
geometry = thePlane
addRear()
}
消费代码可以直接参考
.rear
,例如,
playerNode. //... the drawing of the Druid
playerNode.rear. //... Druid rules and abilities text
enemyNode. //... the drawing of the Mage
enemyNode.rear. //... Mage rules and abilities text
这是微不足道的。 只需将后部添加为子项。 将子项在 Y 上旋转 180 度。
就这么简单。
将它们做成单面,并在正面和背面放置任何您想要的东西。
只需正常移动主要部分(前面)即可,一切正常。