【问题标题】:How can I orient an object on a tracked plane towards the camera in SparkAR Studio 98?如何在 SparkAR Studio 98 中将跟踪平面上的对象朝向相机?
【发布时间】:2020-10-09 16:39:35
【问题描述】:

我正在寻找一种方法,通过 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”。然后它与被跟踪的飞机一起留在原地。 然后它应该始终朝向相机/设备/用户旋转。 谢谢!

【问题讨论】:

  • 只是为了确认一下:你也问过这个on their forum吗? (因为如果你需要向别人寻求帮助,总是先在最权威的地方问,即使你在其他地方也问。最好的情况是,你在那里得到答案,然后在这里得到答案,你可以写下来SO回答自己以帮助未来的访问者)
  • 谢谢,我会的。我还要感谢您提供的关于 Bezier 曲线的惊人入门,这不是开玩笑,这极大地激励了我在半年前开始攻读 CS 学位,来自汽车表面建模。我喜欢我的课程和对数学的参与,这在很大程度上是因为你的网站很棒。谢谢,迈克!
  • 太棒了,很高兴它可以有所作为! =)

标签: javascript reactive-programming augmented-reality spark-ar-studio


【解决方案1】:

其实,还有另一种简单的方法可以用lookAt 方法来做到这一点。看起来它的工作方式有点不同——它总是将对象旋转到世界空间中的相机位置,而不是将相机旋转绑定到对象旋转。

const Scene = require('Scene');

(async function () {

    const camera = await Scene.root.findFirst('Camera');
    const tracker = await Scene.root.findFirst('planeTracker');
    const plane = await Scene.root.findFirst('plane');

    // Get the camera world space position
    const cameraPositionSignal = tracker.worldTransform.inverse().applyToPoint(camera.worldTransform.position);

    // Apply the rotation of the relative transform between plane tracker and camera world position
    plane.transform.rotation = tracker.transform.lookAt(cameraPositionSignal).rotation;

    // Bring object back to the plane tracker origin
    plane.worldTransform.position = tracker.worldTransform.position;

})();

在 Spark AR Studio 98 处于活动状态时,lookAt 方法可能无法正常工作。这适用于当前最新的 120 版本。

【讨论】:

    【解决方案2】:

    工作原理

    浪费了一个周末,放弃了十分钟后,我终于找到了方法。实际的解决方案非常简单,以至于发布它让我很痛苦,但它就在这里。

    使用脚本,我只是将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 手机上产生不同且违反直觉的行为。也许补丁中的旋转和设备实际生成的旋转不对齐,我会对这个主题的 cmets 非常感兴趣。

    什么不起作用

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 2018-07-29
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      相关资源
      最近更新 更多