【问题标题】:How to color a 3D object with slide/tap (dynamically) in Swift 2.1如何在 Swift 2.1 中使用滑动/点击(动态)为 3D 对象着色
【发布时间】:2016-04-03 14:02:27
【问题描述】:

我必须构建一个可以用各种手势为 3D 对象着色的 Swift 应用程序。我有一个作为 SceneKit 对象导入的 Collada 文件。我找不到用水龙头给它上色的方法。我尝试从 WWDC 示例转换 Obj-C,但它不适合我。

我尝试在 3D 对象上应用 SpriteKit 作为纹理,但结果如下:

当用户点击屏幕时,应用程序应该获取 3D 对象纹理的坐标,然后在该点添加一个 SpriteKit 节点。

之前:

之后:

我不知道为什么纹理会以这种方式爆炸。

谢谢!

【问题讨论】:

    标签: swift 3d sprite-kit textures scenekit


    【解决方案1】:

    SpriteKit 场景坐标系统不会像图像那样映射到纹理坐标。图像中的像素坐标具有向下增加的 y 轴;在 SpriteKit 场景中,y 轴向上。

    如果您只是将 SpriteKit 场景映射到 SCNPlane 上,这一点会更加明显,这是 SceneKit 场景中唯一的东西 - 您会看到图像被翻转了。

    左:从包加载的图像,右:填充SKScene 的图像映射到平面(带有注释)

    要解决此问题,您需要两步坐标转换:

    1. 将原点 y 坐标向上平移 SKScene 的高度
    2. 将 y 坐标按 -1 缩放,这样增加的坐标会向下,而不是向上

    您可以在SKSceneSCNMaterialProperty 中执行此操作,将 SpriteKit 内容纹理映射到 SceneKit 对象。我赞成SCNMaterialProperty 方法——只需为其contentsTransform 属性设置适当的矩阵:

    let translate = SCNMatrix4MakeTranslation(0, 1, 0)
    let yFlippedTranslate = SCNMatrix4Scale(translate, 1, -1, 1)
    material.diffuse.contentsTransform = yFlippedTranslate
    

    请注意,如果您还尝试使用材质的纹理坐标(通过SCNHitTestResult)将触摸/点击事件映射到 SpriteKit 场景,则需要在此处执行类似的转换:

    let texcoord = result.textureCoordinatesWithMappingChannel(0)
    sprite.position.x = texcoord.x * skScene.size.width
    sprite.position.y = (1 - texcoord.y) * skScene.size.height
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      相关资源
      最近更新 更多