math - 仅从欧拉旋转分量和位置生成前向/方向矢量
问题描述
我目前在根据可访问的变换组件生成前向向量时遇到了很多麻烦。我在 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 转换并没有搞砸输入。
我用于尝试从欧拉旋转产生前向向量的计算是否不正确?有什么我应该改用的吗?
任何有关推进此问题的建议将不胜感激。谢谢。
解决方案
推荐阅读
- swift - How to create the operator "|>" to sort the collection [2,5,3,4] from least to greatest on swift
- elasticsearch - Elasticsearch:更喜欢前缀匹配而不是术语匹配
- matplotlib - Create a LinearSegmentedColormap with values within range
- arrays - 如何编写 N1QL 查询以获取所有 ordrqty 等于 102 的 SaleDt1
- node.js - 从 firebase 实时数据库中删除
- javascript - 尝试构建 React-Admin,不断收到“编辑 src/App.js 并保存以重新加载”
- asp.net-web-api - 我尝试使用 IApplicationBuilder 制作 Asp.net Api,而不是 asp.net 核心
- laravel - 重定向 301 不起作用 htaccess laravel
- c# - JSON_Value 错误:“JSON_VALUE 或 JSON_QUERY”的参数 2 必须是字符串文字
- node.js - Vercel 部署后无法在非根页面上运行 API