官方原文地址:https://library.vuforia.com/articles/Solution/Native-Sample-Application-Template
今天看到的36氪新闻:高通发布面向VR/AR一体机的骁龙XR1芯片 支持4K视频
三个重要的接口:SampleApplicationSession、SampleApplicationControl、SampleAppMenuCommandProtocal.
SampleAppMenuCommandProtocal : 这个类在IOS中时一个协议,在Android中时一个普通的类。每个独立的功能都要正确的实现类里的函数。(在android Demo中未找到这个类)。
SampleApplicationSession : 该类抽象Vuforia的关键生命周期,并作为参数传递给每个单独的样本。这个类包含以下关键方法:
这个类还包含了 投影矩阵。在显示增强时使用投影矩阵,保证三维视图的透视投影与设备摄像机视图一致。
SampleApplicationControl :这个接口包含每个独立的功能,每个独立的功能都要正确的实现类里的函数。关键方法:
下面两个函数是异步调用的。取决于Vuforia的状态变化
Vuforia所有基础功能都在ActivityLauncher中列表展示,例如:ImageTargets 、Multi-targets 等。所有独立功能的Demo( ImageTargets.java 、VuMark.java )都继承 实现 SampleApplicationControl SampleAppMenuInterface .
SampleAppMenuInterface 抽象方法menuProcess(); 该方法处理不同的命令,如前后摄像头的选择、启用闪光灯、聚焦模式选择。
SampleApplicationSession 在onCreat()方法中创建实例。控制AR生命周期。
@Override
protected void onCreate(Bundle savedInstanceState)
{
Log.d(LOGTAG, "onCreate");
super.onCreate(savedInstanceState);
vuforiaAppSession = new SampleApplicationSession(this);
...
}
SampleApplicationSession 的构造函数传递SampleApplicationControl实例
public SampleApplicationSession(SampleApplicationControl sessionControl)
{
m_sessionControl = sessionControl;
}
SampleApplicationSession 实现Vuforia.IpdateCallbackInterface接口:
public void Vuforia_onUpdate(State state);
SampleApplicationSession 注册 Vuforia
Vuforia.registerCallback(SampleApplicationSession.this)
onVuforiaUpdate(s)方法调用
@Override
public void Vuforia_onUpdate(State s){
m_sessionControl.onVuforiaUpdate(s);
}
示例:ImageTargets 功能实现SampApplicationContral的方法。
1.初始化Tracker
@Override
public boolean doInitTrackers()
{
// 标记跟踪器已经被正确的初始化
boolean result = true;
TrackerManager tManager = TrackerManager.getInstance();
Tracker tracker;
//尝试初始化图像跟踪器
tracker = tManager.initTracker(ObjectTracker.getClassType());
if (tracker == null)
{
Log.e(LOGTAG, "Tracker already initialized or camera already started");
result = false;
} else
{
Log.i(LOGTAG, "Tracker successfully initialized");
}
return result;
}
2 De-initialize the Tracker
@Override
public boolean doDeinitTrackers()
{
// Indicate if the trackers were deinitialized correctly
boolean result = true;
TrackerManager tManager = TrackerManager.getInstance();
tManager.deinitTracker(ObjectTracker.getClassType());
return result;
}
3. 初始化数据集
初始 Tarmac 和 StonesAndChips 的数据集, 将在tracker中被用到
@Override
public boolean doLoadTrackersData()
{
...
if (!mCurrentDataset.load(
mDatasetStrings.get(mCurrentDatasetSelectionIndex),
DataSet.STORAGE_TYPE.STORAGE_APPRESOURCE))
return false;
if (!objectTracker.activateDataSet(mCurrentDataset))
return false;
...
return true;
}
4.开启Tracker
@Override
public boolean doStopTrackers()
{
// Indicate if the trackers were stopped correctly
boolean result = true;
Tracker objectTracker = TrackerManager.getInstance().getTracker(
ObjectTracker.getClassType());
if (objectTracker != null)
objectTracker.stop();
return result;
}