<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vuforia &#8211; 記下來</title>
	<atom:link href="https://noter.tw/tag/vuforia/feed/" rel="self" type="application/rss+xml" />
	<link>https://noter.tw</link>
	<description>一路上踩到的坑、遇到的問題，一點一滴記下來，希望能幫助到需要的人~</description>
	<lastBuildDate>Wed, 22 Feb 2023 09:44:48 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.3</generator>

<image>
	<url>https://noter.tw/wp-content/uploads/cropped-old-1130742_1920-1-32x32.jpg</url>
	<title>Vuforia &#8211; 記下來</title>
	<link>https://noter.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</title>
		<link>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/</link>
					<comments>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 03:24:19 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[multitarget]]></category>
		<category><![CDATA[多重模型]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3739</guid>

					<description><![CDATA[<p>要進到這系列最後一篇文章了，這篇文章拖了很久，一直沒有時間整理，結果到最後 &#8230; 程式碼留下來了，記憶卻有些模糊了，這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。 設計自己的物件 因為這邊&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>要進到這系列最後一篇文章了，這篇文章拖了很久，一直沒有時間整理，結果到最後 &#8230; 程式碼留下來了，記憶卻有些模糊了，這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。 </p>



<span id="more-3739"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/blank-e-box-for-software-etc-4-1238246-1280x960.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/blank-e-box-for-software-etc-4-1238246-1280x960-500x375.jpg" alt="圖片來源：http://tw.freeimages.com/photo/blank-e-box-for-software-etc-4-1238246" class="wp-image-3753" title="Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/blank-e-box-for-software-etc-4-1238246</figcaption></figure></div>


<h2 class="para">設計自己的物件</h2>
<p>因為這邊要載入多個模型，而每個模型搭配的參數都不同，例如：刀鋒戰士要放大 10 倍並且往 y 軸位移 50、茶壺要 blablabla &#8230;，這邊可以根據自己的需求去做設計，小蛙隨意列了幾個可能會隨著不同模型調整的屬性</p>
<div>
<div id="highlighter_408527" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">class</code> <code class="java plain">MyObjs {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String symbol;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String obj;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">String mtl;</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">List&lt;String&gt; textures;</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">scale = </code><code class="java value">1</code><code class="java plain">;</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">postScale = </code><code class="java value">1</code><code class="java plain">;</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 0 度躺著正面朝上</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">rotateZ = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java keyword">float</code> <code class="java plain">traslateZ = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">private</code> <code class="java plain">Object3D target;</code></div>
<div class="line number16 index15 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>有看不懂的可以往前翻，屬性也不一一介紹了。</p>
<h2 class="para">初始化物件</h2>
<p>初始化這些物件，將每個要載入的物件及他的參數一一創建出來，</p>
<div>
<div id="highlighter_543699" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java comments">// 要觸發的圖片(ImageTarget)</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">private</code> <code class="java keyword">static</code> <code class="java plain">List&lt;String&gt; SYMBOL = </code><code class="java keyword">new</code> <code class="java plain">ArrayList&lt;&gt;();</code></div>
<div class="line number3 index2 alt2"><code class="java comments">// 要呈現出來的 3D 模型</code></div>
<div class="line number4 index3 alt1"><code class="java keyword">private</code> <code class="java plain">List&lt;MyObjs&gt; objs = </code><code class="java keyword">new</code> <code class="java plain">ArrayList();</code></div>
<div class="line number5 index4 alt2"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">initObjs(){</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SYMBOL = Arrays.asList(</code><code class="java string">"stones"</code><code class="java plain">, </code><code class="java string">"chips"</code><code class="java plain">, </code><code class="java string">"tarmac"</code><code class="java plain">);</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 木頭櫃子</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.symbol = SYMBOL.get(</code><code class="java value">0</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.mtl = </code><code class="java string">"Bedside_Table_D.mtl"</code><code class="java plain">;</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.obj = </code><code class="java string">"Bedside Table D.obj"</code><code class="java plain">;</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.textures = Arrays.asList(</code><code class="java string">"Bedside_Table_D_default_1_1.png"</code><code class="java plain">);</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.scale = </code><code class="java value">5</code><code class="java plain">;</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.traslateX = -</code><code class="java value">110</code><code class="java plain">;</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.traslateY = -</code><code class="java value">160</code><code class="java plain">;</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(m);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 灰色櫃子</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs w = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.symbol = SYMBOL.get(</code><code class="java value">2</code><code class="java plain">);</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.mtl = </code><code class="java string">"Bedside_Table_B.mtl"</code><code class="java plain">;</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.obj = </code><code class="java string">"Bedside Table B.obj"</code><code class="java plain">;</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.textures = Arrays.asList(</code><code class="java string">"Bedside_Table_B_default_1_1.png"</code><code class="java plain">);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.scale = </code><code class="java value">5</code><code class="java plain">;</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.traslateX = -</code><code class="java value">110</code><code class="java plain">;</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">w.traslateY = -</code><code class="java value">160</code><code class="java plain">;</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(w);</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 木桶</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs n = </code><code class="java keyword">new</code> <code class="java plain">MyObjs();</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.symbol = SYMBOL.get(</code><code class="java value">1</code><code class="java plain">);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.mtl = </code><code class="java string">"MedievalBarrel_OBJ.mtl"</code><code class="java plain">;</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.obj = </code><code class="java string">"MedievalBarrel_OBJ.obj"</code><code class="java plain">;</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.textures = Arrays.asList(</code><code class="java string">"MedBarrelDiffuse.jpg"</code><code class="java plain">, </code><code class="java string">"MedBarrelNormal.jpg"</code><code class="java plain">);</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.scale = </code><code class="java value">20</code><code class="java plain">;</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.rotateX = -</code><code class="java value">1</code><code class="java plain">.5f;</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.traslateX = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">n.traslateY = </code><code class="java value">0</code><code class="java plain">;</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">objs.add(n);</code></div>
<div class="line number40 index39 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>在載入 obj 的範例中我們知道需要同時載入 mtl 搭配 textures，不然載進來的模型沒有材質貼圖。上面的例子中將屬性一一設定好，並且加入 objs 中，我們透過 m.symbol 來得知當出現哪張影像的時候，載入這個模型 (m.mtl, m.obj, m.textures)， 並可設定縮放(scale)、翻轉(rotate)以及位移(traslate)，這邊可以自己把自己要設定的屬性加上去。</p>
<h2 class="para">載入物件</h2>
<p>當把所有的物件都設定好之後，在 ImageTargetRenderer 建構子中載入這些物件們</p>
<div>
<div id="highlighter_550427" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java plain">... 以上省略 ...</code></div>
<div class="line number2 index1 alt1"><code class="java plain">initObjs();</code></div>
<div class="line number3 index2 alt2"><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">i = </code><code class="java value">0</code><code class="java plain">; i &lt; objs.size(); i++){</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = objs.get(i);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">j = </code><code class="java value">0</code><code class="java plain">; j &lt; m.textures.size(); j++){</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.textures.get(j),</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(TXT_PATH + m.textures.get(j)))</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Object3D[] tmp = Loader.loadOBJ(</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity.getAssets().open(OBJ_PATH + m.obj),</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java string">""</code><code class="java plain">.equals(m.mtl) ? </code><code class="java keyword">null</code> <code class="java plain">: mActivity.getAssets().open(MTL_PATH + m.mtl),</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.scale</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(tmp != </code><code class="java keyword">null</code> <code class="java plain">&amp;&amp; tmp.length &gt;= </code><code class="java value">1</code><code class="java plain">){</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target = tmp[</code><code class="java value">0</code><code class="java plain">];</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.strip();</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.build();</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateX != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateX(m.rotateX);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateY != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateY(m.rotateY);</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.rotateZ != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.rotateY(m.rotateZ);</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.traslateX != </code><code class="java value">0</code> <code class="java plain">|| m.traslateY != </code><code class="java value">0</code> <code class="java plain">|| m.traslateZ != </code><code class="java value">0</code><code class="java plain">)</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.translate(m.traslateX, m.traslateY, m.traslateZ);</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.postScale != </code><code class="java value">1</code><code class="java plain">)</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.scale(m.postScale);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(</code><code class="java string">""</code><code class="java plain">.equals(m.mtl)) {</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">z = </code><code class="java value">0</code><code class="java plain">; z &lt; m.textures.size(); z++)</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">m.target.setTexture(m.textures.get(z));</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(m.target);</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(m.target.getTransformedCenter());</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number42 index41 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number43 index42 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number44 index43 alt1"><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number45 index44 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number46 index45 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>將 objs 中的 MyObj 一一取出，並設定該物件之屬性，到這個階段，就可以依照不同影像載入不同模型，但，這還不夠。</p>
<h2 class="para">移除模型</h2>
<p>剩最後一個步驟，到上一個步驟會發現每個 render 出來的模型，他不會消失 &#8230; 不會消失 &#8230; 不會消失 &#8230; 加上這個步驟讓他消失吧！</p>
<div>
<div id="highlighter_563479" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
<div class="line number43 index42 alt2">43</div>
<div class="line number44 index43 alt1">44</div>
<div class="line number45 index44 alt2">45</div>
<div class="line number46 index45 alt1">46</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java comments">// The render function.</code></div>
<div class="line number2 index1 alt1"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">renderFrame() {</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// clear color and depth buffer</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// get the state, and mark the beginning of a rendering section</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">State state = mRenderer.begin();</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// explicitly render the video background</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mRenderer.drawVideoBackground();</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">float</code><code class="java plain">[] modelviewArray = </code><code class="java keyword">new</code> <code class="java keyword">float</code><code class="java plain">[</code><code class="java value">16</code><code class="java plain">];</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// did we find any trackables this frame?</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code> <code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">tIdx = </code><code class="java value">0</code><code class="java plain">; tIdx &lt; state.getNumTrackableResults(); tIdx++) {</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// get the trackable</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TrackableResult result = state.getTrackableResult(tIdx);</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Trackable trackable = result.getTrackable();</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">printUserData(trackable);</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F modelViewMatrix = Tool.convertPose2GLMatrix(result.getPose());</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F inverseMV = SampleMath.Matrix44FInverse(modelViewMatrix);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Matrix44F invTranspMV = SampleMath.Matrix44FTranspose(inverseMV);</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{world.removeAllObjects();}</code><code class="java keyword">catch</code> <code class="java plain">(Exception e){}</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">for</code><code class="java plain">(</code><code class="java keyword">int</code> <code class="java plain">i = </code><code class="java value">0</code><code class="java plain">; i &lt; objs.size(); i++){</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MyObjs m = objs.get(i);</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(m.symbol.equals(trackable.getName())){</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(m.target);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(m.target.getTransformedCenter());</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">modelviewArray = invTranspMV.getData();</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">updateModelviewMatrix(modelviewArray);</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// hide the objects when the targets are not detected</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code> <code class="java plain">(state.getNumTrackableResults() == </code><code class="java value">0</code><code class="java plain">) {</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">float</code> <code class="java plain">m [] = {</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">1</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java value">0</code><code class="java plain">,</code><code class="java value">0</code><code class="java plain">,-</code><code class="java value">10000</code><code class="java plain">,</code><code class="java value">1</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">};</code></div>
<div class="line number42 index41 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">modelviewArray = m;</code></div>
<div class="line number43 index42 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">updateModelviewMatrix(modelviewArray);</code></div>
<div class="line number44 index43 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number45 index44 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mRenderer.end();</code></div>
<div class="line number46 index45 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>這個 function 小蛙已經忘記哪些是小蛙自己加的，哪些是原本的 code 了，就整個附上來試試看吧！<br>小蛙之前也遇過有網友詢問動畫的部份，經過這一段時間的研究發現 &#8230; 如果真的要用到會動的 3D model，就直接使用 Unity 吧！畢竟在 native code 中要讓做到動畫真的太麻煩了 &gt;&lt; 之前 survey 了好久，因為變數太大、複雜度也太高，直接放棄轉向 render 動畫原本就是強項的 Unity。祝各位好運囉！</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</title>
		<link>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 02:24:33 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[texture]]></category>
		<category><![CDATA[loader]]></category>
		<category><![CDATA[3ds]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3737</guid>

					<description><![CDATA[<p>延續 jPCT-AE Loader 載入模型的部份，這篇要記錄載入 3ds 檔案格式的方法，基本上跟前面幾個 obj, md2 的方法差不多，只有一些小小的變化而已。 下載需要的檔案 到 這裡 下載需&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>延續 jPCT-AE Loader 載入模型的部份，這篇要記錄載入 3ds 檔案格式的方法，基本上跟前面幾個 obj, md2 的方法差不多，只有一些小小的變化而已。</p>



<span id="more-3737"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3d-glasses-1424688.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/3d-glasses-1424688-500x275.jpg" alt="圖片來源：http://tw.freeimages.com/photo/3d-glasses-1424688" class="wp-image-3754" title="Android Vuforia with jPCT-AE (4) – 載入 3DS 測試"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/3d-glasses-1424688</figcaption></figure></div>


<h2 class="para">下載需要的檔案</h2>
<p>到 <a href="http://tf3dm.com/search/?q=barrel&amp;format=All+Formats&amp;search=Search" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載需要的檔案，要注意的是找有 3ds 格式的以及下載下來之後，texture 的圖片大小一定要是 2 的次方，否則載入 texture 的時候會出現錯誤。選桶子的原因是 texture 較為簡單，先試成功一個之後，再去載入複雜一點的模型。</p>
<h2 class="para">載入 3DS 模型</h2>
<p>附上載入程式碼，基本上沒有什麼不同，差別只有在於需不需要設定 texture，例如：載入 obj 跟 mtl 的時候，由於 mtl 已經有 texture 資訊，因此不需要呼叫 setTexture 方法，而 3DS 需要加入此方法，否則會看到赤裸裸的模型。另外有些模型太小，不放大會看不到 (就小小的)，但是放大之後偏差跟位移也會明顯放大，各位可以試試看 &#8230;</p>
<div>
<div id="highlighter_959124" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
<div class="line number36 index35 alt1">36</div>
<div class="line number37 index36 alt2">37</div>
<div class="line number38 index37 alt1">38</div>
<div class="line number39 index38 alt2">39</div>
<div class="line number40 index39 alt1">40</div>
<div class="line number41 index40 alt2">41</div>
<div class="line number42 index41 alt1">42</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java plain">ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity = activity;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">vuforiaAppSession = session;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world = </code><code class="java keyword">new</code> <code class="java plain">World();</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setAmbientLight(</code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// set the following value according to your need, so the object won't be disappeared.</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setClippingPlanes(</code><code class="java value">2</code><code class="java plain">.0f, </code><code class="java value">3000</code><code class="java plain">.0f);</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun = </code><code class="java keyword">new</code> <code class="java plain">Light(world);</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setIntensity(</code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入 texture 並且取名為 ton2.jpg，之後可以直接用 setTexture(name) 來設定 texture</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code><code class="java string">"ton2.jpg"</code><code class="java plain">,</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(</code><code class="java string">"ton2.jpg"</code><code class="java plain">))</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">);</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入 3ds 模型，放大 100 倍</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">Object3D[] tmp = Loader.load3DS(mActivity.getAssets().open(</code><code class="java string">"ton3_low.3ds"</code><code class="java plain">), </code><code class="java value">100</code><code class="java plain">);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">if</code><code class="java plain">(tmp != </code><code class="java keyword">null</code> <code class="java plain">&amp;&amp; tmp.length &gt;= </code><code class="java value">1</code><code class="java plain">){</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder = tmp[</code><code class="java value">0</code><code class="java plain">];</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code> <code class="java plain">(Exception e) {</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.strip();</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.build();</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 讓桶子躺下</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.rotateX(</code><code class="java value">1</code><code class="java plain">.5f);</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 設定 texture，讓桶子有衣服穿 XD</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.setTexture(</code><code class="java string">"ton2.jpg"</code><code class="java plain">);</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.translate(</code><code class="java value">0</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">);</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(cylinder);</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(cylinder.getTransformedCenter());</code></div>
<div class="line number35 index34 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number36 index35 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number37 index36 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number38 index37 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number39 index38 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number40 index39 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number41 index40 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MemoryHelper.compact();</code></div>
<div class="line number42 index41 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<h2 class="para">結果</h2>
<div id="attachment_3759" style="width: 310px" class="wp-caption aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3ds.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-3759" class=" wp-image-3759 " src="https://sshfs.crazyall.net/wazai/2016/07/3ds-500x569.png" alt="載入 3ds 測試" width="300" height="341" title="Android Vuforia with jPCT-AE (4) – 載入 3DS 測試"></a><p id="caption-attachment-3759" class="wp-caption-text">載入 3ds 測試</p></div>
<p>Loader 部份文章就到這邊，下一篇將記錄如何遇到不同 image target 的時候可以動態載入不同的模型。</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="TF3DM (在新分頁中開啟)" href="http://tf3dm.com/" target="_blank" data-wpel-link="external" class="wpel-icon-right">TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (3) – 載入 md2 測試</title>
		<link>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 01:24:43 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[loader]]></category>
		<category><![CDATA[md2]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3735</guid>

					<description><![CDATA[<p>前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案，這邊繼續介紹 jPCT-AE 載入 md2 的方法，載入動作大致上類似，唯一不同的只有 texture 設定部份。 囉哩巴唆 &#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案，這邊繼續介紹 jPCT-AE 載入 md2 的方法，載入動作大致上類似，唯一不同的只有 texture 設定部份。 </p>



<span id="more-3735"></span>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/3d-maze-2-1208096.jpg" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/3d-maze-2-1208096-500x375.jpg" alt="圖片來源：http://tw.freeimages.com/photo/3d-maze-2-1208096" class="wp-image-3752" title="Android Vuforia with jPCT-AE (3) – 載入 md2 測試"></a><figcaption> 圖片來源：http://tw.freeimages.com/photo/3d-maze-2-1208096</figcaption></figure></div>


<h2 class="para">囉哩巴唆</h2>
<p>這次沒有什麼好囉哩巴唆了，小蛙對於這些 3D model 的檔案類型是一知半解，只是看到 jPCT-AE 有這幾種 loader，一個一個測試過後把程式碼留下來。</p>
<h2 class="para">下載需要的檔案</h2>
<p>找了半天，要找到 md2 檔案真是有點困難，後來終於在 <a title="Enseignement C++ avancé en Master Informatique" href="https://www.lri.fr/~pa/progcxx.html" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 找到可以下載的 md2 模型。</p>
<h2 class="para">載入 md2 模型</h2>
<p>附上以下程式碼</p>
<div>
<div id="highlighter_380268" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
<div class="line number18 index17 alt1">18</div>
<div class="line number19 index18 alt2">19</div>
<div class="line number20 index19 alt1">20</div>
<div class="line number21 index20 alt2">21</div>
<div class="line number22 index21 alt1">22</div>
<div class="line number23 index22 alt2">23</div>
<div class="line number24 index23 alt1">24</div>
<div class="line number25 index24 alt2">25</div>
<div class="line number26 index25 alt1">26</div>
<div class="line number27 index26 alt2">27</div>
<div class="line number28 index27 alt1">28</div>
<div class="line number29 index28 alt2">29</div>
<div class="line number30 index29 alt1">30</div>
<div class="line number31 index30 alt2">31</div>
<div class="line number32 index31 alt1">32</div>
<div class="line number33 index32 alt2">33</div>
<div class="line number34 index33 alt1">34</div>
<div class="line number35 index34 alt2">35</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">public</code> <code class="java plain">ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {</code></div>
<div class="line number2 index1 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mActivity = activity;</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">vuforiaAppSession = session;</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world = </code><code class="java keyword">new</code> <code class="java plain">World();</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setAmbientLight(</code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">, </code><code class="java value">150</code><code class="java plain">);</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// set the following value according to your need, so the object won't be disappeared.</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.setClippingPlanes(</code><code class="java value">2</code><code class="java plain">.0f, </code><code class="java value">3000</code><code class="java plain">.0f);</code></div>
<div class="line number8 index7 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun = </code><code class="java keyword">new</code> <code class="java plain">Light(world);</code></div>
<div class="line number9 index8 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setIntensity(</code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">, </code><code class="java value">250</code><code class="java plain">);</code></div>
<div class="line number10 index9 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">try</code><code class="java plain">{</code></div>
<div class="line number11 index10 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// loadMD2(檔案, 縮放);</code></div>
<div class="line number12 index11 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder = Loader.loadMD2(mActivity.getAssets().open(</code><code class="java string">"Blade.md2"</code><code class="java plain">), </code><code class="java value">10</code><code class="java plain">);</code></div>
<div class="line number13 index12 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 載入材質，材質名稱直接設定為檔案名稱，也可以修改</code></div>
<div class="line number14 index13 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">TextureManager.getInstance().addTexture(</code><code class="java string">"Blade.jpg"</code><code class="java plain">,</code></div>
<div class="line number15 index14 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java keyword">new</code> <code class="java plain">Texture(mActivity.getAssets().open(</code><code class="java string">"Blade.jpg"</code><code class="java plain">)));</code></div>
<div class="line number16 index15 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 設定使用名為 Blade.jpg 的材質 (就是上面設定的名字)</code></div>
<div class="line number17 index16 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.setTexture(</code><code class="java string">"Blade.jpg"</code><code class="java plain">);</code></div>
<div class="line number18 index17 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.strip();</code></div>
<div class="line number19 index18 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.build();</code></div>
<div class="line number20 index19 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// X 軸方向翻轉</code></div>
<div class="line number21 index20 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.rotateX(</code><code class="java value">1</code><code class="java plain">.5f);</code></div>
<div class="line number22 index21 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">// 位移 x, y, z</code></div>
<div class="line number23 index22 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cylinder.translate(-</code><code class="java value">100</code><code class="java plain">, </code><code class="java value">0</code><code class="java plain">, -</code><code class="java value">200</code><code class="java plain">);</code></div>
<div class="line number24 index23 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">world.addObject(cylinder);</code></div>
<div class="line number25 index24 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">cam = world.getCamera();</code></div>
<div class="line number26 index25 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">SimpleVector sv = </code><code class="java keyword">new</code> <code class="java plain">SimpleVector();</code></div>
<div class="line number27 index26 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.set(cylinder.getTransformedCenter());</code></div>
<div class="line number28 index27 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.y -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number29 index28 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sv.z -= </code><code class="java value">100</code><code class="java plain">;</code></div>
<div class="line number30 index29 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">sun.setPosition(sv);</code></div>
<div class="line number31 index30 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code><code class="java keyword">catch</code><code class="java plain">(Exception e){</code></div>
<div class="line number32 index31 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">e.printStackTrace();</code></div>
<div class="line number33 index32 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">}</code></div>
<div class="line number34 index33 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">MemoryHelper.compact();</code></div>
<div class="line number35 index34 alt2"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>快點試試看，是不是能如下圖載入刀鋒戰士呢？</p>
<div id="attachment_3763" style="width: 310px" class="wp-caption aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/md2.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" aria-describedby="caption-attachment-3763" class=" wp-image-3763 " src="https://sshfs.crazyall.net/wazai/2016/07/md2-500x632.png" alt="載入 md2 測試" width="300" height="379" title="Android Vuforia with jPCT-AE (3) – 載入 md2 測試"></a><p id="caption-attachment-3763" class="wp-caption-text">載入 md2 測試</p></div>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="Enseignement C++ avancé en Master Informatique (在新分頁中開啟)" href="https://www.lri.fr/~pa/progcxx.html" target="_blank" data-wpel-link="external" class="wpel-icon-right">Enseignement C++ avancé en Master Informatique<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (2) – 載入 obj 測試</title>
		<link>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/</link>
					<comments>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 06 Jul 2016 00:24:55 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[.obj]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[mtl]]></category>
		<category><![CDATA[texture]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3688</guid>

					<description><![CDATA[<p>上一篇&#160;Android Vuforia with jPCT-AE (1) – 基本範例 我們已經把 Vuforia 與 jPCT-AE 的環境建立出來，也可以正常顯示 Vuforia + j&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>上一篇&nbsp;<a rel="noreferrer noopener" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" target="_blank" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a> 我們已經把 Vuforia 與 jPCT-AE 的環境建立出來，也可以正常顯示 Vuforia + jPCT-AE 的範例─一個顏色有點昏暗的桶子，這篇繼續記錄怎麼直接載入一般常見的 .obj 檔案。 </p>



<span id="more-3688"></span>



<h2 class="para wp-block-heading">囉哩巴唆</h2>



<p>透過 <a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a> 是直接在 ImageTargetRenderer.java 的建構式中，將要畫出物件的座標以及一些參數設定好之後，透過 jPCT-AE 畫出來，聽起來不怎麼有彈性，加上一些複雜的模型要透過自己訂定座標點的方式畫出來，貌似非常不科學啊！因此，這篇要記錄如何透過 Loader 類別來載入 .obj 的檔案，而不是在程式中，自己把座標一一描繪出來。</p>



<h2 class="para wp-block-heading">到 TD3M 下載需要的檔案</h2>



<p>這篇小蛙使用&nbsp;<a href="http://tf3dm.com/3d-model/bedside-table-4-skins-96709.html" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Bedside Table (4 skins) @ TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 當作範例，因為這個範例非常符合 jPCT-AE 載入的規則，後面會再提到這是什麼意思，總之先把這個範例下載下來，下載完解壓縮之後會看到如下圖</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/table.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/table.png" alt="Bedside table 3d model" class="wp-image-3732" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>Bedside table 3d model</figcaption></figure></div>



<p>將這三個檔案通通複製到 Android Studio 專案中的 assets 目錄下</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/as_project.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/as_project.png" alt="將模型放入 assets 目錄下" class="wp-image-3731" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>將模型放入 assets 目錄下</figcaption></figure></div>



<p>小蛙測試的時候用了很多模型，造成 assets 目錄下面亂七八糟，因此又在 assets 下新增了 obj、mtl、texture 等目錄，分別把上述「Bedside Table D.obj」、「Bedside_Table_D.mtl」、「Bedside_Table_D_default_1_1.png」依類別放入。</p>



<h2 class="para wp-block-heading">讓 jPCT-AE 載入 obj, mtl, texture</h2>



<p>建議可以先把 jPCT-AE 的 ImageTargetRenderer.java 的建構式注解起來，到時候如果改壞了，還可以還原回去，然後把以下建構式的程式碼貼上</p>



<pre class="wp-block-preformatted withcode">public ImageTargetRenderer(ImageTargets activity, SampleApplicationSession session) {
     mActivity = activity;
     vuforiaAppSession = session;
     world = new World();
     // 如果亮度太暗或是亮度怪怪的，可以調整這裡
     world.setAmbientLight(150, 150, 150);
     world.setClippingPlanes(2.0f, 3000.0f);
     sun = new Light(world);
     // 如果亮度太暗或是亮度怪怪的，可以調整這裡
     sun.setIntensity(250, 250, 250);
     try{
         // 載入材質，第一個參數是 texture 名稱，這邊使用原始檔名
         // 因為當載入 mtl 時，mtl 的檔名會自動對應到該 texture
         TextureManager.getInstance().addTexture(
                 "Bedside_Table_D_default_1_1.png",
                 new Texture(mActivity.getAssets().open("texture/Bedside_Table_D_default_1_1.png"))
         );
         // loadOBJ 參數分別是：.obj, .mtl, 縮放大小
         Object3D[] tmp = Loader.loadOBJ(
                 mActivity.getAssets().open("obj/Bedside Table D.obj"),
                 mActivity.getAssets().open("mtl/Bedside_Table_D.mtl"),
                 5
         );
         if(tmp != null &amp;&amp; tmp.length >= 1){
             cylinder = tmp[0];
         }
         cylinder.strip();
         cylinder.build();
         // 位移
         cylinder.translate(-110, -160, 0);
         // x 軸旋轉，不然載入的櫃子可能是趴著或是躺著的
         cylinder.rotateX(-1.5f);
         // 如果有 mtl 就可以不用 setTexture，mtl 內有 texture 名稱會自動載入
         //cylinder.setTexture("Bedside_Table_D_default_1_1.png");
         world.addObject(cylinder);
         cam = world.getCamera();
         SimpleVector sv = new SimpleVector();
         sv.set(cylinder.getTransformedCenter());
         sv.y -= 100;
         sv.z -= 100;
         sun.setPosition(sv);
     }catch(Exception e){
         e.printStackTrace();
     }
     MemoryHelper.compact();
 }</pre>



<p></p>



<p>執行看看是不是可以正常載入一個櫃子了呢？</p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/obj.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/obj-500x599.png" alt="載入 .obj 測試" class="wp-image-3760" title="Android Vuforia with jPCT-AE (2) – 載入 obj 測試"></a><figcaption>載入 .obj 測試</figcaption></figure></div>



<h2 class="wp-block-heading">遭遇問題</h2>



<p>小蛙之前弄了半天，遇到一拖拉庫的錯誤，有些事情後來才釐清到底為什麼會發生錯誤，在 texture 的部份，<strong>圖片大小必須要是 2 的次方</strong>，像是：128, 256, 512, 1024, 2048 &#8230; 等，只要邊長不是 2 的次方，就會得到圖片大小錯誤的訊息，外加因為載不到圖片隨之而來的 javaNullPointer Exception。</p>



<p>render 出來沒有東西，這個要仔細看，有時候是<strong>模型太小</strong>，小蛙有一次 render 出來的東西，必須要放大 30000 倍，才符合使用大小 &#8230; 有時候是座標軸不對導致 redner 在 image target 下面 (被紙張遮住了)，有時候是沒有 mtl 也沒有材質，就會 render 出空的東西 (沒有東西) &#8230; 等，有時候是 mtl 裡面的 texture 有問題，像是根本沒有 texture 資訊，或是 texture 資訊還是錯誤的檔案路徑(如：C:\xxx\rrr\ccc\xx.png 但是實際上根本沒有這種路徑，此時就要手動修正他)，有時候其實根本也不知道為什麼就是沒有東西。</p>



<p>到 TD3M 多下載幾個範例檔試試看，再慢慢釐清為什麼不能載入的原因，這個範例應該是不需要做什麼調整就可以直接載入，因此使用這個當作範例。</p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="Bedside Table (4 skins) @ TF3DM (在新分頁中開啟)" href="http://tf3dm.com/3d-model/bedside-table-4-skins-96709.html" target="_blank" data-wpel-link="external" class="wpel-icon-right">Bedside Table (4 skins) @ TF3DM<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Android Vuforia with jPCT-AE (1) &#8211; 基本範例</title>
		<link>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/</link>
					<comments>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 05 Jul 2016 23:57:58 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[jPCT-AE]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[3d Model]]></category>
		<category><![CDATA[armeabi-v7a]]></category>
		<guid isPermaLink="false">https://wazai.net/?p=3639</guid>

					<description><![CDATA[<p>說來慚愧，從 Google Adsense 被 ban 之後，就好久沒有發文了，站上 Vuforia 的文章也已經是好久以前的事情了 (遠目)，最近有專案要用到 Vuforia，爬以前的文回來看，蛙哩&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) &#8211; 基本範例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>說來慚愧，從 Google Adsense 被 ban 之後，就好久沒有發文了，站上 Vuforia 的文章也已經是好久以前的事情了 (遠目)，最近有專案要用到 Vuforia，爬以前的文回來看，蛙哩咧 &#8230; 現在已經更新到 Vuforia 5 了 &#8230; 真的是好遙遠啊！這篇記錄怎麼讓 Vuforia 可以透過 jPCT-AE 這套工具把 3D 模型 render 出來，而不是透過之前&nbsp;<a rel="noreferrer noopener" aria-label=" (在新分頁中開啟)" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" target="_blank" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a> 這種轉換方式，系列文內會大概講解遭遇到的問題。 </p>



<span id="more-3639"></span>


<div class="wp-block-image">
<figure class="aligncenter"><a href="https://sshfs.crazyall.net/wazai/2016/07/WM2Small.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="https://sshfs.crazyall.net/wazai/2016/07/WM2Small.png" alt="圖片來源：https://developer.vuforia.com/library/articles/FAQ/Watermark" class="wp-image-3655" title="Android Vuforia with jPCT-AE (1) - 基本範例"></a><figcaption> 圖片來源：https://developer.vuforia.com/library/articles/FAQ/Watermark </figcaption></figure></div>


<h2 class="para wp-block-heading">囉哩巴唆</h2>



<p>在&nbsp;Zachary Marv 的<a rel="noreferrer noopener" aria-label=" (在新分頁中開啟)" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h//comment-page-1#comment-32543" target="_blank" data-wpel-link="internal">這篇留言</a>中提到用這種方式產生出來的模型雖然是正確的，但是貼圖會變的怪怪的，沒有辦法像 Vuforia 的茶壺那樣好看，小蛙對 3D model 不怎麼了解 &#8230; 無法解答發生的原因以及要怎麼改善，但這的確是一個非常 OX 的問題 &#8230;</p>



<p>這次專案又要用到 AR 相關的技術，想說之前使用過 Vuforia，那就繼續用用看吧！對 Vuforia 的記憶根本就消失殆盡，還好之前有留系列文章下來： </p>



<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>


<p>but &#8230; 人生最大條的就是這個 but &#8230; 版本也差太多了吧！連套件名稱都不一樣了 &#8230; 上述紀錄文只能當作找回記憶碎片的&#8221;參考文&#8221;了，不過這六篇還是有一點參考價值啦！進主題　～</p>
<h2 class="para">Vuforia Android Sample</h2>
<p>簡單敘述一下整個流程：</p>
<ol>
<li>必須要有一個 Vuforia 的帳號，註冊這檔事應該沒什麼難的地方，就填填資料就好了。</li>
<li>註冊完之後，建立一個 License Key (以前 3 版的時候沒有的)，官網教學。</li>
<li><span style="line-height: 1.5em;">複製下來自己的 License Key (就是那一長串看不懂的東西)。</span></li>
<li><span style="line-height: 1.5em;">到</span><a style="line-height: 1.5em;" href="https://developer.vuforia.com/downloads/sdk" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a><span style="line-height: 1.5em;">下載 Vuforia SDK，解壓縮好放在一個容易找到的地方，例如：c:\vuforia\。</span></li>
<li><span style="line-height: 1.5em;">到</span><a style="line-height: 1.5em;" href="https://developer.vuforia.com/downloads/samples" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這邊<span class="wpel-icon wpel-image wpel-icon-6"></span></a><span style="line-height: 1.5em;">下載 Vuforia Sample (Core Features 這一組)，隨便解壓縮到一個地方，然後用 Android Studio 匯入。</span></li>
<li><span style="line-height: 1.5em;">打開之後看看缺少那些 jar，然後去上面的 SDK 裡面找，把缺少的 jar include 進來。</span></li>
<li><span style="line-height: 1.5em;">打開 com.vuforia.samples.SampleApplication.SampleApplicationSession.java，搜尋「Vuforia.setInitParameters」，把剛剛建立的 License Key 貼在這邊。</span></li>
<li>檢查看看還有沒有紅字，沒有的話應該就可以正常執行了 (不行別罵小蛙，感覺應該是這樣)。</li>
</ol>
<h2 class="para">Vuforia Android JNI Sample</h2>
<p>到這裡應該是不會有什麼問題才對，因為比較麻煩的是 Vuforia Sample Advanced Topics 這組，如果要使用 obj 轉 .h 的方法可以下載 Vuforia Sample Advanced Topics 這組，經過小蛙測試以及上面 Zachary Marv 提到的，texture 透過 JNI 的方式 render 出來會怪怪的，剛接觸的網友可以試試看上面教學的 (4) (5) (6)，也可以順便熟悉一下 JNI 的運作 (如果是使用 JNI 的朋友會比較麻煩，簡單一點的方法是把 Vuforia SDK 中的 build 目錄複製下來，丟進 ImageTargetsNative-5-5-9\app\src\main\ 下，接著修改 app/build.gradle</p>
<div>
<div id="highlighter_635106" class="syntaxhighlighter  shell">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="shell plain">def VUFORIA_SDK_DIR = </code><code class="shell string">'C:\\vuforia'</code>   <code class="shell plain">//</code> <code class="shell plain">改成你的 Vuforia SDK 位置</code></div>
<div class="line number2 index1 alt1"><code class="shell plain">def JAR_DIR = </code><code class="shell string">'build/java/vuforia'</code>    <code class="shell plain">//</code> <code class="shell plain">如果照著上面做的話，直接寫這樣</code></div>
<div class="line number3 index2 alt2"><code class="shell plain">sourceSets.main {</code></div>
<div class="line number4 index3 alt1"><code class="shell spaces">    </code><code class="shell plain">jni.srcDirs = []</code></div>
<div class="line number5 index4 alt2"><code class="shell spaces">    </code><code class="shell plain">jniLibs.srcDir </code><code class="shell string">"src/main/libs/"</code></div>
<div class="line number6 index5 alt1"><code class="shell spaces">    </code><code class="shell plain">//</code> <code class="shell plain">檢查裡面要有 armeabi-v7a 資料夾，如果沒有就去 Vuforia SDK 下複製</code></div>
<div class="line number7 index6 alt2"><code class="shell plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p><span style="line-height: 1.5em;">第二個要修改的部份是 ImageTargetsNative-5-5-9\app\src\main\jni\Android.mk</span></p>
<div>
<div id="highlighter_330442" class="syntaxhighlighter  shell">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="shell plain">//</code> <code class="shell plain">如果是照著上面步驟的話，改成這樣，不然就自己 trace 路徑看看</code></div>
<div class="line number2 index1 alt1"><code class="shell plain">LOCAL_SRC_FILES = ..</code><code class="shell plain">/build/lib/</code><code class="shell plain">$(TARGET_ARCH_ABI)</code><code class="shell plain">/libVuforia</code><code class="shell plain">.so</code></div>
<div class="line number3 index2 alt2"><code class="shell plain">//</code> <code class="shell plain">如果是照著上面步驟的話，改成這樣，不然就自己 trace 路徑看看</code></div>
<div class="line number4 index3 alt1"><code class="shell plain">LOCAL_EXPORT_C_INCLUDES := ..</code><code class="shell plain">/build/include</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>完成之後點擊選單列 Build -&gt; Make Project，如果沒有錯誤，直接執行就可以了！</p>
<h2 class="para">Vuforia Android Sample With jPCT-AE</h2>
<p>要使用 jPCT-AE 把 3D 模型呈現出來很簡單，只要幾個步驟就可以了：</p>
<ol>
<li>到 <a href="https://github.com/TheMaggieSimpson/Vuforia559_jPCT-AE" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">這裡<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載整個 project。</li>
<li>直接匯入 Android Studio，跟上面一樣搜尋「Vuforia.setInitParameters」，把 Vuforia License Key 貼進去。</li>
<li>這時候應該很多紅字，到 Vuforia SDK 中 (如小蛙的位置在 C:\vuforia\build\java\vuforia) 把 Vuforia.jar 複製到 Vuforia559_jPCT-AE-master\app\libs 中。</li>
<li>找到 build.gradle 新增 Vuforia.jar
<div>
<div id="highlighter_693566" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">dependencies {</code></div>
<div class="line number2 index1 alt1"><code class="text spaces">    </code><code class="text plain">compile files('libs/jpct_ae.jar')</code></div>
<div class="line number3 index2 alt2"><code class="text spaces">    </code><code class="text plain">compile files('libs/Vuforia.jar')  // 新增這行</code></div>
<div class="line number4 index3 alt1"><code class="text plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</li>
<li>直接 run 專案，就可以看到結果了！</li>
</ol>
<p>啥？那麼簡單？沒錯，就是這麼簡單 &#8230; 如果直接運行這個範例的話，會看到一個桶子，然後桶子看起來還有點昏暗，不過可以看到桶子表示已經成功了，下一篇將介紹怎麼載入其他 jPCT-AE 支援的 3D 模型。</p>


<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://developer.vuforia.com/" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Vuforia<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a href="https://github.com/TheMaggieSimpson/Vuforia559_jPCT-AE" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Vuforia559_jPCT-AE<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) &#8211; 基本範例</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qualcomm Vuforia 教學 (6) – 3D model -&#062; .obj -&#062; .h</title>
		<link>https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/</link>
					<comments>https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Wed, 10 Dec 2014 03:25:50 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[3d Model]]></category>
		<category><![CDATA[banana]]></category>
		<category><![CDATA[Blender]]></category>
		<category><![CDATA[obj2opengl]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[NDK]]></category>
		<category><![CDATA[Qualcomm]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[JNI]]></category>
		<category><![CDATA[.obj]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3403</guid>

					<description><![CDATA[<p>終於來到 Vuforia 記錄的最後一篇了，這篇參考到網路上神人的做法，怎麼把一個 3D model 轉換成 Vuforia 可以使用的 .h 檔，這邊之後都直接使用 Android NDK (JNI&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&#062; .obj -&#062; .h</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>終於來到 Vuforia 記錄的最後一篇了，這篇參考到網路上神人的做法，怎麼把一個 3D model 轉換成 Vuforia 可以使用的 .h 檔，這邊之後都直接使用 Android NDK (JNI) 版本來實作，原因在<a rel="noreferrer noopener" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" target="_blank" data-wpel-link="internal">這篇文章</a>。 </p>



<span id="more-3403"></span>



<p><strong>2016-07-07 更新：本篇為 3.x 版本，目前 Vuforia 以更新到 5.5.9，新版本使用方式請參考</strong></p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>


<p>之前小蛙卡了很久，不知道怎麼把 3D model 轉換成 OpenGL 可以繪圖的座標，找到 <a href="http://heikobehrens.net/2009/08/27/obj2opengl/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">參1<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 的資料後，卻因為一開始使用&nbsp;<a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a>，在編譯上出現「<span style="color: #ff0000;"><strong>The code of method xxx is exceeding the 65535 bytes limit</strong></span>」一直無法解決，直到 &#8230; 改成用&nbsp;<a title="Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a> 才能正常運作。<br>花了一個下午的時間，看看 <span style="color: #0000ff;"><strong>Blender</strong> </span>是怎麼進行 3D 塑模的動作，發現這似乎需要非常強大的天分才能夠駕馭 &#8230; 不過至少知道透過 <span style="color: #0000ff;"><strong>Blender</strong> </span>可以把其他檔案格式匯入後，再轉出我們需要的<strong><span style="color: #ff0000;"> .obj</span> </strong>格式，雖然可能有些資訊會無法正常呈現，或者一些奇奇怪怪的問題，不過小蛙對這種軟體不是很了解，在這邊遇到問題的捧由只能自己 Google 了。<br>講一下大概的運作方式，首先必須先有 3D model (廢話)，這個 3D model 格式只要是一般常見的 blender, unity, 3dmax &#8230; 等格式，或是你使用的塑模軟體有辦法吃進去並且轉出 .obj 格式都可以，有一點要<strong><span style="color: #ff0000;">特別特別特別注意</span></strong>，Vuforia 繪圖只能<strong><span style="color: #0000ff;">使用一張材質</span></strong>，也就是說如果一個房子有屋頂、牆壁、門、窗戶、地板、煙囪 &#8230; 等等材質，這些材質必須最後轉出成一個檔案，這部份可能要專業的 3D 塑模師才能做到 (小蛙摸了半天，結果令人失望)，如果網路上下載來的專案檔包含了很多不同圖檔，就會發現 Vuforia 只會貼一張圖檔，其他的會變成殘缺樣，解套方案除了上面提到的將多材質轉製成一個影像檔，另一個比較麻煩，實作上也比較困難，就是把模型裡的每個不同貼圖的部份拆出來 (光聽就覺得超麻煩 &#8230;)<br>整個運作流程為：<br>1. 從網路上<span style="color: #0000ff;"><strong>找免費的 3D 模型測試</strong></span> (google <strong><span style="color: #ff00ff;">free 3d model</span></strong> 有很多，不過大多是要註冊會員)，如果自己會建模就可以省掉這麻煩，小蛙用的是 <strong><span style="color: #0000ff;">Blender</span></strong>，根據 <a href="https://zh.wikipedia.org/wiki/Blender" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">參3<span class="wpel-icon wpel-image wpel-icon-6"></span></a>&nbsp;支援匯入的檔案格式有</p>
<div>
<div id="highlighter_196934" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
<div class="line number9 index8 alt2">9</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">Collada (.dae)</code></div>
<div class="line number2 index1 alt1"><code class="text plain">Motion Capture (.bvh)</code></div>
<div class="line number3 index2 alt2"><code class="text plain">Scalable Vector Graphics (.svg)</code></div>
<div class="line number4 index3 alt1"><code class="text plain">Stanford (.ply)</code></div>
<div class="line number5 index4 alt2"><code class="text plain">Stl (.stl)</code></div>
<div class="line number6 index5 alt1"><code class="text plain">Autodesk 3ds Max (.3ds)</code></div>
<div class="line number7 index6 alt2"><code class="text plain">Autodesk FBX (.fbx)</code></div>
<div class="line number8 index7 alt1"><code class="text plain">Wavefront (.obj)</code></div>
<div class="line number9 index8 alt2"><code class="text plain">X3D Extensible 3D (.x3d)</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>2. 匯出 (Export) 成 Object <span style="color: #ff0000;"><strong>(.obj)</strong></span> 格式，以 Blender 為例，匯出時必須勾選以下選項</p>
<div>
<div id="highlighter_935560" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">apply Modifiers</code></div>
<div class="line number2 index1 alt1"><code class="text plain">Include Edges</code></div>
<div class="line number3 index2 alt2"><code class="text plain">Write Normals</code></div>
<div class="line number4 index3 alt1"><code class="text plain">Include UVs</code></div>
<div class="line number5 index4 alt2"><code class="text plain">Write Materials</code></div>
<div class="line number6 index5 alt1"><code class="text plain">Object as OBJ Objects</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>3. 下載&nbsp;<a href="http://heikobehrens.net/2009/08/27/obj2opengl/" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">參1<span class="wpel-icon wpel-image wpel-icon-6"></span></a>&nbsp;中的轉換程式與範例：<a href="https://github.com/HBehrens/obj2opengl/zipball/master" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">OBJ2OPENGL.ZIP<span class="wpel-icon wpel-image wpel-icon-6"></span></a>，並解壓縮到 <strong><span style="color: #0000ff;">obj2opengl</span> </strong>資料夾，裡面主程式是 <span style="color: #ff0000;"><strong>obj2opengl.pl</strong></span> 以及，banana 跟 cube 兩種範例。<br>4.&nbsp;由於 obj2opengl 是以 <span style="color: #0000ff;"><strong>perl</strong> </span>執行，點選 <a href="http://www.activestate.com/activeperl/downloads" target="_blank" rel="noopener noreferrer nofollow external" data-wpel-link="external" class="wpel-icon-right">參4<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載並安裝，安裝過程一直下一步即可，安裝完成後開啟 cmd 輸入 <span style="color: #ff0000;"><strong>perl -v</strong></span> 如果成功安裝可以在這邊看到 perl 的版本細節<br>5. 使用 <span style="color: #0000ff;"><strong>cmd</strong> </span>進入 obj2opengl 資料夾後，輸入「<span style="color: #ff0000;"><strong>perl obj2opengl.pl banana.obj</strong></span>」(如果是用&nbsp;<a title="Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本" href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a> 的話，產出的 .h 檔會因為資料量太大無法把資訊放入 MeshObject.java 中，所以要使用 <a title="Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a> 才可以進行)，如果訊息如下並且沒看到任何 error 會產生出一個新的 banana.h 並把原本的覆蓋掉</p>
<div>
<div id="highlighter_649985" class="syntaxhighlighter  text">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="text plain">Input file : .\banana.obj</code></div>
<div class="line number2 index1 alt1"><code class="text plain">Output file : .\banana.h</code></div>
<div class="line number3 index2 alt2"><code class="text plain">Object name : banana</code></div>
<div class="line number4 index3 alt1"><code class="text plain">Center : &lt;2289.89534195908, 599.62239347371, -8421.71066976487&gt;</code></div>
<div class="line number5 index4 alt2"><code class="text plain">Scale by : 0.000175074008952644</code></div>
<div class="line number6 index5 alt1"><code class="text plain">----------------</code></div>
<div class="line number7 index6 alt2"><code class="text plain">Vertices : 4032</code></div>
<div class="line number8 index7 alt1"><code class="text plain">Faces : 8056</code></div>
<div class="line number9 index8 alt2"><code class="text plain">Texture Coords : 4420</code></div>
<div class="line number10 index9 alt1"><code class="text plain">Normals : 4032</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>6. 接著參考&nbsp;<a title="Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本" href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a> 中的步驟，banana.h 放到<strong><span style="color: #ff0000;"> jni</span> </strong>目錄下，banana.jpg 放在<span style="color: #ff0000;"><strong> assets</strong> </span>目錄下。<br>7. 修改&nbsp;<span style="color: #0000ff;"><strong>ImageTargets.java</strong></span></p>
<div>
<div id="highlighter_789661" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">loadTextures()</code></div>
<div class="line number2 index1 alt1"><code class="java plain">{</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">//mTextures.add(Texture.loadTextureFromApk("TextureTeapotBrass.png", getAssets()));</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"TextureTeapotBlue.png"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"banana.jpg"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"TextureTeapotRed.png"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"Buildings.jpeg"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number8 index7 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>8. 修改 jni 下的<span style="color: #0000ff;">&nbsp;<strong>ImageTargets.cpp</strong></span></p>
<div>
<div id="highlighter_489019" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp comments">// 在上方加入</code></div>
<div class="line number2 index1 alt1"><code class="cpp preprocessor">#include "banana.h"</code></div>
<div class="line number3 index2 alt2"><code class="cpp comments">// glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotVertices[0]);</code></div>
<div class="line number4 index3 alt1"><code class="cpp comments">// 改成</code></div>
<div class="line number5 index4 alt2"><code class="cpp plain">glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;bananaVerts[0]);</code></div>
<div class="line number6 index5 alt1"><code class="cpp comments">// glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotNormals[0]);</code></div>
<div class="line number7 index6 alt2"><code class="cpp comments">// 改成</code></div>
<div class="line number8 index7 alt1"><code class="cpp plain">glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;bananaNormals[0]);</code></div>
<div class="line number9 index8 alt2"><code class="cpp comments">// glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotTexCoords[0]);</code></div>
<div class="line number10 index9 alt1"><code class="cpp comments">// 改成</code></div>
<div class="line number11 index10 alt2"><code class="cpp plain">glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;bananaTexCoords[0]);</code></div>
<div class="line number12 index11 alt1"><code class="cpp comments">// glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*) &amp;teapotIndices[0]);</code></div>
<div class="line number13 index12 alt2"><code class="cpp comments">// 改成</code></div>
<div class="line number14 index13 alt1"><code class="cpp plain">glDrawArrays(GL_TRIANGLES, 0, cubeNumVerts);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p>9. 開啟 <strong><span style="color: #0000ff;">cmd</span> </strong>到 <span style="color: #ff0000;"><strong>jni</strong> </span>目錄下執行<strong><span style="color: #ff0000;"> ndk-build</span></strong>，沒有任何錯誤的話，重新整理專案後執行即可，上個範例我們把茶壺換成方塊，現在可以換成香蕉了。<br><a title="023.png" href="http://lh6.ggpht.com/-5f6IQkJnRls/VIe6DVSRRQI/AAAAAAAAKnE/5-FVuwLwDKk/s0/023.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="023.png" src="//lh6.ggpht.com/-5f6IQkJnRls/VIe6DVSRRQI/AAAAAAAAKnE/5-FVuwLwDKk/w500-o/023.png" alt="023.png" width="180" height="320"></a><br><a title="024.png" href="http://lh6.ggpht.com/-9kXLdrvwdKI/VIe6DTlRIBI/AAAAAAAAKnA/BKtUrGsLvOs/s0/024.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="024.png" src="//lh6.ggpht.com/-9kXLdrvwdKI/VIe6DTlRIBI/AAAAAAAAKnA/BKtUrGsLvOs/w500-o/024.png" alt="024.png" width="180" height="320"></a><br>經過這系列的文章，應該都可以把 Qualcomm Vuforia 運行起來，並且支援多重偵測，也有辦法自行把茶壺更換掉、更換貼圖、產出必須的 .h 檔案，下面貼幾張有趣的例子，這是網路上找到的免費 3D model，左上為模型的樣子-一間木屋，看到門開開的，走進去看看，右上為站在門口往裡看的樣子，左下是走進房子往天花板看的樣子，右下是從房子裡面往窗戶外面看的樣子，讓人不禁覺得 Qualcomm Vuforia 好強大啊！</p>
<p style="text-align: center;"><a title="019.png" href="http://lh6.ggpht.com/-ZJhSIoICKS4/VIbKKhRRLtI/AAAAAAAAKmY/40JY93-TkHk/s0/019.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="019.png" src="//lh6.ggpht.com/-ZJhSIoICKS4/VIbKKhRRLtI/AAAAAAAAKmY/40JY93-TkHk/w500-o/019.png" alt="019.png" width="180" height="320"></a>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a title="020.png" href="http://lh5.ggpht.com/-1dqBka8tCy4/VIbKKvx8iEI/AAAAAAAAKmU/Qp_vqYQsvCE/s0/020.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="020.png" src="//lh5.ggpht.com/-1dqBka8tCy4/VIbKKvx8iEI/AAAAAAAAKmU/Qp_vqYQsvCE/w500-o/020.png" alt="020.png" width="180" height="320"></a></p>
<p style="text-align: center;"><a title="021.png" href="http://lh3.ggpht.com/-BO2SPVEWOQE/VIbKKkECqyI/AAAAAAAAKmc/3d_RZO7Vh1k/s0/021.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="021.png" src="//lh3.ggpht.com/-BO2SPVEWOQE/VIbKKkECqyI/AAAAAAAAKmc/3d_RZO7Vh1k/w500-o/021.png" alt="021.png" width="180" height="320"></a>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a title="022.png" href="http://lh6.ggpht.com/-NqjMOdic-Gg/VIbKLxWUNmI/AAAAAAAAKmk/cxCcd-gHDpU/s0/022.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="alignnone pe2-photo" title="022.png" src="//lh6.ggpht.com/-NqjMOdic-Gg/VIbKLxWUNmI/AAAAAAAAKmk/cxCcd-gHDpU/w500-o/022.png" alt="022.png" width="180" height="320"></a></p>


<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li>obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES @ Heiko Behrens<br>http://heikobehrens.net/2009/08/27/obj2opengl/   (<mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">連結已失效</mark>)</li><li><a aria-label=" (在新分頁中開啟)" href="http://www.blender.org/" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">blender.org<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a aria-label=" (在新分頁中開啟)" href="https://zh.wikipedia.org/wiki/Blender" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Blender @ 維基百科<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a aria-label=" (在新分頁中開啟)" href="http://www.activestate.com/activeperl/downloads" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">ActivePerl Downloads<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&#062; .obj -&#062; .h</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</title>
		<link>https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/</link>
					<comments>https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 09 Dec 2014 09:54:17 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Teapot]]></category>
		<category><![CDATA[glDrawArrays]]></category>
		<category><![CDATA[ndk-build]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Qualcomm]]></category>
		<category><![CDATA[Vuforia]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3392</guid>

					<description><![CDATA[<p>前面的文章提到為什麼要用 Android NDK 來開發，既然已經有了 Android 版本替換茶壺的文章，這邊記錄 Android NDK 版本的替換茶壺。 2016-07-07 更新：本篇為 3.&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前面的文章提到為什麼要用 Android NDK 來開發，既然已經有了 Android 版本替換茶壺的文章，這邊記錄 Android NDK 版本的替換茶壺。</p>



<span id="more-3392"></span>



<p><strong>2016-07-07 更新：本篇為 3.x 版本，目前 Vuforia 以更新到 5.5.9，新版本使用方式請參考&nbsp;</strong></p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>


<p><span style="line-height: 1.5em;">使用 Android NDK 來做的好處在</span><a style="line-height: 1.5em;" title="Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">上一篇文章</a><span style="line-height: 1.5em;">已提過，C++ 在處理複雜模型上有不錯的表現，也不會出現 Java 宣告大小上限的問題，直接進入步驟。</span></p>
<p style="padding-left: 30px;">1. 下載範例檔案 &#8211; <a href="https://noter.tw/dn/cube.h" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">cube.h</a>、<a href="https://noter.tw/dn/cube.png" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">cube.png</a> (這個跟前面範例使用的是一樣的)</p>
<p style="padding-left: 30px;">2. 將範例檔案<span style="color: #0000ff;"><strong> cube.h</strong></span> 放到&nbsp;&nbsp;ImageTargetsNative 專案下的<strong><span style="color: #ff0000;"> jni 目錄</span></strong></p>
<p style="padding-left: 30px;">3. 將範例檔案 <span style="color: #0000ff;"><strong>cube.png</strong></span> 放到&nbsp;ImageTargetsNative 專案下的 <span style="color: #ff0000;"><strong>assets 目錄</strong></span></p>
<p style="padding-left: 30px;">4. 開啟&nbsp;ImageTargetsNative 專案下 jni 下的<span style="color: #0000ff;"><strong> ImageTargets.cpp</strong></span></p>
<div>
<div id="highlighter_118336" class="syntaxhighlighter  cpp">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">01</div>
<div class="line number2 index1 alt1">02</div>
<div class="line number3 index2 alt2">03</div>
<div class="line number4 index3 alt1">04</div>
<div class="line number5 index4 alt2">05</div>
<div class="line number6 index5 alt1">06</div>
<div class="line number7 index6 alt2">07</div>
<div class="line number8 index7 alt1">08</div>
<div class="line number9 index8 alt2">09</div>
<div class="line number10 index9 alt1">10</div>
<div class="line number11 index10 alt2">11</div>
<div class="line number12 index11 alt1">12</div>
<div class="line number13 index12 alt2">13</div>
<div class="line number14 index13 alt1">14</div>
<div class="line number15 index14 alt2">15</div>
<div class="line number16 index15 alt1">16</div>
<div class="line number17 index16 alt2">17</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="cpp comments">// 在上方加入</code></div>
<div class="line number2 index1 alt1"><code class="cpp preprocessor">#include "cube.h"</code></div>
<div class="line number3 index2 alt2"><code class="cpp comments">// static const float kObjectScale = 3.f;</code></div>
<div class="line number4 index3 alt1"><code class="cpp comments">// 改成</code></div>
<div class="line number5 index4 alt2"><code class="cpp keyword bold">static</code> <code class="cpp keyword bold">const</code> <code class="cpp color1 bold">float</code> <code class="cpp plain">kObjectScale = 120.f;</code></div>
<div class="line number6 index5 alt1"><code class="cpp comments">// glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotVertices[0]);</code></div>
<div class="line number7 index6 alt2"><code class="cpp comments">// 改成</code></div>
<div class="line number8 index7 alt1"><code class="cpp plain">glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;cubeVerts[0]);</code></div>
<div class="line number9 index8 alt2"><code class="cpp comments">// glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotNormals[0]);</code></div>
<div class="line number10 index9 alt1"><code class="cpp comments">// 改成</code></div>
<div class="line number11 index10 alt2"><code class="cpp plain">glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;cubeNormals[0]);</code></div>
<div class="line number12 index11 alt1"><code class="cpp comments">// glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*) &amp;teapotTexCoords[0]);</code></div>
<div class="line number13 index12 alt2"><code class="cpp comments">// 改成</code></div>
<div class="line number14 index13 alt1"><code class="cpp plain">glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (</code><code class="cpp keyword bold">const</code> <code class="cpp plain">GLvoid*) &amp;cubeTexCoords[0]);</code></div>
<div class="line number15 index14 alt2"><code class="cpp comments">// glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT, (const GLvoid*) &amp;teapotIndices[0]);</code></div>
<div class="line number16 index15 alt1"><code class="cpp comments">// 改成</code></div>
<div class="line number17 index16 alt2"><code class="cpp plain">glDrawArrays(GL_TRIANGLES, 0, cubeNumVerts);</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p style="padding-left: 30px;">5.&nbsp;開啟&nbsp;ImageTargetsNative 專案下 jni 下的<strong>&nbsp;<span style="color: #0000ff;">ImageTargets.java</span></strong></p>
<div>
<div id="highlighter_747441" class="syntaxhighlighter  java">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">1</div>
<div class="line number2 index1 alt1">2</div>
<div class="line number3 index2 alt2">3</div>
<div class="line number4 index3 alt1">4</div>
<div class="line number5 index4 alt2">5</div>
<div class="line number6 index5 alt1">6</div>
<div class="line number7 index6 alt2">7</div>
<div class="line number8 index7 alt1">8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2"><code class="java keyword">private</code> <code class="java keyword">void</code> <code class="java plain">loadTextures()</code></div>
<div class="line number2 index1 alt1"><code class="java plain">{</code></div>
<div class="line number3 index2 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java comments">//mTextures.add(Texture.loadTextureFromApk("TextureTeapotBrass.png", getAssets()));</code></div>
<div class="line number4 index3 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"TextureTeapotBlue.png"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number5 index4 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"cube.png"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number6 index5 alt1"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"TextureTeapotRed.png"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number7 index6 alt2"><code class="java spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="java plain">mTextures.add(Texture.loadTextureFromApk(</code><code class="java string">"Buildings.jpeg"</code><code class="java plain">, getAssets()));</code></div>
<div class="line number8 index7 alt1"><code class="java plain">}</code></div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<p style="padding-left: 30px;">6. 執行 <span style="color: #ff0000;"><strong>ndk-build</strong></span> (如果忘記可查看<a title="Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">上一篇文章</a>)，重新整理 Eclipse 專案後執行。下圖是 cube.h 透過 OpenGL 畫出來的模型，上方是 cube.png 當材質繪製出來的，下方是原本範例中茶壺的貼圖。<br><a title="018.png" href="http://lh4.ggpht.com/-BU2AtqHNgIQ/VIbD6BeJZ-I/AAAAAAAAKl0/kXuktzOsul0/s0/018.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="018.png" src="//lh4.ggpht.com/-BU2AtqHNgIQ/VIbD6BeJZ-I/AAAAAAAAKl0/kXuktzOsul0/w500-o/018.png" alt="018.png" width="180" height="320"></a></p>


<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</title>
		<link>https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/</link>
					<comments>https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/#comments</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 09 Dec 2014 09:10:57 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[ImageTarget]]></category>
		<category><![CDATA[java.lang.UnsatisfiedLinkError]]></category>
		<category><![CDATA[JNI]]></category>
		<category><![CDATA[multi]]></category>
		<category><![CDATA[The code of method xxx is exceeding the 65535 bytes limit]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[NDK]]></category>
		<category><![CDATA[QCAR]]></category>
		<category><![CDATA[Qualcomm]]></category>
		<category><![CDATA[Vuforia]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3371</guid>

					<description><![CDATA[<p>接續前幾篇教學，我們已經建置好 Vuforia 開發及執行環境、建立屬於自己的 Image Target、以及把茶壺更換成方塊&#160;，這邊繼續記錄怎麼使用 Android NDK 來開發，內文有&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>接續前幾篇教學，我們已經<strong>建置好 Vuforia 開發及執行環境</strong>、<strong>建立屬於自己的 Image Target</strong>、以及<strong>把茶壺更換成方塊</strong>&nbsp;，這邊繼續記錄怎麼使用 Android NDK 來開發，內文有說明為什麼好好的 Android 版本不用卻要用到麻煩的 Android NDK 開發。 </p>



<span id="more-3371"></span>



<p><strong>2016-07-07 更新：本篇為 3.x 版本，目前 Vuforia 以更新到 5.5.9，新版本使用方式請參考&nbsp;</strong></p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<p>馬上解除大家疑問，使用 Android NDK 開發絕對不是自找麻煩，而是小蛙搜遍的各式各樣的教學後得到的答案。</p>



<ul class="my-li bg-darkblue wp-block-list"><li>如果你的 APP 希望可以在一個畫面偵測到 1 個以上 Image Target 的話，Android 版本無法做到這項需求</li><li>如果你的 3D 模型不是只有正方形、長方形這樣簡單</li></ul>



<p>在 Android 版本無法解決上述兩個問題，因此才需要使用 Android NDK 的方式來開發。Android 版本中如果 3D 模型太複雜，在定義像&nbsp;Teapot.java 這種檔案的時候會出現「<strong>The code of method xxx is exceeding the 65535 bytes limit</strong>」錯誤，使用網路上的一些免費模型來測試都沒辦法。</p>



<p>Android NDK 的安裝方式在&nbsp;<a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1-%e5%ae%89%e8%a3%9d-vuforia/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a> 有提到 (只是下載以及設定 Eclipse Android NDK 目錄)，如果安裝 NDK 有遇到什麼問題，請自行 Google &#8230;</p>



<p>先說明 Android NDK 的使用方法，也許有更好的方法，但小蛙找到這種可用的方法就直接用囉！</p>



<p>1. 到 <a href="https://developer.vuforia.com//resources/sample-apps/image-targets-c?t=android-4820236" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">參1<span class="wpel-icon wpel-image wpel-icon-6"></span></a> 下載 NDK 版本的範例 &#8211; <a href="https://developer.vuforia.com//resources/sample-apps/image-targets-c?t=android-4820236#sampleAppModal" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">ImageTargetsNative-3-0-5.zip<span class="wpel-icon wpel-image wpel-icon-6"></span></a></p>



<p>2. 解壓縮檔案，並且依照  <a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1-%e5%ae%89%e8%a3%9d-vuforia/" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a> 提到的方法將專案匯入到 Eclipse，要這邊要注意路徑的問題，如果你的工作目錄有空白一定要避開，像小蛙本來在 Program Files 下，但執行 NDK 時會發生錯誤，因此改成放在 D:\vuforia-sdk-android-3-0-9\samples\ 下。</p>



<p>3. 先執行一次專案看看，發現點了 Start 就出現「<strong>java.lang.UnsatisfiedLinkError: Native method not found: com.qualcomm.QCARSamples.ImageTargets.ImageTargets.setActivityPortraitMode:(Z)V</strong>」錯誤 &#8230;</p>



<p>4. 我們先執行 NDK 編譯出新的 .so 檔案才能繼續使用，開啟「cmd」->以小蛙為例，進到「D:\vuforia-sdk-android-3-0-9\samples\ImageTargetsNative\jni>」，注意 Android.mk 檔案中已經設定了路徑，所以一定要放在 sample 目錄下，或如果對 NDK 熟悉的網友可直接修改</p>



<pre class="wp-block-preformatted withcode">Android.mk D:\vuforia-sdk-android-3-0-9\samples\ImageTargetsNative\jni> ndk-build 
[armeabi-v7a] Compile++ arm  : ImageTargetsNative &lt;= ImageTargets.cpp …  
[armeabi-v7a] Install        : libVuforia.so => libs/armeabi-v7a/libVuforia.so</pre>



<p>5. 整個過程如果沒有出現 Error 就表示編譯成功，回到 Eclipse 的 ImageTargetsNative 專案，重新整理專案後執行</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><a href="http://lh3.ggpht.com/-_WHT-WL9d7s/VIa3nGyAHiI/AAAAAAAAKlQ/np528SHrnpw/s0/016.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="//lh3.ggpht.com/-_WHT-WL9d7s/VIa3nGyAHiI/AAAAAAAAKlQ/np528SHrnpw/w500-o/016.png" alt="016.png" width="250" height="445" title="016.png"/></a></figure></div>



<p>6. 開啟被封印的能力，多重偵測！開啟 ImageTargetsNative > jni > ImageTargets.cpp，找到</p>



<pre class="wp-block-preformatted withcode">JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_onQCARInitializedNative(JNIEnv *, jobject)
 {
     …
 }</pre>



<p>把上述「…」部分改成以下內容</p>



<pre class="wp-block-preformatted withcode">// Comment in to enable tracking of up to 2 targets simultaneously and
 // split the work over multiple frames:
 QCAR::setHint(QCAR::HINT_MAX_SIMULTANEOUS_IMAGE_TARGETS, 2);
 // Register the update callback where we handle the data set swap:
 QCAR::registerCallback(&amp;updateCallback);</pre>



<p>7. 重複執行第 4 步驟，與第 5 步驟，多重偵測功能正式被開啟！</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><a href="http://lh5.ggpht.com/-ImbnYucZT3E/VIa7qUiRHEI/AAAAAAAAKlk/DpfAdo3ESvQ/s0/017.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="//lh5.ggpht.com/-ImbnYucZT3E/VIa7qUiRHEI/AAAAAAAAKlk/DpfAdo3ESvQ/w500-o/017.png" alt="017.png" width="250" height="445" title="017.png"/></a></figure></div>



<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>



<h2 class="para wp-block-heading">參考資料</h2>



<ul class="my-li bg-darkblue wp-block-list"><li><a rel="noreferrer noopener nofollow external" aria-label="Image Targets - C++ @ Vuforia Developer Portal (在新分頁中開啟)" href="https://developer.vuforia.com/resources/sample-apps/image-targets-c" target="_blank" data-wpel-link="external" class="wpel-icon-right">Image Targets &#8211; C++ @ Vuforia Developer Portal<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li><li><a href="https://developer.vuforia.com/resources/dev-guide/detecting-and-tracking-multiple-targets-simultaneously" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external" class="wpel-icon-right">Detecting and Tracking Multiple Targets Simultaneously&nbsp;@ Vuforia Developer Portal<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</title>
		<link>https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/</link>
					<comments>https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 09 Dec 2014 07:38:17 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[GLES20.glDrawArrays]]></category>
		<category><![CDATA[ImageTarget]]></category>
		<category><![CDATA[ImageTargetRenderer]]></category>
		<category><![CDATA[Teapot]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Qualcomm]]></category>
		<category><![CDATA[Vuforia]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3360</guid>

					<description><![CDATA[<p>接續上一篇&#160;Qualcomm Vuforia 教學 (2) – Create Image Target，這篇要來記錄怎麼把預設的茶壺 (Teapot) 換成簡單的正方形 (Cube)。 20&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>接續上一篇&nbsp;<a rel="noreferrer noopener" href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" target="_blank" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a>，這篇要來記錄怎麼把預設的茶壺 (Teapot) 換成簡單的正方形 (Cube)。 </p>



<span id="more-3360"></span>



<p><strong>2016-07-07 更新：本篇為 3.x 版本，目前 Vuforia 以更新到 5.5.9，新版本使用方式請參考</strong></p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>



<p>小蛙先提供兩個檔案下載，一個是 <strong>cube.png</strong> 用來當作等等要替換的材質貼圖，另一個是繼承 Vuforia SDK MeshObject 的 3D 模型物件 <strong>CubeTest2.java</strong>。點選下載 &#8211; <a href="https://noter.tw/dn/cube.png" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">cube.png</a>、<a href="https://noter.tw/dn/CubeTest2.java" target="_blank" rel="noreferrer noopener" data-wpel-link="internal">CubeTest2.java</a>。</p>



<p>在之後的文章會說明要怎麼產生出像 CubeTest2.java 這種檔案或裡面的一些模型資訊，這個範例就先直接套用下載下來的檔案。接著需要對 <strong>ImageTargetRender.java</strong>、<strong>ImageTarget.java</strong> 作一些修改。CubeTest2.java 內容可以大概看一下，重點只有在之後的修改會讓 <strong>mIndBuff </strong>都是空白 (小蛙找到的教學產生出來的檔案都沒有 Indices 資訊，這邊把 <strong>setIndices()</strong> 做了些修改，避免出現 NullPointerException 錯誤)。</p>



<p>正式開始。</p>



<p>1. 把下載來的<strong> cube.png</strong> 放到 <strong>VuforiaSample 專案下的 assets 目錄</strong>中 (在目錄中看到&nbsp;TextureTeapotBlue.png 這些就表示位置對了)</p>



<p>2. 把下載來的 <strong>CubeTest2.java</strong> 放在&nbsp;<strong>com.qualcomm.vuforia.samples.SampleApplication.utils package</strong> 下，同目錄可以看到 Teapot.java</p>



<p>3. 修改 <strong>com.qualcomm.vuforia.samples.VuforiaSamples.app.ImageTargets\ImageTarget.java</strong><br>找到&nbsp;<strong>loadTextures()</strong> 載入材質時，一併載入 cube.png</p>



<pre class="wp-block-preformatted withcode">private void loadTextures()
{
        //mTextures.add(Texture.loadTextureFromApk("TextureTeapotBrass.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk("TextureTeapotBlue.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk("cube.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk("TextureTeapotRed.png", getAssets()));
        mTextures.add(Texture.loadTextureFromApk("ImageTargets/Buildings.jpeg", getAssets()));
}</pre>



<p>4. 修改 <strong>com.qualcomm.vuforia.samples.VuforiaSamples.app.ImageTargets\ImageTargetRenderer.java</strong> ，這邊採用註解掉的方式，到時要復原比較方便</p>



<pre class="wp-block-preformatted withcode">// 註解掉 private Teapot mTeapot; 並加入
private CubeTest2 mTeapot;
// 注解掉 private static final float OBJECT_SCALE_FLOAT = 3.0f; 並加入
private static final float OBJECT_SCALE_FLOAT = 120.0f;
// 註解掉 mTeapot = new Teapot(); 並加入
mTeapot = new CubeTest2();
// 註解掉以下幾行
//GLES20.glDrawElements(GLES20.GL_TRIANGLES,
//                    mTeapot.getNumObjectIndex(), GLES20.GL_UNSIGNED_SHORT,
//                    mTeapot.getIndices());
// 並加入
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, mTeapot.getNumObjectVertex());</pre>



<div class="wp-block-image"><figure class="aligncenter is-resized"><a href="http://lh4.ggpht.com/-iKUnFBtOnm8/VIalvTvAt_I/AAAAAAAAKk4/GNUCcmo3-j4/s0/Screenshot_2014-12-09-14-50-29.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" src="//lh4.ggpht.com/-iKUnFBtOnm8/VIalvTvAt_I/AAAAAAAAKk4/GNUCcmo3-j4/w500-o/Screenshot_2014-12-09-14-50-29.png" alt="Screenshot_2014-12-09-14-50-29.png" width="250" height="445" title="Screenshot_2014-12-09-14-50-29.png"/></a></figure></div>



<p>5. 執行專案，就可以看到茶壺被取代掉了，變成一個方形，並且貼上了 cube.png 這張圖的表面，至於上下為什麼黑黑的，這跟 3D 塑模時的打光以及環境光源有關，這裡就不討論了。</p>



<p>也許有更好的做法，但網路上大多找到的教學都是以<strong> Unity Extension </strong>為主，以 Android 為主的較少，所以如果有更好的方法，也歡迎提供給小蛙！感恩！</p>



<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qualcomm Vuforia 教學 (2) &#8211; Create Image Target</title>
		<link>https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/</link>
					<comments>https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/#respond</comments>
		
		<dc:creator><![CDATA[黃小蛙]]></dc:creator>
		<pubDate>Tue, 09 Dec 2014 04:17:40 +0000</pubDate>
				<category><![CDATA[手機 App]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[AR]]></category>
		<category><![CDATA[Qualcomm]]></category>
		<category><![CDATA[Vuforia]]></category>
		<category><![CDATA[Image Target]]></category>
		<category><![CDATA[Target Manager]]></category>
		<guid isPermaLink="false">http://wazai.net/?p=3347</guid>

					<description><![CDATA[<p>接續上篇&#160;Qualcomm Vuforia 教學 (1) – 安裝 Vuforia 建置好 Vuforia 環境後，這邊繼續記錄怎麼建立一個 Image Target (目標影像)，來取代原&#46;&#46;&#46;</p>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) &#8211; Create Image Target</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<p>接續上篇&nbsp;<strong><a rel="noreferrer noopener" aria-label=" (在新分頁中開啟)" href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" target="_blank" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></strong> 建置好 Vuforia 環境後，這邊繼續記錄怎麼建立一個 <strong>Image Target</strong> (目標影像)，來取代原本的石頭跟木屑的 Image Target。 </p>



<span id="more-3347"></span>



<p><strong>2016-07-07 更新：本篇為 3.x 版本，目前 Vuforia 以更新到 5.5.9，新版本使用方式請參考&nbsp;</strong></p>



<p><strong>Android Vuforia 系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3639/android-vuforia-with-jpct-ae-1-%e5%9f%ba%e6%9c%ac%e7%af%84%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (1) – 基本範例</a></li><li><a href="https://noter.tw/3688/android-vuforia-with-jpct-ae-2-%e8%bc%89%e5%85%a5-obj-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (2) – 載入 obj 測試</a></li><li><a href="https://noter.tw/3735/android-vuforia-with-jpct-ae-3-%e8%bc%89%e5%85%a5-md2-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (3) – 載入 md2 測試</a></li><li><a href="https://noter.tw/3737/android-vuforia-with-jpct-ae-4-%e8%bc%89%e5%85%a5-3ds-%e6%b8%ac%e8%a9%a6/" data-wpel-link="internal">Android Vuforia with jPCT-AE (4) – 載入 3DS 測試</a></li><li><a href="https://noter.tw/3739/android-vuforia-with-jpct-ae-5-%e5%a4%9a%e9%87%8d%e6%a8%a1%e5%9e%8b%e8%bc%89%e5%85%a5%ef%bc%8c%e4%bb%a5-obj-%e7%82%ba%e4%be%8b/" data-wpel-link="internal">Android Vuforia with jPCT-AE (5) – 多重模型載入，以 obj 為例</a></li></ul>


<p>Qualcomm Vuforia 使用 Image Target 的方式有三種：</p>
<ol>
<li>透過 <strong>device database</strong> (100 個影像內)</li>
<li>使用 <strong>cloud recognition database</strong> (1000 個影像與成功辨識內免費)</li>
<li>執行期間透過選取相機畫面，<strong>動態新增</strong>至 device database</li>
</ol>
<p>這篇小蛙要記錄透過 Target&nbsp;Manager 建立 Image Target 後，使用上述第一種 device database 的方式測試。<br>Vuforia 官網上有非常多關於怎樣讓影像特徵 (features) 更顯著的方法，不過小蛙很懶沒有認真看，以下隨意列出之前的筆記</p>
<pre>1. 使用者可以上傳 RGB 以及灰階的 JPG 或 PNG，同時大小小於 2MB
2. 程式執行期間， Vuforia SDK 最高可以同時偵測到五個 target，效能部分取決於 CPU loading 以及 GPU
3. 提高對比度可以增強 feature 被擷取
4. 避免重複出現的圖案
5. sharp, spiked, chiseled(輪廓分明) 能被取出 feature，
   例如：正方形有 4 個 feature、圓形沒有 ... 等</pre>
<p>上面是小蛙隨意記錄，也許可能認知上有些問題，有興趣可以直接去查看官網，或是當一張圖的辨識度太低時，再來回頭找解決方法。現在開始建立 Image Target 步驟。</p>
<p style="padding-left: 30px;">&nbsp;1. 到 https://developer.vuforia.com/target-manager ，登入後點選 <span style="color: #ff0000;"><strong>Create Database</strong></span><br><a title="005.png" href="http://lh5.ggpht.com/-b2Pf1hRVpfo/VIZrndipwKI/AAAAAAAAKjY/NAEh7WCnBF4/s0/005.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="005.png" src="//lh5.ggpht.com/-b2Pf1hRVpfo/VIZrndipwKI/AAAAAAAAKjY/NAEh7WCnBF4/w500-o/005.png" alt="005.png"></a></p>
<p></p>
<p style="padding-left: 30px;">2.&nbsp;輸入資料庫的名字，這邊小蛙用 wazai 當測試<br><a title="006.png" href="http://lh6.ggpht.com/-4CydIEDTdnw/VIZrnXMi1CI/AAAAAAAAKkY/aMO4GqXgVns/s0/006.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="006.png" src="//lh6.ggpht.com/-4CydIEDTdnw/VIZrnXMi1CI/AAAAAAAAKkY/aMO4GqXgVns/w500-o/006.png" alt="006.png"></a></p>
<p></p>
<p style="padding-left: 30px;">3.&nbsp;建立完成後可以看到下圖，接著點選右上角的 <span style="color: #ff0000;"><strong>Add Target</strong></span> 開始建立目標影像<br><a title="007.png" href="http://lh3.ggpht.com/-PZwo758Gb5g/VIZrnRkrehI/AAAAAAAAKjc/muDI3rY6oao/s0/007.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="007.png" src="//lh3.ggpht.com/-PZwo758Gb5g/VIZrnRkrehI/AAAAAAAAKjc/muDI3rY6oao/w500-o/007.png" alt="007.png"></a></p>
<p></p>
<p style="padding-left: 30px;">4.&nbsp;分別輸入 <span style="color: #0000ff;"><strong>Target Name (目標名稱)</strong></span>、<span style="color: #0000ff;"><strong>Target Type (目標類型)</strong></span>、<span style="color: #0000ff;"><strong>Target Dimension (目標維度)</strong></span>、<span style="color: #0000ff;"><strong>Target Image File (目標影像檔)</strong></span>，如下圖依照自己的需求輸入或建立 (這邊小蛙還不太清楚 Target Dimension 要怎麼設定，先隨便設定 500，這跟你的 3D model 大小有關)<br><a title="009.png" href="http://lh3.ggpht.com/-nmnOj7-u-RI/VIZrodtzhaI/AAAAAAAAKjk/FTsW3wNJwtY/s0/009.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="009.png" src="//lh3.ggpht.com/-nmnOj7-u-RI/VIZrodtzhaI/AAAAAAAAKjk/FTsW3wNJwtY/w500-o/009.png" alt="009.png"></a></p>
<p></p>
<p style="padding-left: 30px;">5.&nbsp;建立完成後可以看到剛剛建立的資訊<br><a title="010.png" href="http://lh3.ggpht.com/-H6609P260TQ/VIZro6BpBcI/AAAAAAAAKjs/7L955x_JQL0/s0/010.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="010.png" src="//lh3.ggpht.com/-H6609P260TQ/VIZro6BpBcI/AAAAAAAAKjs/7L955x_JQL0/w500-o/010.png" alt="010.png"></a>&nbsp; &nbsp;&nbsp; <a title="011.png" href="http://lh4.ggpht.com/-BsrPqCQVTVM/VIZrpLeJJrI/AAAAAAAAKj4/ZU-laSW3Dhs/s0/011.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="011.png" src="//lh4.ggpht.com/-BsrPqCQVTVM/VIZrpLeJJrI/AAAAAAAAKj4/ZU-laSW3Dhs/w500-o/011.png" alt="011.png"></a></p>
<p></p>
<p style="padding-left: 30px;">6.&nbsp;下載剛剛建立的資料庫，這邊有一個限制是最大目標下載只能 100 個，點選「<span style="color: #ff0000;"><strong>Download Selected Targets</strong></span>」<br><a title="012.png" href="http://lh6.ggpht.com/-RmeZFptKfUY/VIZrphnNDLI/AAAAAAAAKkU/DeYbWJGr26c/s0/012.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="012.png" src="//lh6.ggpht.com/-RmeZFptKfUY/VIZrphnNDLI/AAAAAAAAKkU/DeYbWJGr26c/w500-o/012.png" alt="012.png"></a></p>
<p></p>
<p style="padding-left: 30px;">7.&nbsp;依照需求選擇，小蛙使用 Eclipse 做測試，因此選擇 <span style="color: #ff0000;"><strong>SDK (Eclipse, Ant, Xcode, ect.)</strong></span> 這個<br><a title="013.png" href="http://lh3.ggpht.com/-W_fWrFsI2zU/VIZrqHqYimI/AAAAAAAAKkI/zHCieGpBI6M/s0/013.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="013.png" src="//lh3.ggpht.com/-W_fWrFsI2zU/VIZrqHqYimI/AAAAAAAAKkI/zHCieGpBI6M/w500-o/013.png" alt="013.png"></a></p>
<p></p>
<p style="padding-left: 30px;">8.&nbsp;解壓縮 wazai.zip 可以得到<span style="color: #ff0000;"><strong> wazai.dat</strong></span> 與 <span style="color: #ff0000;"><strong>wazai.xml</strong> </span>兩個檔案，把這兩個檔案放在 Eclipse VuforiaSample 專案下的 <span style="color: #ff0000;"><strong>assets</strong> </span>目錄，在這個資料夾下，還會看到 <span style="color: #0000ff;"><strong>StonesAndChips.dat</strong>, <strong>StonesAndChips.xml</strong>, <strong>Tarmac.dat</strong>, <strong>Tarmac.xml</strong></span> (有看到他們擺一起就對了)</p>
<p style="padding-left: 30px;">9.&nbsp;接著從 Eclipse 編輯 <span style="color: #ff0000;"><strong>com.qualcomm.vuforia.samples.VuforiaSamples.app.ImageTargets/ImageTargets.java</strong></span>，搜尋<span style="color: #0000ff;"><strong> .xml</strong> </span>(大約在 105 與 106 行左右)。小蛙把 mDatasetStrings.add(&#8220;StonesAndChips.xml&#8221;); 註解掉，並且加入剛剛的設定檔</p>
<pre>    //mDatasetStrings.add("StonesAndChips.xml");
    mDatasetStrings.add("wazai.xml");
    mDatasetStrings.add("Tarmac.xml");</pre>
<p style="padding-left: 30px;">10.&nbsp;這時候 238 行左右 <span style="color: #ff0000;"><strong>((Switch) mFlashOptionView).setChecked(false);</strong></span> 會報錯誤，加上 <span style="color: #0000ff;"><strong>@SuppressLint</strong></span> 就可以了<br><a title="014.png" href="http://lh6.ggpht.com/-thbS40Z1fEI/VIZrqsx9WiI/AAAAAAAAKkQ/srXh2RojWcI/s0/014.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="014.png" src="//lh6.ggpht.com/-thbS40Z1fEI/VIZrqsx9WiI/AAAAAAAAKkQ/srXh2RojWcI/w500-o/014.png" alt="014.png"></a></p>
<p></p>
<p style="padding-left: 30px;">11.&nbsp;執行專案，可以發現剛剛的石頭跟木屑的 ImageTarget 已經不會出現茶壺了，試看看剛剛建立的 dog 的 ImageTarget，茶壺是不是在上面呢? 這個茶壺的大小跟剛剛設定的 <span style="color: #0000ff;"><strong>Target Dimension</strong></span> 有關。<br><a title="015.png" href="http://lh6.ggpht.com/-tlsj4Mf4ies/VIZrq-noZlI/AAAAAAAAKkk/qWU5H3R6mnE/s0/015.png" target="_blank" rel="noopener nofollow external noreferrer" data-wpel-link="external"><img decoding="async" class="pe2-photo aligncenter" title="015.png" src="//lh6.ggpht.com/-tlsj4Mf4ies/VIZrq-noZlI/AAAAAAAAKkk/qWU5H3R6mnE/w500-o/015.png" alt="015.png" width="180" height="320"></a></p>
<p style="padding-left: 30px;">12. 附帶一提，如果是要更換不同顏色的茶壺，可以在<span style="color: #ff0000;"><strong> ImageTarget.java</strong></span> 中的<span style="color: #0000ff;"><strong> loadTextures()</strong> </span>中，加入或修改自己需要的材質，並搭配<span style="color: #ff0000;"><strong> ImageTargetRender.java</strong> </span>來做設定的動作，這邊不細說明了，試著把 loadTextures() 中的<span style="color: #0000ff;"><strong> TextureTeapotBrass.png, TextureTeapotBlue.png, TextureTeapotRed.png</strong></span> 調換順序，就可以看到原本的茶壺顏色交換了。</p>
<p>到這邊我們已經可以把 Vuforia 的範例跑起來，並且建立一個屬於自己的 Image Target，讓 VuforiaSample 可以辨識並且出現茶壺(?!)，第 12 步驟雖然沒有詳細說明，不過照著做可以讓茶壺的顏色交換，Vuforia 系列文章目錄如下：</p>


<p><strong>Qualcomm Vuforia&nbsp;</strong><strong>系列：</strong></p>



<ul class="my-li bg-darkblue wp-block-list"><li><a href="https://noter.tw/3320/qualcomm-vuforia-%e6%95%99%e5%ad%b8-1/" data-wpel-link="internal">Qualcomm Vuforia 教學 (1) – 安裝 Vuforia</a></li><li><a href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) – Create Image Target</a></li><li><a href="https://noter.tw/3360/qualcomm-vuforia-%e6%95%99%e5%ad%b8-3-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (3) – 替換茶壺 – Android 版本</a></li><li><a href="https://noter.tw/3371/qualcomm-vuforia-%e6%95%99%e5%ad%b8-4-%e4%bd%bf%e7%94%a8-android-ndk-%e7%89%88%e6%9c%ac%e4%b8%a6%e9%96%8b%e5%95%9f%e5%a4%9a%e9%87%8d%e5%81%b5%e6%b8%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (4) – 使用 Android NDK 版本並開啟多重偵測</a></li><li><a href="https://noter.tw/3392/qualcomm-vuforia-%e6%95%99%e5%ad%b8-5-%e6%9b%bf%e6%8f%9b%e8%8c%b6%e5%a3%ba-android-jni-%e7%89%88%e6%9c%ac/" data-wpel-link="internal">Qualcomm Vuforia 教學 (5) – 替換茶壺 – Android JNI 版本</a></li><li><a href="https://noter.tw/3403/qualcomm-vuforia-%e6%95%99%e5%ad%b8-6-3d-model-obj-h/" data-wpel-link="internal">Qualcomm Vuforia 教學 (6) – 3D model -&gt; .obj -&gt; .h</a></li></ul>
<p>這篇文章 <a rel="nofollow" href="https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/" data-wpel-link="internal">Qualcomm Vuforia 教學 (2) &#8211; Create Image Target</a> 最早出現於 <a rel="nofollow" href="https://noter.tw" data-wpel-link="internal">記下來</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://noter.tw/3347/qualcomm-vuforia-%e6%95%99%e5%ad%b8-2-create-image-target/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
