在SceneKit中镜像SCNGeometry

时间:2014-06-14 06:51:20

标签: scenekit

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果您不想更改几何图形,只需更改纹理,则可以执行以下操作:

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
)))

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

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

see here

答案 2 :(得分:0)

将几何体缩放到任何" - "否定它翻转法线面。普通人脸的默认值是"单面" 设置"材料"属于"双面"

使用swift它可能看起来像这样

yourNode.geometry?.firstMaterial?.doubleSided = true