在 SceneKit 中镜像 SCNGeometry

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于在 SceneKit 中镜像 SCNGeometry的主要内容,如果未能解决你的问题,请参考以下文章

将scenekit和spritekit组合在一个屏幕中

如何在 SceneKit 中使用 SCNBufferBindingBlock?

Scenekit 在 obj 文件中转换场景

在 SceneKit 中加速渲染

如何在 SceneKit 中显示金属和透明纹理?

在 SceneKit 中播放视频的最佳方式是啥?