2017-03-09 119 views
1

我正在与AVCapturePhotoOutput图像,然后使用他们的JPEG表示作为上的SceneKit SCNPlane纹理也就是相同的纵横比的图像:旋转我SceneKit材料

let image = UIImage(data: dataImage!) 
let rectangle = SCNPlane(width:9, height:12) 
let rectmaterial = SCNMaterial() 
rectmaterial.diffuse.contents = image 
rectmaterial.isDoubleSided = true 
rectangle.materials = [rectmaterial] 
let rectnode = SCNNode(geometry: rectangle) 
let pos = sceneSpacePosition(inFrontOf: self.pictCamera, atDistance: 16.5) // 16.5 is arbitrary, but makes the rectangle the same size as the camera 
rectnode.position = pos 
rectnode.orientation = self.pictCamera.orientation 
pictView.scene?.rootNode.addChildNode(rectnode) 

sceneSpacePosition是有点的代码即将CoreMotion映射到SceneKit方向的can be found here on SO。它用于放置矩形,它确实出现在正确的位置,尺寸正确。非常酷。

问题是图像旋转90度到矩形。所以我做了很明显的事情:

rectmaterial.diffuse.contentsTransform = SCNMatrix4MakeRotation(Float.pi/2, 0, 0, 1) 

这是行不通的属性;结果图像无法识别。看起来,图像的一小部分已被拉伸到一个巨大的尺寸。我认为这可能是轴心,但我尝试了所有三个结果相同。

任何想法?

+0

我不熟悉SceneKit但会不会是图像(纹理)是不是在它的中心,但它的一个角落和旋转,除非你的形象是完美的正方形,它可以用拉伸/平铺一次旋转渲染,这可能会产生奇怪的结果? –

回答

3

您正在按照Alain T的建议在左上角旋转。 如果您向下移动图像,您可能会获得您期望的旋转。

试试这个:

let translation = SCNMatrix4MakeTranslation(0, -1, 0) 
let rotation = SCNMatrix4MakeRotation(Float.pi/2, 0, 0, 1) 
let transform = SCNMatrix4Mult(translation, rotation) 
rectmaterial.diffuse.contentsTransform = transform 
+0

我实现了这一点,发现图像颠倒 - 正确的旋转将是-pi/2。于是我将旋转改为-pi/2,此时它再次在空间中关闭。 –

+0

对不起,我想编辑以前的消息,但花了很长时间。在想了一下之后,我发现了这个问题 - 在这种情况下,翻译为-1,0,0。它在工作,谢谢! –