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

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

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

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

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

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

     out代表结果向量,

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

 1     public static void rotateVector(Quaternion q, float[] v, int offsetIn, float[] out, int offsetOut) {
 2         float x = v[offsetIn + 0];
 3         float y = v[offsetIn + 1];
 4         float z = v[offsetIn + 2];
 5         float qx = q.x();
 6         float qy = q.y();
 7         float qz = q.z();
 8         float qw = q.w();
 9         float ix = qw * x + qy * z - qz * y;
10         float iy = qw * y + qz * x - qx * z;
11         float iz = qw * z + qx * y - qy * x;
12         float iw = -qx * x - qy * y - qz * z;
13         out[offsetOut + 0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
14         out[offsetOut + 1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
15         out[offsetOut + 2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
16     }

2. 变换一个点:

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

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

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

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

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

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

时间: 2024-10-29 00:07:35

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

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

ARCore中提供了根据屏幕坐标.视口大小及view. project矩阵计算从屏幕坐标发射一条射线的方法,此方法用于3D拾取. 1 class Ray { 2 3 public final Vector3f origin;//射线起点 4 public final Vector3f direction;//射线方向 5 6 public Ray(Vector3f origin, Vector3f direction) { 7 this.origin = origin; 8 this.direc

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

详见:http://pan.baidu.com/s/1gfFLbJ9 DICOM医学图像窗口变换的加速算法* 张尤赛 ,陈福民 ( 同济大学计算中心, 上海 200092 ) (华东船舶工业学院电子与信息系,江苏 镇江 212003) E_mail:[email protected]   摘 要:研究DICOM医学图像的显示技术,提出了一种图象窗口变换的加速算法,该算法简洁.实用.加速效果理想, 可以在动态连续调节图像窗值的情况下实时地显示DICOM医学图像. 关键词: DICOM: 医学图像:

探究Java中Map类

Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象.       Map的接口       Map---实现Map       Map.Entry--Map的内部类,描述Map中的按键/数值对.       SortedMap---扩展Map,使按键保持升序排列           关于怎么使用,一般是选择Map的子类,而不直接用Map类.       下面以HashMap为例.       public     static     void     ma

hadoop中Text类 与 java中String类的区别

hadoop 中 的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念: 字符集: 是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.例如 unicode就是一个字符集,它的目标是涵盖世界上所有国家的文字和符号: 字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对.即在符号集

(转载)虚幻引擎3--第三章–Unreal中的类

第三章–Unreal中的类 3.1概述 3.2 NATIVE 对 非-NATIVE 3.3类声明 EXTENDS 关键字 指南 3.1您的第一个类声明 3.4类的修饰符 NATIVE(PACKAGENAME) NATIVEREPLICATION DEPENDSON(CLASSNAME[,CLASSNAME,...]) ABSTRACT DEPRECATED TRANSIENT NONTRANSIENT CONFIG(ININAME) Engine Editor Game Input PEROBJ

Java中的HashCode(1)之hash算法基本原理

Java中的HashCode(1)之hash算法基本原理 2012-11-16 14:58:59     我来说两句      作者:woshixuye 收藏    我要投稿 一.为什么要有Hash算法 Java中 的集合有两类,一类是List,一类是Set.List内的元素是有序的,元素可以重复.Set元素无序,但元素不可重复.要想保证元素不重复,两个元素 是否重复应该依据什么来判断呢?用Object.equals方法.但若每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的

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

ARCore中四元数差值算法: 其中t的取值范围为[0, 1],当 t = 0 时,结果为a:当t = 1 时,结果为b. 1 public static Quaternion makeInterpolated(Quaternion a, Quaternion b, float t) { 2 Quaternion out = new Quaternion(); 3 float cosHalfTheta = a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w

关于java同步包中ConcurrentLinkedQueue类的深入分析与理解

一,官方描述 一个基于连接节点的无界线程安全队列.这个队列的顺序是先进先出.队列头部的元素是留在队列中时间最长的,队列尾部的元素是留在队列中时间最短的.新元素被插入到元素的尾部,队列从队列的头部检索元素.当许多线程共享访问同一个集合时,这个类是不二选择.这个队列不允许有null元素. 这个实现基于一种被描述为简单,快速,实用的非阻塞和阻塞公布队列算法而提供的一种有效的空闲等待算法. 注意,不像大多数集合,size方法的操作不是常量时间的,由于是异步队列,决定了元素的数量需要遍历真个元素集. 这个

JDK中String类的源码分析(二)

1.startsWith(String prefix, int toffset)方法 包括startsWith(*),endsWith(*)方法,都是调用上述一个方法 1 public boolean startsWith(String prefix, int toffset) { 2 char ta[] = value; 3 int to = toffset; 4 char pa[] = prefix.value; 5 int po = 0; 6 int pc = prefix.value.l