首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SceneKit + ARKit:无需摄像头滚动的广告牌

SceneKit + ARKit:无需摄像头滚动的广告牌
EN

Stack Overflow用户
提问于 2021-10-30 19:57:06
回答 1查看 63关注 0票数 1

我正在尝试使用SceneKit和ARKit绘制一个广告牌四边形。我有基本的广告牌工作,但是当我滚动相机时,广告牌也会旋转。当我将相机向左滚动时,这段视频显示了这一点(笑脸是广告牌):

相反,我希望广告牌仍然面对相机,但在场景中保持垂直方向,无论相机在做什么

下面是我计算广告牌的方法:

代码语言:javascript
复制
// inside frame update function

struct Vertex {
    var position: SIMD3<Float>
    var texCoord: SIMD2<Float>
}

let halfSize = Float(0.25)

let cameraNode = sceneView.scene.rootNode.childNodes.first!

let modelTransform = self.scnNode.simdWorldTransform
let viewTransform = cameraNode.simdWorldTransform.inverse
let modelViewTransform = viewTransform * modelTransform

let right = SIMD3<Float>(modelViewTransform[0][0], modelViewTransform[1][0], modelViewTransform[2][0]);
let up = SIMD3<Float>(modelViewTransform[0][1], modelViewTransform[1][1], modelViewTransform[2][1]);

// drawBuffer is a MTL buffer of vertex data
let data = drawBuffer.contents().bindMemory(to: ParticleVertex.self, capacity: 4)
data[0].position = (right + up) * halfSize
data[0].texCoord = SIMD2<Float>(0, 0)

data[1].position = -(right - up) * halfSize
data[1].texCoord = SIMD2<Float>(1, 0)

data[2].position = (right - up) * halfSize
data[2].texCoord = SIMD2<Float>(0, 1)

data[3].position = -(right + up) * halfSize
data[3].texCoord = SIMD2<Float>(1, 1)

同样,这使广告牌正确面对相机,但是当我滚动相机时,广告牌也随之旋转。

相反,我想要的是广告牌指向相机,但保持它在世界上的方向。对如何解决这个问题有什么建议吗?

注意,我的代码示例被简化了,所以我不能使用SCNBillboardConstraint或类似的东西;我需要能够自己计算广告牌

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-01 00:27:26

这是我想出的解决方案:创建一个新的节点,匹配相机的位置和旋转,但没有任何滚动:

代码语言:javascript
复制
let tempNode = SCNNode()
tempNode.simdWorldPosition = cameraNode.simdWorldPosition

// This changes the node's pitch and yaw, but not roll
tempNode.simdLook(at: cameraNode.simdConvertPosition(SIMD3<Float>(0, 0, 1), to: nil))

let view = tempNode.simdWorldTransform.inverse
let modelViewTransform = view * node.simdWorldTransform

这使广告牌在世界空间中指向上方,即使相机滚动也是如此。

实际上,我之前曾尝试通过设置tempNode.eulerAngles.z = 0来完成此操作,但这似乎以意想不到的方式影响了转换矩阵的其余部分

可能有一种方法可以在不创建临时节点的情况下做到这一点,但这对我来说已经足够好了

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69781688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档