如何在Swift 2.1中使用滑动/点击(动态)为3D对象着色
我必须建立一个Swift应用程序,可以用各种手势给3D物体上色。我有一个作为SceneKit对象导入的Collada文件。我找不到办法用水龙头给它上色。我试图从WWDC示例中转换Obj-C,但它对我不起作用 我尝试在3D对象上应用SpriteKit作为纹理,但结果是: 当用户点击屏幕时,应用程序应该获取3D对象纹理的坐标,然后在该点添加一个SpriteKit节点 之前: 之后: 我不知道为什么纹理会那样爆炸如何在Swift 2.1中使用滑动/点击(动态)为3D对象着色,swift,3d,sprite-kit,textures,scenekit,Swift,3d,Sprite Kit,Textures,Scenekit,我必须建立一个Swift应用程序,可以用各种手势给3D物体上色。我有一个作为SceneKit对象导入的Collada文件。我找不到办法用水龙头给它上色。我试图从WWDC示例中转换Obj-C,但它对我不起作用 我尝试在3D对象上应用SpriteKit作为纹理,但结果是: 当用户点击屏幕时,应用程序应该获取3D对象纹理的坐标,然后在该点添加一个SpriteKit节点 之前: 之后: 我不知道为什么纹理会那样爆炸 谢谢大家! SpriteKit场景坐标系不会像图像那样映射到纹理坐标。图像中的像素坐
谢谢大家! SpriteKit场景坐标系不会像图像那样映射到纹理坐标。图像中的像素坐标具有向下增加的y轴;在SpriteKit场景中,y轴向上 如果您只需将SpriteKit场景映射到
SCNPlane
上,这一点会更加明显,因为这是SceneKit场景中唯一的一件事-您将看到图像被翻转
左:图像从束中加载,右:图像填充映射到平面的SKScene
(带注释)
要解决此问题,需要两步坐标变换:
sk场景的高度
SKScene
中执行此操作,也可以在SCNMaterialProperty
中执行此操作,该属性将SpriteKit内容纹理映射到SceneKit对象上。我赞成SCNMaterialProperty
方法-只需为其属性设置适当的矩阵:
let translate = SCNMatrix4MakeTranslation(0, 1, 0)
let yFlippedTranslate = SCNMatrix4Scale(translate, 1, -1, 1)
material.diffuse.contentsTransform = yFlippedTranslate
请注意,如果您还试图使用材质的纹理坐标(通过scnhittstresult
)将触摸/单击事件映射到SpriteKit场景中,则需要在该场景中执行类似的转换:
let texcoord = result.textureCoordinatesWithMappingChannel(0)
sprite.position.x = texcoord.x * skScene.size.width
sprite.position.y = (1 - texcoord.y) * skScene.size.height