Javascript 在SparkAR Studio 98中,如何使跟踪平面上的对象朝向摄影机?

Javascript 在SparkAR Studio 98中,如何使跟踪平面上的对象朝向摄影机?,javascript,reactive-programming,augmented-reality,spark-ar-studio,Javascript,Reactive Programming,Augmented Reality,Spark Ar Studio,我正在寻找一种方法,通过SparkAR Studio 98中的脚本将跟踪平面上的场景对象定向到摄影机。 这听起来很琐碎,但我很难找到相机的世界位置,然后从中生成旋转,我可以应用于观察相机的对象 我让它在跟踪平面层次中工作,这样一个对象将始终注视另一个对象,但由于摄影机位于该层次和坐标系之外,这对我没有帮助 和往常一样,我对SparkAR API的反应性以及事物分布在多个坐标系上、信息在网上很难找到并且很快就过时的事实感到困惑。 我的代码如下所示: const Scene = require('S

我正在寻找一种方法,通过SparkAR Studio 98中的脚本将跟踪平面上的场景对象定向到摄影机。 这听起来很琐碎,但我很难找到相机的世界位置,然后从中生成旋转,我可以应用于观察相机的对象

我让它在跟踪平面层次中工作,这样一个对象将始终注视另一个对象,但由于摄影机位于该层次和坐标系之外,这对我没有帮助

和往常一样,我对SparkAR API的反应性以及事物分布在多个坐标系上、信息在网上很难找到并且很快就过时的事实感到困惑。 我的代码如下所示:

const Scene = require('Scene');
const R = require('Reactive');
export const Diagnostics = require('Diagnostics');

(async function () {
    Diagnostics.log("Filter activated");

    const objectToOrient = await Scene.root.findFirst('object');
    const objectParent= await Scene.root.findFirst('objectParent');
    const target = await Scene.root.findFirst('target');

    const lookAtPt = R.point(
        target.worldTransform.x,
        target.worldTransform.y,
        target.worldTransform.z);

    const lookAtTransform = objectParent.transform.lookAt(lookAtPt);
})();
为了向读者说明这一概念,我设置了以下场景:

跟踪基础平面后,“S”将立即出现。然后它和被跟踪的飞机一起留在原地。 然后,它应始终朝向相机/设备/用户旋转。
谢谢大家!

什么有效

在浪费了一个周末之后,在放弃十分钟之后,我终于找到了如何去做。实际的解决方案是如此简单,以至于我很难发布它,但它就在这里

使用脚本,我只是将
objectToOrient
的旋转绑定到相机的旋转。就这样

const S = require('Scene');
const R = require('Reactive');
const D = require('Diagnostics');

// Enter look-at-target and object that needs to look at the target here
const objectName = 'lookAtObject';
const pivotName = 'pivot';
const targetName = 'Camera';
// const targetName = 'target';

(async function () {
    D.log("Filter activated");

    const [object, pivot, target] = await Promise.all([
        S.root.findFirst(objectName),
        S.root.findFirst(pivotName),
        S.root.findFirst(targetName)])
        .catch((error) => D.log(error.message));

    const deviceTransform = target.worldTransform;
    const pivotTransform = pivot.worldTransform;

    object.transform.rotation = deviceTransform.rotation;
    object.transform.position = pivotTransform.position;

    D.log("End of Log");
})();
在删除了两页我的旧代码后,我也尝试使用补丁来复制它,但将DeviceMotion补丁插入到对象的3D旋转中,实际上在我的android手机上会产生不同的、违反直觉的行为。也许补丁中的旋转和设备实际生成的旋转不一致,我对这个话题的评论很感兴趣

什么不起作用

在我认为我通过角度计算和世界变换解决了这个问题之后,就像我之前在这里发布的那样,它实际上不起作用,我不得不在这上面再浪费两天的时间,通过手动计算向量之间的角度来排除和查找我的计算中的问题,四元数或SparkAR提供的
lookAt
的所有变体

在我学习DeviceMotion模块的过程中,我希望它能解决我无法在场景中获得相机的最新世界位置的问题。我想用这个位置来计算两个向量之间的角度差,然后从这个角度旋转物体。与大多数解决方案一样,这在编辑器中非常有效,但在我的手机上却不行。 不幸的是,它不会在场景中更新一次。经过一些调试,我发现DeviceMotion.worldTransform实际上只包含一个旋转,但在访问其位置坐标时不会抛出错误。
我觉得这个软件包太令人沮丧了。

我想确认一下:你也问过这个吗?(因为如果你需要寻求他人的帮助,总是先在最权威的地方寻求帮助,即使你也会在其他地方寻求帮助。最好的情况是,在这里得到答案之前,你会在那里得到答案,你可以自己写下答案来帮助未来的访客)谢谢你,我会的。我还想感谢你们关于贝塞尔曲线的精彩入门,这并不是开玩笑,半年前,这强烈地激励了我开始攻读汽车表面造型专业的CS学位。我热爱我的课程和数学,这在很大程度上是因为你的网站很棒。谢谢你,迈克!这太神奇了,很高兴它能起到作用!=)