旋转我的 SceneKit 材质

4

我正在使用AVCapturePhotoOutput拍摄图像,然后将它们的JPEG表示形式用作SceneKit SCNPlane上的纹理,该纹理与图像具有相同的宽高比:

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 是一段代码,可以在 SO 上找到,将 CoreMotion 映射到 SceneKit 方向。它用于放置矩形,在正确的位置和大小下确实出现了。非常酷。

问题是图像相对于矩形旋转了90度。所以我做了显而易见的:

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

这个不正常,生成的图片无法识别。似乎是图像的一小部分被拉伸到了巨大的尺寸。我以为可能是轴的问题,但我尝试了所有三个轴,结果都一样。

有任何想法吗?


我不太熟悉SceneKit,但是可能会出现这样的情况:图像(纹理)不是围绕其中心旋转而是围绕其中一个角落旋转,并且除非您的图像是完美的正方形,否则一旦旋转就会被渲染成拉伸/平铺,这可能会产生奇怪的结果。 - Alain T.
1个回答

15

根据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

1
我实现了这个功能,发现图像是倒置的 - 正确的旋转应该是 -pi/2。所以我将旋转改为 -pi/2,但此时它又在空间中偏移了。 - Maury Markowitz
2
抱歉,我想编辑之前的消息但花费了太长时间。经过一番思考,我发现问题所在——在那种情况下,翻译是-1,0,0。它正在工作,谢谢! - Maury Markowitz
1
对于任何试图在 Apple Silicon M1 上执行此操作的人来说,这会导致崩溃。请通过意见反馈报告。对我有效的解决方法是不进行翻译,而仅将转换设置为如上所示的旋转。 - Morten J
非常有趣...这个问题在M1上已经修复了吗?我一直在想SceneKit的兼容性如何。您无法在非M1设备上重现错误吗?我假设您正在使用M1 iPad,还是macOS? - Dan M
我正在使用M1,但在SceneKit方面遇到了一些问题。 - user3069232

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接