【问题标题】:Placing objects right in front of camera将物体放在相机正前方
【发布时间】:2017-10-21 22:55:00
【问题描述】:

我试图弄清楚如何从示例 ARCore 场景中修改 HelloARController.cs 以将对象直接放在相机前面。我的想法是,我们正在从相机向锚点或跟踪平面上的 Vector3 进行光线投射,所以我们不能获得该光线起点的 Vector3 并将对象放置在该点或附近吗?

I have tried lots, and although I am somewhat a beginner, I have come up with this

据我了解,ScreenToWorldPoint 应该输出一个与世界对应的屏幕位置的vector3,但它不能正常工作。我尝试了其他选项而不是 ScreenToWorldPoint,但没有呈现出预期的效果。有人有什么建议吗?

【问题讨论】:

  • “但它不能正常工作” - 你的期望是什么 VS 正在发生什么? --- 我们无法读心,没有解释我们也无法知道“无法正常工作”是什么意思。
  • 另外,如果你只是想在相机前居中放置一些东西,有什么理由不简单地使用相机的transform.localPosition + offsetZ
  • 最后,不要使用图像来描绘代码... 永远... 最好将代码粘贴到此处(格式正确),或者至少发帖到pastebingithub gist 或类似的地方。
  • 感谢您的指点。我刚来这地方。 transform.local 位置已经是朝着正确方向迈出的一大步,谢谢!
  • 很高兴为您提供帮助! ??? ---不要忘记更新问题以使问题更清楚,以便我们可以进一步帮助您;如果您自己找到解决方案,您可以发布自己问题的答案;它将帮助未来遇到类似问题的用户。

标签: unity3d arcore


【解决方案1】:

要将对象放置在相机视图的中间,您必须更改目标游戏对象的 transform.position(正如 AlmightyR 所说)。

准备好的代码如下所示:

GameObject camera;
GameObject object;
float distance = 1;

object.transform.position = camera.transform.position + camera.transform.forward * distance;

由于相机的前向分量(Z 轴)始终指向相机正在寻找的方向,因此您可以将该矢量的方向乘以您希望放置对象的距离。如果您希望您的对象无论相机如何移动都始终保持在该位置,您可以将其设为相机变换的子对象。

object.transform.SetParent(camera.transform);
object.transform.localPosition = Vector3.forward * distance;

【讨论】:

  • 将此注释移至答案。
  • @Arman 此代码运行良好。但在 2 或 3 秒后首先添加在中心的对象移动到位置。我想首先放置在位置
【解决方案2】:

Arman 的建议有效。也感谢 AlmightyR,因为他们让我朝着正确的方向开始。这是我现在拥有的:

// Set a position in front of the camera
float distance = 1;
Vector3 cameraPoint = m_firstPersonCamera.transform.position + m_firstPersonCamera.transform.forward * distance;

// Intanstiate an Andy Android object as a child of the anchor; it's transform will now benefit
// from the anchor's tracking.
var andyObject = Instantiate(m_andyAndroidPrefab, cameraPoint, Quaternion.identity,anchor.transform);

唯一的问题是,由于现有的 HelloAR 示例代码,在我的例子中,只有当您单击点云中的一个点(或者默认情况下是平面上的一个点)时,才会放置一个对象。我希望它的行为可以让您单击屏幕上的任何位置,并将对象定位到点云中的附近点,不一定是您单击的对象。有什么想法吗?

给那些不知道的人的小贴士:如果你想把东西锚定到云中的一个点上,而不是在一个平面上,改变

TrackableHitFlag raycastFilter = TrackableHitFlag.PlaneWithinBounds | TrackableHitFlag.PlaneWithinPolygon;

TrackableHitFlag raycastFilter = TrackableHitFlag.PointCloud;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2012-10-21
    • 2017-11-20
    • 2018-01-14
    • 2012-08-10
    • 2014-12-02
    • 2019-10-23
    相关资源
    最近更新 更多