ARCore中Pose类变换点的算法实现

时间:2022-09-18 09:50:52

ARCore中Pose类变换点的算法实现,主要分为两步,分别是平移和旋转。

1. 旋转向量:通过四元数计算旋转后的向量

参数列表:q表示四元数,

     v是长度为4的float数组,表示待旋转的向量,

       offsetIn表示第一个坐标值的起始索引,

     out代表结果向量,

     offsetOut表示结果向量的三个坐标值在out数组中的起始索引。

     public static void rotateVector(Quaternion q, float[] v, int offsetIn, float[] out, int offsetOut) {
float x = v[offsetIn + 0];
float y = v[offsetIn + 1];
float z = v[offsetIn + 2];
float qx = q.x();
float qy = q.y();
float qz = q.z();
float qw = q.w();
float ix = qw * x + qy * z - qz * y;
float iy = qw * y + qz * x - qx * z;
float iz = qw * z + qx * y - qy * x;
float iw = -qx * x - qy * y - qz * z;
out[offsetOut + 0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
out[offsetOut + 1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
out[offsetOut + 2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
}

2. 变换一个点:

参数列表:pointIn表示包含待变换点的数组,

       inOffset表示待变换的点在数组中的起始索引,

       pointOut表示写入变换后的点坐标的数组,

       outOffset表示变化后的点坐标在pointOut数组中的起始索引。

   public void transformPoint(float[] pointIn, int inOffset, float[] pointOut, int outOffset) {
rotateVector(pointIn, inOffset, pointOut, outOffset);//先旋转点:等同于R * pointIn for(int i = 0; i < 3; ++i) {
pointOut[i + outOffset] += this.translation[i];//平移点:等同于 T * pointIn
}
  }

此方法等同于 : pointOut = M * pointIn , 其中 M = T * R

ARCore中Pose类变换点的算法实现的更多相关文章

  1. ARCore中根据屏幕坐标计算射线的算法

    ARCore中提供了根据屏幕坐标.视口大小及view. project矩阵计算从屏幕坐标发射一条射线的方法,此方法用于3D拾取. class Ray { public final Vector3f o ...

  2. 【经验】 Java BigInteger类以及其在算法题中的应用

    [经验] Java BigInteger类以及其在算法题中的应用 标签(空格分隔): 经验 本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现 ...

  3. DICOM医学图像窗口变换的加速算法

    详见:http://pan.baidu.com/s/1gfFLbJ9 DICOM医学图像窗口变换的加速算法* 张尤赛 ,陈福民 ( 同济大学计算中心, 上海 200092 ) (华东船舶工业学院电子与 ...

  4. Labview 中的类

    一.创建一个空的类 在 LabVIEW 工程窗口里,鼠标右键菜单的新建栏中有一项,是创建类.类的结构和 LabVIEW 工程库是比较相近的:类的名字也作为名字空间:也可以为类中的 VI 设置访问权限等 ...

  5. 【JAVA零基础入门系列】Day11 Java中的类和对象

    今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...

  6. 2019-2-21&period;NET中异常类(Exception)

    .NET中异常类(Exception) 异常:程序在运行期间发生的错误.异常对象就是封装这些错误的对象. try{}catch{}是非常重要的,捕获try程序块中所有发生的异常,如果没有捕获异常的话, ...

  7. Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

    前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...

  8. ARCore中四元数的插值算法实现

    ARCore中四元数差值算法: 其中t的取值范围为[0, 1],当 t = 0 时,结果为a:当t = 1 时,结果为b. public static Quaternion makeInterpola ...

  9. 4、Python中的类详解&lpar;0601&rpar;

    <大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...

随机推荐

  1. 洛谷P3406 海底高铁&lbrack;差分 贪心&rsqb;

    题目背景 大东亚海底隧道连接着厦门.新北.博艾.那霸.鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成.凭借该隧道,从厦门可以乘坐火车直达*.博艾和日本,全程只需要4个 ...

  2. JDK小Bug汇总

    Java官方的Logger.getGlobal().info无效 无效代码 Logger.getGlobal().info("start"); 解决方案(三选一): Logger. ...

  3. Swift开发之 &lpar;01&rpar; 语法

    一 Swift Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序. Swift是一 ...

  4. EF Code First DataAnnotations

    Key EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体.CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID.id或者[ClassName]Id,将映 ...

  5. bzoj1044

    好题 第一问不难,毕竟二分答案类的题目在USACO上都练了好多遍了 第二问充分的暴露了我dp渣的本性 一开始楞是没想出来 f[i,j]表示到第i根木棒切了j刀满足最长段小于等于ans的方案数 式子是这 ...

  6. Python使用纯真年代数据库qqwry&period;dat转换物理位置

    PS:网上直接找的,贴出来,方便以后随时用,感谢分享的人. #!/usr/bin/python #encoding: utf-8 import socket import codecs import ...

  7. 如何通过Visual Studio来管理我们的数据库项目

    某日的一个早晨,产品早上来告诉我说要把之前变更的一个功能更改回原来的设计内容,作为程序员大家都最讨厌需求来回反复变更,但是没有办法,苦逼的程序员最终还是继续要改,毕竟是给老板打工的,但是发现我们之前的 ...

  8. TortoiseGit安装与使用

    公司的源码是在码云上,平时进行项目源码管理和团队开发都会使用到GIT,花了一天时间才将Git搞明白,这是一个工具,我在这里就简单说一下,其安装使用方法,也是对自己学习的总结;本文章适合于刚接触GIT的 ...

  9. string 与 stringbuilder效率相差很大

    方式一: (while ((line = sr.ReadLine()) != null) { strData +=(line+"\r\n"); } 方式二: while ((lin ...

  10. Java学习笔记之——类与对象

    1.参数的传递方式 1)值传递 2)引用传递 2.类和对象: (1)类的定义: public class 类名{ 类型 属性1: 类型 属性2: ……… public 返回值类型 方法名1(形参){ ...