如何使用 2 种不同的材质为扫描平面着色?

问题描述 投票:0回答:2

我有一个在

SCNPlane
编辑器中创建的
SceneKit
,我希望飞机的一侧有某个图像,而飞机的另一侧有另一个图像。我如何在
Scenekit
编辑器中做到这一点

到目前为止,我尝试做的是向飞机添加 2 种材质。我尝试添加 2 种材质并取消选中

double-sided
,但这不起作用。

如有任何帮助,我们将不胜感激!

scenekit
2个回答
3
投票

根据

SCNPlane
文档:

表面是单面的。其表面法向量指向其局部坐标空间的 z 轴正方向,因此默认情况下仅从该方向可见。要渲染平面的两侧,请将其材质的

isDoubleSided
属性设置为 true 或创建两个平面几何图形并将它们背对背定向。

这意味着平面只有一种材质 -

isDoubleSided
是材质的一种属性,可以让一种材质在表面的两侧渲染,但是您无法对一种材质将其变成两种材质。

如果您想要具有两种材料的平坦表面,您可以按照文档的建议将两个平面背靠背排列。让它们成为包含节点的子节点,然后您可以使用它来将它们移动到一起。或者你可以制作一个在一维上非常薄的

SCNBox


1
投票

2022 年很容易做到。

这样做非常简单且常见,你只需将后部作为孩子添加即可

要明确的是,节点(以及您添加的后部)都应该使用单面着色器。

很明显,后面你在另一个方向加点!

请注意,它们确实位于“完全相同的位置”。有时,刚接触 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 度。

就这么简单。

将它们做成单面,并在正面和背面放置任何您想要的东西。

只需正常移动主要部分(前面)即可,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.