SceneKit,SCNMaterial的翻转方向

时间:2015-10-22 15:27:45

标签: ios uiimage scenekit material ciimage

对SceneKit来说非常新,所以只需在这里寻求帮助:

我有一个SCNSphere,其中心有一个摄像头

我创建了一个SCNMaterial,doubleSided,并将其分配给球体

由于相机位于中央,因此图像看起来垂直翻转,当文本内部完全混乱时。

那么我如何翻转素材或图像(虽然后来它将是视频中的帧),欢迎任何其他建议。

这个解决方案,顺便说一下,我失败了,normalImage作为一种材料应用(但是从球体内部看时图像被翻转),但是分配flippedImage结果没有任何材料(白色屏幕)

    let normalImage = UIImage(named: "text2.png")
    let ciimage = CIImage(CGImage: normalImage!.CGImage!)
    let flippeCIImage = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))
    let flippedImage = UIImage(CIImage: flippeCIImage, scale: 1.0, orientation: .Left)

    sceneMaterial.diffuse.contents = flippedImage
    sceneMaterial.specular.contents = UIColor.whiteColor()
    sceneMaterial.doubleSided = true
    sceneMaterial.shininess = 0.5

4 个答案:

答案 0 :(得分:13)

您可以使用SCNMaterialProperty的contentsTransform属性来翻转映射,而不是缩放节点(可能会破坏您的光照):

material.diffuse.contentsTransform = SCNMatrix4MakeScale(1,-1,1)
material.diffuse.wrapT = SCNWrapModeRepeat // or translate contentsTransform by (0,1,0)

答案 1 :(得分:11)

水平翻转图像:

material.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(-1, 1, 1), 1, 0, 0)

垂直翻转:

material.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)

答案 2 :(得分:4)

这对我有用,通过缩放它附加到的节点来翻转几何体的法线:

sphereNode.scale = SCNVector3Make(-1,1,1)

答案 3 :(得分:0)

接受的答案不起作用,保证。以下是如何翻转指定为[material] .diffuse.contents属性值的图像;它假设场景中有两个立方体,并排:

// Define the matrices that perform the two orientation variants
SCNMatrix4 flip_horizontal;
flip_horizontal = SCNMatrix4Translate(SCNMatrix4MakeScale(-1, 1, 1), 1, 0, 0);
SCNMatrix4 flip_vertical;
flip_vertical = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0);

// Create the material objects for each cube, and assign an image as the contents
self.source_material = [SCNMaterial material];
self.source_material.diffuse.contents = [UIImage imageNamed:@"towelface.png"];
self.mirror_material = [SCNMaterial material];
self.mirror_material.diffuse.contents = self.source_material.diffuse.contents;

仅选择以下部分之一(由评论定义):

// PortraitOpposingDown
    [self.mirror_material.diffuse setContentsTransform:SCNMatrix4Mult(self.source_material.diffuse.contentsTransform, flip_vertical)];
        [self.source_material.diffuse setContentsTransform:SCNMatrix4Mult(self.mirror_material.diffuse.contentsTransform, flip_horizontal)]; 

// PortraitFacingDown
    [self.source_material.diffuse setContentsTransform:SCNMatrix4Mult(self.source_material.diffuse.contentsTransform, flip_vertical)];
    [self.mirror_material.diffuse setContentsTransform:SCNMatrix4Mult(self.source_material.diffuse.contentsTransform, flip_horizontal)];

// PortraitOpposingUp
    [self.source_material.diffuse setContentsTransform:SCNMatrix4Mult(self.source_material.diffuse.contentsTransform, flip_horizontal)];

// PortraitFacingUp
    [self.mirror_material.diffuse setContentsTransform:SCNMatrix4Mult(self.source_material.diffuse.contentsTransform, flip_horizontal)];

将材料插入所需的索引:

[cube[0] insertMaterial:self.source_material atIndex:0];
[cube[1] insertMaterial:self.mirror_material atIndex:0];

顺便说一下,要插入新图像(例如直播视频),只需替换insertMaterial:atIndex方法指定的索引处的素材;不要重新定位contentsTransform。以下代码向您展示了如何;它假定您的摄像机配置为为其捕获的每个帧输出一个样本缓冲区AVCaptureVideoDataOutputSampleBufferDelegate,并从{{1}创建CreateCGImageFromCVPixelBuffer所需的代码(CGImage) }}:

CVPixelBuffer

如果您想要实际代码而不是我的代码假设,请询问。 Here's a short video showing this code in action,但使用实时视频而非静态图片。