如何在Scene Kit中的3D SCNNode内添加2D视图

3
我正在尝试在一个3D视图上方添加一种“通知”类型,它会跟随视图移动,如果相机旋转或SCNNode旋转,该视图始终保持面向前方。由于进行计算并使平面3D旋转需要付出很高的代价,而且每次父级元素旋转或相机旋转时都需要旋转它,因此我不想在所有跟随3D xyz的元素上添加UIView,因为我希望它与3D世界深度排序进行交互。
以下是我想要实现的示例:
https://istack.dev59.com/UVF7R.webp 这是一个不随其父级元素旋转的视图,如何实现?
提前感谢!

1
所以基本上你需要将横幅图像相对于其父级(始终面向相机)向相反方向旋转,完成。为什么这会太昂贵呢? - CodeSmile
@LearnCocos2D 这是一个游戏,涉及到大量的节点,为了旋转横幅广告会有很多循环操作,而且你可以自由旋转相机,因此需要进行大量计算。 - Carlos C
你可以使用着色器修改器来实现这一点,如果你在视图空间(相机的坐标系)工作,一切都变得简单了。你可以在网上搜索“广告牌着色器”。 - mnuages
这是一个游戏,将会有许多计算。不要因为害怕速度慢而不去做某事。使其运作,并在发现性能问题时进行分析和优化。 - CodeSmile
此外,我敢打赌,如果你有大量节点,那么旋转计算几乎不会对性能带来影响。大多数游戏完全受限于GPU,即绘制3D模型所需的时间比微不足道的偏移计算要长得多。 - CodeSmile
我刚发现这个代码:nodeA.constraints = @[[SCNLookAtConstraint lookAtConstraintWithTarget:nodeB]];它可以让一个物体始终朝向另一个物体,这正是我需要的,如果测试成功,我会将其作为答案发布。 - Carlos C
1个回答

3
我找到了一种方法,做起来真的很简单,就是这样:

SCNLookAtConstraint *constraint = [SCNLookAtConstraint lookAtConstraintWithTarget:cameraNode];
constraint.gimbalLockEnabled = YES;
nodeA.constraints = @[constraint];

这将使 nodeA 始终面向相机,并设置 gimbalLockEnabled = YES 以防止它旋转得奇怪。

希望这能帮助到某个人,它为我的游戏节省了不少麻烦 :-)


1
很好的创意使用了 SCNLookAtConstraint - rickster
看起来好像它在面向前方,而不是向前 :( - Tai Le

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