【问题标题】:Rotate my SceneKit material旋转我的 SceneKit 材质
【发布时间】:2017-07-31 00:55:39
【问题描述】:

我正在使用 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)

sceneSpacePositioncan be found here on SO 将 CoreMotion 映射到 SceneKit 方向的一段代码。它用于放置矩形,它确实以正确的大小出现在正确的位置。都很酷。

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

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

这不起作用属性;生成的图像无法识别。似乎图像的一小部分已被拉伸到很大的尺寸。我认为这可能是轴,但我尝试了所有三个结果相同。

有什么想法吗?

【问题讨论】:

  • 我不熟悉 SceneKit 但可能是图像(纹理)不是在其中心而是在其一个角上旋转,除非您的图像是一个完美的正方形,否则它可能是旋转后使用拉伸/平铺渲染,这可能会产生奇怪的结果?

标签: ios scenekit


【解决方案1】:

按照 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

【讨论】:

  • 我实现了这个,发现图像是颠倒的——正确的旋转应该是 -pi/2 。所以我将旋转更改为 -pi/2,此时它再次在空间中关闭。
  • 抱歉,我想编辑上一条消息但花了很长时间。在考虑了一下之后,我看到了这个问题 - 在这种情况下,翻译是 -1,0,0。可以了,谢谢!
  • 对于任何试图在 Apple Silicon M1 上执行此操作的人,这都会导致崩溃。请通过反馈助手报告。对我有用的解决方法是不进行平移,而只需将变换设置为旋转,如上所示。
  • 非常有趣... M1 修复了这个问题吗?我一直想知道 SceneKit 的兼容性如何。您无法在非 M1 设备上重现错误吗?我假设您使用的是 M1 iPad,或者这是用于 macOS 的?
  • 我使用的是 M1,但在使用 SceneKit 时遇到了一些问题。
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2019-02-19
  • 2019-08-25
  • 2017-01-13
  • 2018-03-25
  • 2018-07-06
  • 2020-08-28
相关资源
最近更新 更多