我必须建立一个快速的应用程序,可以用各种手势给3D物体上色。我有一个作为scenekit对象导入的collada文件。我找不到用丝锥给它上色的方法。我试图从WWDC示例转换obj-c,但它对我不起作用。
我尝试在3D对象上应用spritekit作为纹理,但结果是:
当用户点击屏幕时,应用程序应该获取3D对象纹理的坐标,然后添加一个spritekit节点。
之前:
swift - 如何在Swift 2.1中使用幻灯片/点击(动态)为3D对象着色-LMLPHP
后:
swift - 如何在Swift 2.1中使用幻灯片/点击(动态)为3D对象着色-LMLPHP
我不知道为什么纹理会那样爆炸。
谢谢您!

最佳答案

spritekit场景坐标系不能像图像那样映射到纹理坐标。图像中的像素坐标的y轴向下增加;在spritekit场景中,y轴向上增加。
如果只将spritekit场景映射到scenekit场景中的一个SCNPlane上,这就更明显了-您将看到图像被翻转。
左:从束加载的图像,右:图像填充映射到平面的SKScene
要解决此问题,需要进行两步坐标转换:
将原点Y坐标向上平移SKScene
按-1缩放Y坐标,使增加的坐标向下而不是向上。
您可以在纹理将spritekit内容映射到scenekit对象的SKSceneSCNMaterialProperty中执行此操作。我赞成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

10-04 22:29
查看更多