当前位置: 首页 > 面试题库 >

SCNBox每个面上的颜色或纹理不同

辛成周
2023-03-14
问题内容

我是iOS开发的新手,但我陷入了困境。我正在尝试使用每个面都有不同颜色的SceneKit渲染立方体。

到目前为止,这是我得到的:

func sceneSetup() {
    // 1
    let scene = SCNScene()

    // 2
    let BoxGeometry = SCNBox(width: 0.9, height: 0.9, length: 0.9, chamferRadius: 0.0)

    BoxGeometry.firstMaterial?.diffuse.contents = UIColor.redColor()
    let cube = SCNNode(geometry: BoxGeometry)
    cube.position = SCNVector3(x: 0, y: 0, z: -1)
    scene.rootNode.addChildNode(cube)

    // 3
    sceneView.scene = scene
    sceneView.autoenablesDefaultLighting = true
    sceneView.allowsCameraControl = true

但是我希望每张脸都有不同的颜色。我怎么做?


问题答案:

该盒子由六个不同的元素组成(每侧一个)。您可能还已经注意到,几何对象具有 第一种 材料的一个属性,但也具有一系列材料的属性。

具有多个元素和多种材质的对象将选择每个元素的材质增量(并环绕)。

例如4种元素和1种材料

Element   1  2  3  4
Material  1  1  1  1

或4种元素和2种材料

Element   1  2  3  4
Material  1  2  1  2  // note that they are repeating

例如4种元素和7种材料

Element   1  2  3  4
Material  1  2  3  4  // (5, 6, 7) is unused

对于盒子来说,这意味着您可以使用六种材料组成的阵列在盒子的每一侧上具有唯一的材料。我的场景工具包(在Objective-
C中)的其中一章的示例代码中有一个这样的示例:

// Each side of the box has its own color
// --------------------------------------
// All have the same diffuse and ambient colors to show the
// effect of the ambient light, even with these materials.

SCNMaterial *greenMaterial              = [SCNMaterial material];
greenMaterial.diffuse.contents          = [NSColor greenColor];
greenMaterial.locksAmbientWithDiffuse   = YES;

SCNMaterial *redMaterial                = [SCNMaterial material];
redMaterial.diffuse.contents            = [NSColor redColor];
redMaterial.locksAmbientWithDiffuse     = YES;

SCNMaterial *blueMaterial               = [SCNMaterial material];
blueMaterial.diffuse.contents           = [NSColor blueColor];
blueMaterial.locksAmbientWithDiffuse    = YES;

SCNMaterial *yellowMaterial             = [SCNMaterial material];
yellowMaterial.diffuse.contents         = [NSColor yellowColor];
yellowMaterial.locksAmbientWithDiffuse  = YES;

SCNMaterial *purpleMaterial             = [SCNMaterial material];
purpleMaterial.diffuse.contents         = [NSColor purpleColor];
purpleMaterial.locksAmbientWithDiffuse  = YES;

SCNMaterial *magentaMaterial            = [SCNMaterial material];
magentaMaterial.diffuse.contents        = [NSColor magentaColor];
magentaMaterial.locksAmbientWithDiffuse = YES;


box.materials =  @[greenMaterial,  redMaterial,    blueMaterial,
                   yellowMaterial, purpleMaterial, magentaMaterial];


 类似资料:
  • 之前用过了静态的纹理设置材质,这次来尝试一下动态的变换,这次来尝试颜色变换 先创建工程,步骤略 添加一个管线,参考官方示例Polyline Volume,每个示例的代码,都用一下,说不定学到点新东西呢~ (#^.^#) 这里按理说应该是要给纹理赋值了,要它动态变化,一般有两种思路,其一是赋值一次,然后之后用代码(定时器)动态修改材质,其二是使用回调,在上一篇鹰眼图中尝试过,发现回调效果比较好,不会

  • 主要的cpp 附言 输入布局(顶点属性)工作正常。TexIndex已正确传输。1.0f和0.0f 但问题是 //片段着色器 两者都返回相同的纹理颜色,但它实际上与test1的纹理不同。png和test2。巴布亚新几内亚。我的代码有什么问题? 我试着跟随@rabbi76的答案 已应用颜色,但仍从同一纹理采样。看起来有点像glActiveTexture(i);没用。 ps.test1。png和test

  • 问题内容: 如果折线图中的数据点高于某个特定值,是否可以为该数据点设置其他颜色? 问题答案: 对于chartjs 2.0,请参见以下答案。 下面是原始答案。 关于ChartJS的好问题。我一直想做类似的事情。即动态地将点颜色更改为其他颜色。您在下面尝试过此吗?我只是尝试过,它对我有用。 试试这个: 或尝试以下方法: 甚至这个: 然后执行以下操作: 我想你可能会喜欢 仍然尝试一下。

  • 我在做某种“游戏分数追踪器”。以下是该应用程序当前的工作方式: 用户通过在EditText中键入名称,然后单击“确定”按钮来添加播放机。 用户添加完新玩家后,按“开始游戏”按钮,新活动将打开。 玩家将被添加到可参与的额外活动中,并被带到下一个活动中。 在下一个活动中,用户有一个spinner、EditText和+、-按钮。当用户从旋转器中选择某个玩家,输入某个分数,然后输入+或-后,将出现一个新的

  • 我正在尝试渲染一个简单的3D场景。它基本上是一个包裹在纹理中的表面。我在4台设备上测试了它,只有一台(Galaxy Note 4)正确渲染了纹理。其他三款手机(HTC Evo 3D、LG G2、索尼Xperia Z1)用一种颜色渲染所有纹理,这似乎是纹理的平均颜色。例如:原始图像和渲染纹理。 我的第一个猜测是我的碎片着色器有问题。但它非常基本,是从《Android版OpenGL ES 2》一书中复

  • 我正在使用 LWJGL(适用于 Java 的开放GL)库进行纹理映射。以下是从文件中读取图像的代码: 以字节数组形式获取数据栅格(图像像素)的代码: 现在,创建“bytePixels”数组并将其放入字节缓冲区的代码: 这里用于将所有这些绑定到缓冲区: 问题是,图像纹理的颜色与原始图像颜色不同! 原始图片: 纹理图像: 这个答案OpenGL渲染纹理与原始图像颜色不同?,不能解决这个问题,因为在lwj