当要旋转的对象的父对象发生旋转时如何使用 SparkAR 的 LookAt

Cla*_*tti 5 javascript reactive-programming spark-ar-studio

在 SparkAR 中,我希望有一个toRotate始终看着相机的元素(称为 ),类似于此处已经提出的问题(但接受的解决方案对我来说并不令人满意,而且我没有足够的声誉来回答并发表评论)。

问题是这个元素位于无法修改的层次结构中:顺序必须绝对屏幕截图root->planeTracker->parent->toRotate所示(似乎我没有足够的声誉来嵌入图像)。

通过使用该lookAt函数(感谢这个 github 存储库,我明白我必须创建一个具有相同本地位置的toRotateDuplicate同级文件toRotate,然后使用它的转换),我可以让它在编辑器中正常工作,但是一旦我尝试使用它我的设备toRotate有一个奇怪的旋转。

经过一些测试,我可以看出问题是由于planeTracker仅在编辑器上具有等于 Quaternion.Identity 的旋转,而在设备上该值有所不同。
事实也证明了这一点,如果planeTracker用空节点替换 并对其应用非恒等旋转,即使在编辑器上我们也会遇到“奇怪的旋转”问题。

这是我的代码:

const Scene = require("Scene");
const Reactive = require("Reactive");

const find = e => Scene.root.findFirst(e);

(async function () {
  const toRotate = await find('toRotate');
  const toRotateDuplicate = await find('toRotateDuplicate');
  const camera = await find('Camera');
  toRotate.worldTransform.rotation = toRotateDuplicate.worldTransform.lookAt(camera.worldTransform.position).rotation;
})();
Run Code Online (Sandbox Code Playgroud)

由于我使用的是世界变换,所以我不应该有旋转问题,对吗?
那我该怎么办?

请注意,此处接受的解决方案对我不起作用:如果相机正在查看对象的中心,则该对象只会查看相机,而且如果我移动相机而不旋转它,我可以看到该对象是不更新其旋转以继续查看相机。

Cla*_*tti 2

我找到了一个“hacky”解决方案:为我们的被调用
创建另一个 sibiling ,它反映了对象的 worldPosition 。由于逻辑中所有使用的变换现在都在同一层次结构级别上,所以我可以使用本地变换而不是世界变换那些^^'toRotatecameraDuplicateCameralookAt

这是更新后的代码:

const Scene = require("Scene");
const Reactive = require("Reactive");

const find = e => Scene.root.findFirst(e);

(async function () {
  const toRotate = await find('toRotate');
  const toRotateDuplicate = await find('toRotateDuplicate');
  const camera = await find('Camera');

  const cameraDuplicate = await find('cameraDuplicate');
  cameraDuplicate.worldTransform.position = camera.worldTransform.position;
  toRotate.transform.rotation = toRotateDuplicate.transform.lookAt(cameraDuplicate.transform.position).rotation;
})();
Run Code Online (Sandbox Code Playgroud)

我不是它的忠实粉丝,因为:它意味着创建第二个兄弟姐妹(好像一个还不够)并且没有澄清我的轮换问题,只是避免了它。所以请提供您的解决方案,我会接受它如果比我的没那么黑的话:)