Qualcomm Vuforia 真不是普通的難上手,文件寫的跟天書一樣,
照官方文件裝完,應該有很大的機會跑不起來,先確認一下
Build Settings -> Architectures: armv7 armv7s
目前 4.0.5 Beta 還沒支援 arm64,但官方有說之後會補上。
先設定 license key
QCAR::setInitParameters(mQCARInitFlags,"add your license key");
接著把要辨識的圖形丟上 Target Manager 並下載回來,會有兩個檔 *.dat
*.xml 內容如下,稍微看一下 ImageTarget name 之後會用到。
<ImageTarget name="ARCODE1" size="500.000000 500.000000" />
設定辨識檔
dataSetStonesAndChips = [self loadObjectTrackerDataSet:@"your xml file"];
官方所提供的範例做法是 viewController -> EAGLView,EAGLView 包含
OpenGL ES Context 可以放 3D 物件,另外也可以再加上自己的 subview 與一般
ios 做法沒什麼差別,要特別提到是 QCAR 會呼叫 renderFrameQCAR
進行辨識,由於 randerFrameQCAR 是在 background thread 執行,
所以當你要更新 UI 時,要用 performSelectorOnMainThread 去處理。
簡單範例如下
- (void)renderFrameQCAR
{
[self setFramebuffer];
// Clear colour and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render video background and retrieve tracking state
QCAR::State state = QCAR::Renderer::getInstance().begin();
QCAR::Renderer::getInstance().drawVideoBackground();
// ...
for (int i = 0; i < state.getNumTrackableResults(); ++i) {
// Get the trackable
const QCAR::TrackableResult* result = state.getTrackableResult(i);
const QCAR::Trackable& trackable = result->getTrackable();
// Choose the index based on the ImageTarget name
int targetIndex = 0; // "stones"
if (!strcmp(trackable.getName(), "chips"))
targetIndex = 1;
else if (!strcmp(trackable.getName(), "tarmac"))
targetIndex = 2;
else if (!strcmp(trackable.getName(), "ARCODE1"))
targetIndex = 3;
if (targetIndex==3) {
[self performSelectorOnMainThread:@selector(showMyView) withObject:nil waitUntilDone:NO];
}
SampleApplicationUtils::checkGlError("EAGLView renderFrameQCAR");
}
// ...
[self presentFramebuffer];
}