【问题标题】:Mirror an SCNGeometry in SceneKit在 SceneKit 中镜像 SCNGeometry
【发布时间】:2014-08-04 17:26:49
【问题描述】:

我正在使用 Apple 的 SceneKit 库制作一个简单的赛车游戏。我已经模拟了赛道的左转部分。我能够成功地将模型加载到我可以渲染的 SCNGeometry 中。但是,我希望能够将此模型用于左转和右转段。为此,我需要将 SCNGeometry 镜像到 y-z 平面上,尽管我终生无法弄清楚如何做。

在 SpriteKit 中,可以通过将相应的 SKNode 的比例设置为 -1 来镜像精灵。但是,如果我将 SCNGeometry 的 SCNNode 的 x 比例设置为 -1,则 SCNGeometry 根本不会渲染。虽然我可以在我的建模软件中镜像模型,但我不希望有两个基本相同的模型。任何建议将不胜感激。

【问题讨论】:

  • 由于这里没有代码,也没有提及您使用的是哪种语言,而且问题是特定于 SceneKit 的,因此似乎不需要objective-c 和 swift 关键字。
  • 很公平,我删除了这些标签

标签: scenekit


【解决方案1】:

好吧,事实证明将 SCNNode 的 x 比例设置为 -1 确实反映了 SCNGeometry。问题是,当 SCNGeometry 以这种方式镜像时,所有面都指向内部而不是向外,因此不会渲染任何面。如果更改对象的材质以剔除正面而不是背面,则 SCNGeometry 将按预期进行镜像。

【讨论】:

  • 是的。面方向基于顶点的缠绕顺序。如果你对一个多边形进行一次镜像,CCW 绕组将变为顺时针方向,因此前变为后。
【解决方案2】:

如果你不想改变几何,而只是改变纹理,你可以这样做:

let flip = SCNMatrix4Translate(
        SCNMatrix4Scale(material.diffuse.contentsTransform, 1.0, -1.0, 1.0),
        0, 1, 0
    )
material.diffuse.contentsTransform = flip

或直接,

material.diffuse.contentsTransform = SCNMatrix4FromGLKMatrix4(GLKMatrix4(m: (
  -1.0, 0.0, 0.0, 0.0,
  0.0, 1.0, 0.0, 0.0,
  0.0, 0.0, 1.0, 0.0,
  -1.0, 0.0, 0.0, 1.0
)))

这将用1-x 替换纹理x 坐标,这应该会翻转它。我玩过着色器,我相信显示 SceneKit 如何使用内容转换的相关着色器代码是

v_texcoord0 = (u_diffuseTextureMatrix * vec4(_geometry.texcoords[0], 0., 1.)).xy;

(see here)

【讨论】:

    【解决方案3】:

    当您将几何体缩放到任何“-”负值时,它会翻转法线面。正常面的默认值为“单面” 将“材料”属性设置为“双面”

    用swift它可能看起来像这样

    yourNode.geometry?.firstMaterial?.doubleSided = true
    

    【讨论】:

      猜你喜欢
      • 2015-06-15
      • 2018-05-07
      • 2021-11-27
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2014-08-06
      相关资源
      最近更新 更多