在 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的主要内容,如果未能解决你的问题,请参考以下文章