gpt4 book ai didi

android - Google VR 如何使用 Daydream Controller 执行选择

转载 作者:行者123 更新时间:2023-11-29 19:03:00 24 4
gpt4 key购买 nike

以下是我的情况

  • 我有一个矩形 left=0,right=1824,top=0,bottom=989纵横比为 1.84f,均匀 z axis = -3f
  • 在那个矩形中,我有宽度和高度分别为 344 和 182 的小矩形。我将这些小矩形排列成 3 行 3 列,类似于网格画廊。
  • 我在不改变 z 轴的情况下对正交投影做了一些修改,这样新的矩形将在 -1,84 to 1.84 in x axis 范围内。和 1 to -1 in y axis所有的小矩形都在这些范围内
  • 然后为了在 VR 上渲染这些矩形,我简单地应用了

    view = perspective ( z near 0.1f, far 100 f) * eye.getEyeVew
    model = Orthographic transformation to come in range ( -1.84f to 1.84 f : X , 1 to 1f :Y )
    modelview = view * model

  • 为了模拟 Controller ,我使用了一个带有 ( centerX=0, centerY=0, radius =0.04f, zaxis = -3f) 的简单圆圈

  • 使用 Controller 旋转矩阵 ( https://developers.google.com/vr/reference/android/com/google/vr/sdk/controller/Orientation.html#toRotationMatrix(float[]) ) 对圆应用以下变换

    view = perspective ( z near 0.1f, far 100 f) * eye.getEyeVew
    controllerMatrix = controller.toRotationMatrix
    modelView = view * controllerMatrix

我的假设如下,

  • 由于我绘制的是具有统一 Z 值的 3D 平面,因此我可以将它们视为 2D 平面以供选择。
  • 我假设圆的二维坐标(左、上、右、下)可以用来检查平面的二维坐标(左、上、右、下),看看圆是否落在平面上.
  • 但是由于perspective & eye.getEyeView的变换,圆和平面的z轴都发生了变化。

因此,我的问题是为此目的,我应该选择 RayCasting 还是有一个简单的解决方案来选择带有 VR Controller 的小矩形。我正在使用 GVR Controller ( Google VR version 1.80.0 )并使用 Android 进行应用程序开发。

谢谢

最佳答案

Google VR SDK 附带了一些有用的示例项目,演示了如何实现这一点。如果您检查 Treasure Hunt projectTreasureHuntActivity 类有一个方法 isLookingAtObject():

private boolean isLookingAtObject() {
// Convert object space to camera space. Use the headView from onNewFrame.
Matrix.multiplyMM(modelView, 0, headView, 0, modelCube, 0);
Matrix.multiplyMV(tempPosition, 0, modelView, 0, POS_MATRIX_MULTIPLY_VEC, 0);

float pitch = (float) Math.atan2(tempPosition[1], -tempPosition[2]);
float yaw = (float) Math.atan2(tempPosition[0], -tempPosition[2]);

return Math.abs(pitch) < PITCH_LIMIT && Math.abs(yaw) < YAW_LIMIT;
}

这将计算摄像机视线方向的矢量与 modelCube 矩阵之间的角度。 modelCube 矩阵是一个 4x4 矩阵,用于定义 3D 场景中对象中心点的缩放、旋转和平移。在您的情况下,这将是 3D 空间中矩形的中心点。

您还必须计算定义相机指向方向的矢量与矩形相交的角度。下图对此进行了描述:

enter image description here

这里的原点是您的相机位置,点 C 是在 3D 空间中呈现的矩形的质心,矢量 OC 是您的相机直接聚焦时指向的方向矢量矩形的中心。 Ꝋ 是 X 轴到 X-Z 平面中 C 点的夹角。点 P1-4 是 3D 空间中矩形的顶点。

音高 ɸ 定义如下图:

enter image description here

这里 ɸ 是从中心点 C 到新轴 e 的角度。

PITCH_LIMIT 是 Y-e 平面中两个向量之间的角度。从相机位置到对象边界框下边缘的向量和从相机位置到对象边界框上边缘的向量。在这种情况下,它可以计算为 OP3OP4 之间的角度或 OP2OP1 之间的角度.这在以下二维横截面中进行了描述:

enter image description here

假设相机直视矩形,这个限制定义了在相机中心不再直接指向矩形之前相机必须向上倾斜的程度。

YAW_LIMIT 是 X-Z 平面中两个向量之间的角度,从相机位置到物体边界框最左边缘的向量,以及从相机位置的向量到对象边界框的最右边缘。在这种情况下,它可以计算为 OP1OP4 之间的角度或 OP2OP3 之间的角度.这在以下二维横截面中进行了描述:

enter image description here

同样,此限制定义了在相机中心不再直接指向矩形之前相机可以向左或向右旋转多少。

请注意,YAW_LIMITPITCH_LIMIT 值在您离物体较远时变小,在距离较近时变大。您必须根据当前相机位置和对象的边缘顶点计算要检查的对象的这些限制。从对象空间到相机空间的坐标转换在 isLookingAtObject() 方法中处理。

关于android - Google VR 如何使用 Daydream Controller 执行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48181031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com