首页 > 解决方案 > 仅从欧拉旋转分量和位置生成前向/方向矢量

问题描述

我目前在根据可访问的变换组件生成前向向量时遇到了很多麻烦。我在 SparkAR 中工作,其中对象是围绕具有位置、旋转(欧拉)和比例的变换类构建的,正如预期的那样,但是它不提供任何内置方法来检索一般信息,例如相对前向和向上向量对象的变换矩阵等

这让我的任务是尝试从可用数据中自己将其组合在一起。最终的结果只是能够计算2个对象的前向向量之间的角度,将其映射到0-1范围并用作纹理混合的值。目标是根据局部对象的前向矢量与定向光的前向矢量的相似程度,通过纹理混合来模拟假动态照明。

到目前为止,我一定已经阅读了 20 多个不同的 StackOverflow 结果,涵盖了类似的问题,但是根据我使用他们的建议进行的测试,我无法获得正确的结果,此时我觉得我需要对我的方法进行更直接的反馈在我睁开眼睛之前。

我目前的流程如下:

1)从我要比较的动画关节中检索欧拉旋转(以弧度为单位)

2) 将弧度值转换为度数

3) 尝试使用以下计算样本将欧拉值转换为前向向量:

x = cos(yaw)cos(pitch)
y = sin(yaw)cos(pitch)
z = sin(pitch)

对于不同的轴顺序,我尝试了其他一些变化,但根本没有提供太大的变化。

继续之前的一些小音符,X 是俯仰,Y 是偏航,Z 是滚动。Z 正向屏幕,X 正向向右,Y 正向向上。

4)规范化向量(尽管考虑到我得到的结果,这是不必要的)。

5) 对向量执行点积运算,针对设定的方向向量,在这种情况下,出于测试目的,我只是使用 (0,0,1)。

6) 将结果值与预期结果进行比较 - 不正确。


在单次 90 度返回内,从点积中提取的值(根据我的理解,在面向相同方向时应该为 1,在面向反向时应为 -1),在这两个范围端点之间振荡 15-20 次。

这里值得注意的另一件事是,我确实必须交换计算的 Y 和 Z 分量以产生非 0 结果,因此来自 euler 的当前正向向量计算如下:

x = cos(yaw)cos(pitch)
y = sin(pitch)
z = sin(yaw)cos(pitch)

我真的不确定从这里继续前进以产生我正在寻找的结果,因为我根本不明白当前的计算出了什么问题来开始修复它。

在旋转 0、90、180 和 270 处传入的向量、预点积如下:

( 1      , 0, -0.00002)
(-0.44812, 0, -0.89397)
( 1      , 0,  0.00002)
(-0.44812, 0,  0.89397)

我可以看到进入计算的欧拉角绝对正确,因此 RadToDeg 转换并没有搞砸输入。

我用于尝试从欧拉旋转产生前向向量的计算是否不正确?有什么我应该改用的吗?

任何有关推进此问题的建议将不胜感激。谢谢。

标签: mathvectorlinear-algebraspark-ar-studio

解决方案


推荐阅读